<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Программирование на языке MFC &#187; Приложения</title>
	<atom:link href="http://www.programmfc.ru/category/prilozheniya/feed" rel="self" type="application/rss+xml" />
	<link>http://www.programmfc.ru</link>
	<description>Мой второй блог в серии программирования</description>
	<lastBuildDate>Mon, 08 Feb 2010 19:34:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Обработчик команды ID__FILE__OPEN</title>
		<link>http://www.programmfc.ru/uncategorized/%d0%be%d0%b1%d1%80%d0%b0%d0%b1%d0%be%d1%82%d1%87%d0%b8%d0%ba-%d0%ba%d0%be%d0%bc%d0%b0%d0%bd%d0%b4%d1%8b-id__file__open.html</link>
		<comments>http://www.programmfc.ru/uncategorized/%d0%be%d0%b1%d1%80%d0%b0%d0%b1%d0%be%d1%82%d1%87%d0%b8%d0%ba-%d0%ba%d0%be%d0%bc%d0%b0%d0%bd%d0%b4%d1%8b-id__file__open.html#comments</comments>
		<pubDate>Mon, 08 Feb 2010 19:32:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Первая программа на MFC]]></category>
		<category><![CDATA[Приложения]]></category>
		<category><![CDATA[CWinApp]]></category>
		<category><![CDATA[OnFileOpen]]></category>

		<guid isPermaLink="false">http://www.programmfc.ru/uncategorized/%d0%be%d0%b1%d1%80%d0%b0%d0%b1%d0%be%d1%82%d1%87%d0%b8%d0%ba-%d0%ba%d0%be%d0%bc%d0%b0%d0%bd%d0%b4%d1%8b-id__file__open.html</guid>
		<description><![CDATA[Я начал реализовывать этот план и какое-то время работал в этом направлении. Однако достаточно быстро я одумался и за­дал себе один вопрос: а почему, собственно говоря, мне приходит­ся делать всю черновую работу самому? Исходя из того, что я чи­тал про MFC ранее, все должно быть намного проще. Если я иду в правильном направлении, то почему [...]]]></description>
			<content:encoded><![CDATA[<p>Я начал реализовывать этот план и какое-то время работал в этом направлении. Однако достаточно быстро я одумался и за­дал себе один вопрос: а почему, собственно говоря, мне приходит­ся делать всю черновую работу самому? Исходя из того, что я чи­тал про MFC ранее, все должно быть намного проще. Если я иду в правильном направлении, то почему мне приходится делать все самому вручную? Где же хваленые возможности MFC? Все же, на­верное, я чего-то не понимаю. И здесь мне пришла в голову мысль, результатом которой и явилось правильное решение. А не попро­бовать ли мне возложить обработку открытия файла на MFC? Ведь не зря же у класса CWinApp есть метод OnFileOpenQ, не так ли? Карту сообщений своего объекта приложения я немного изменил. Теперь обработчик команды ID__FILE__OPEN стал выглядеть сле­дующим образом:</p>
<p><b>ON_COMMAND( ID_FILE_OPEN, CWinApp::OnFileOpen )</b></p>
<p>Тем самым обработку открытия файла я возложил на MFC. Мне осталось только понять, к чему это приведет&#8230;</p>
<p>Программа откомпилировалась без ошибок, что меня, честно говоря, несколько удивило. Однако, когда я запустил программу на выполнение в отладочном режиме, то, выбрав элемент «Ореп» меню «File», я получил сообщение, которое приведено на.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programmfc.ru/uncategorized/%d0%be%d0%b1%d1%80%d0%b0%d0%b1%d0%be%d1%82%d1%87%d0%b8%d0%ba-%d0%ba%d0%be%d0%bc%d0%b0%d0%bd%d0%b4%d1%8b-id__file__open.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Характерная особенность</title>
		<link>http://www.programmfc.ru/uncategorized/%d1%85%d0%b0%d1%80%d0%b0%d0%ba%d1%82%d0%b5%d1%80%d0%bd%d0%b0%d1%8f-%d0%be%d1%81%d0%be%d0%b1%d0%b5%d0%bd%d0%bd%d0%be%d1%81%d1%82%d1%8c.html</link>
		<comments>http://www.programmfc.ru/uncategorized/%d1%85%d0%b0%d1%80%d0%b0%d0%ba%d1%82%d0%b5%d1%80%d0%bd%d0%b0%d1%8f-%d0%be%d1%81%d0%be%d0%b1%d0%b5%d0%bd%d0%bd%d0%be%d1%81%d1%82%d1%8c.html#comments</comments>
		<pubDate>Mon, 08 Feb 2010 19:32:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Первая программа на MFC]]></category>
		<category><![CDATA[Приложения]]></category>

		<guid isPermaLink="false">http://www.programmfc.ru/uncategorized/%d1%85%d0%b0%d1%80%d0%b0%d0%ba%d1%82%d0%b5%d1%80%d0%bd%d0%b0%d1%8f-%d0%be%d1%81%d0%be%d0%b1%d0%b5%d0%bd%d0%bd%d0%be%d1%81%d1%82%d1%8c.html</guid>
		<description><![CDATA[Характерной особенностью этой программы является то, что она практически ничего не делает. Я написал этот вариант только для того, чтобы посмотреть, как MFC будет реагировать на открытие файла и т.д. Но, с другой стороны, обратите внимание на то, что обработку открытия файла я, тем не менее, возложил на основ­ное окно приложения. Этот факт привел к [...]]]></description>
			<content:encoded><![CDATA[<p>Характерной особенностью этой программы является то, что она практически ничего не делает. Я написал этот вариант только для того, чтобы посмотреть, как MFC будет реагировать на открытие файла и т.д. Но, с другой стороны, обратите внимание на то, что обработку открытия файла я, тем не менее, возложил на основ­ное окно приложения. Этот факт привел к тому, что было потеряно достаточно много времени. Тем не менее, это вынудило меня хо­рошенько пораскинуть мозгами, и в конце концов эти размышле­ния привели меня к правильному решению.</p>
<p>Я старался рассуждать логически. Я хочу отобразить содержи­мое файла. При этом хочу сделать это в соответствии с требова­ниями архитектуры «документ/представление». Но у меня нет яс­ности по многим вопросам. Когда, в какой момент файл на диске должен превратиться в документ? Наверное, в момент открытия файла. Другими словами, при обработке команды на открытие файла, полученной от меню, я должен открыть файл и превратить его в документ. Но какой файл надо открыть? Естественно, тот файл, который я укажу. Где укажу? Конечно же, в стандартном диа­логовом окне для выбора открываемого файла! Значит, мне необ­ходимо первым делом подготовить данные для открытия стандарт­ного диалога. После того как я выберу файл, мне необходимо бу­дет его открыть, разобрать по косточкам и каким-то образом со­держимое файла превратить в документ&#8230; Н-да, работы непоча­тый край&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programmfc.ru/uncategorized/%d1%85%d0%b0%d1%80%d0%b0%d0%ba%d1%82%d0%b5%d1%80%d0%bd%d0%b0%d1%8f-%d0%be%d1%81%d0%be%d0%b1%d0%b5%d0%bd%d0%bd%d0%be%d1%81%d1%82%d1%8c.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Текст программы</title>
		<link>http://www.programmfc.ru/uncategorized/%d1%82%d0%b5%d0%ba%d1%81%d1%82-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d1%8b.html</link>
		<comments>http://www.programmfc.ru/uncategorized/%d1%82%d0%b5%d0%ba%d1%81%d1%82-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d1%8b.html#comments</comments>
		<pubDate>Mon, 08 Feb 2010 19:32:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Первая программа на MFC]]></category>
		<category><![CDATA[Приложения]]></category>
		<category><![CDATA[CWinApp]]></category>
		<category><![CDATA[OnFileOpen]]></category>

		<guid isPermaLink="false">http://www.programmfc.ru/uncategorized/%d1%82%d0%b5%d0%ba%d1%81%d1%82-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d1%8b.html</guid>
		<description><![CDATA[А теперь текст непосредственно программы:
#include &#34;stdafx.h&#34;
// Объявляем класс приложения, его поля и методы.
class CDocViewlApp : public CWinApp
{
public:
CDocViewlApp () ; :* protected:
afx_msg void OnFileOpen(); virtual BOOL Initlnstance (); DEC LARE_ME S S AG E_MA P()
};
CDocViewlApp::CDocViewlApp()
{
}
void CDocViewlApp::OnFileOpen()
{
}
class CMainFrame : public CMDIFrameWnd {
DECLARE_DYNAMIC( CMainFrame ); public:
CMainFrame () ; «&#8217;
};
IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
CMainFrame::CMainFrame()
{
}
BOOL CDocViewlApp::Initlnstance() {
#ifdef _AFXDLL
Enable3dControls() ; #else
Enable3dControlsStatic(); #endif
CMainFrame* pMainFrame = [...]]]></description>
			<content:encoded><![CDATA[<p>А теперь текст непосредственно программы:</p>
<p><b>#include &quot;stdafx.h&quot;</b></p>
<p><b>// Объявляем класс приложения, его поля и методы.</b></p>
<p><b>class CDocViewlApp : public CWinApp</b></p>
<p>{</p>
<p><b>public:</b></p>
<p><b>CDocViewlApp () ; <sup>:</sup>* protected:</b></p>
<p><b>afx_msg void OnFileOpen(); virtual BOOL Initlnstance (); DEC LARE_ME S S AG E_MA P()</b></p>
<p><b>};</b></p>
<p><b>CDocViewlApp::CDocViewlApp()</b></p>
<p>{</p>
<p>}</p>
<p><b>void CDocViewlApp::OnFileOpen()</b></p>
<p>{</p>
<p><b>}</b></p>
<p><b>class CMainFrame : public CMDIFrameWnd {</b></p>
<p><b>DECLARE_DYNAMIC( CMainFrame ); public:</b></p>
<p><b>CMainFrame () ;</b> <b>«&#8217;</b></p>
<p><b>};</b></p>
<p><b>IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)</b></p>
<p><b>CMainFrame::CMainFrame()</b></p>
<p>{</p>
<p><b>}</b></p>
<p><b>BOOL CDocViewlApp::Initlnstance() {</b></p>
<p><b>#ifdef _AFXDLL</b></p>
<p><b>Enable3dControls() ; #else</b></p>
<p><b>Enable3dControlsStatic(); #endif</b></p>
<p><b>CMainFrame* pMainFrame = new CMainFrame; pMainFrame-&gt;LoadFrame( IDR_RESOURCE ); m_pMainWnd = pMainFrame; pMainFrame-&gt;ShowWindow(m_nCmdShow ); pMainFrame-&gt;UpdateWindow();</b></p>
<p><b>return TRUE;</b></p>
<p><b>}</b></p>
<p><b>BEGIN_MESSAGE_MAP( CDocViewlApp, CWinApp )</b></p>
<p><b>ON_COMMAND( ID_FILE_OPEN, OnFileOpen ) END_MESSAGE_MAP()</b></p>
<p><b>CDocViewlApp theApp;</b></p>
]]></content:encoded>
			<wfw:commentRss>http://www.programmfc.ru/uncategorized/%d1%82%d0%b5%d0%ba%d1%81%d1%82-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d1%8b.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Путь к документу</title>
		<link>http://www.programmfc.ru/uncategorized/%d0%bf%d1%83%d1%82%d1%8c-%d0%ba-%d0%b4%d0%be%d0%ba%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d1%83.html</link>
		<comments>http://www.programmfc.ru/uncategorized/%d0%bf%d1%83%d1%82%d1%8c-%d0%ba-%d0%b4%d0%be%d0%ba%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d1%83.html#comments</comments>
		<pubDate>Mon, 08 Feb 2010 19:31:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Первая программа на MFC]]></category>
		<category><![CDATA[Приложения]]></category>

		<guid isPermaLink="false">http://www.programmfc.ru/uncategorized/%d0%bf%d1%83%d1%82%d1%8c-%d0%ba-%d0%b4%d0%be%d0%ba%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d1%83.html</guid>
		<description><![CDATA[С чего я начал? Написал небольшую программу, при помощи которой хотел всего-навсего выяснить характер взаимодействия объектов раз­ных классов при работе в соответствии с идеологией архитектурой «документ/представление». Эта программа не должна делать ниче­го, кроме отображения пустого документа в (естественно!) пустом окне отображения. Впоследствии я планировал использовать текст этой программы как заготовку для других программ.
Ниже приведен текст [...]]]></description>
			<content:encoded><![CDATA[<p>С чего я начал? Написал небольшую программу, при помощи которой хотел всего-навсего выяснить характер взаимодействия объектов раз­ных классов при работе в соответствии с идеологией архитектурой «документ/представление». Эта программа не должна делать ниче­го, кроме отображения пустого документа в (естественно!) пустом окне отображения. Впоследствии я планировал использовать текст этой программы как заготовку для других программ.</p>
<p>Ниже приведен текст файла ресурсов моей программы. Ком­ментарии, созданные средой Visual С++, я предварительно удалил.</p>
<p><b>#include &quot;resource.h&quot;</b></p>
<p><b>#define APSTUDIO_READONLY_SYMBOLS</b></p>
<p><b>#include &quot;afxres.h&quot;</b></p>
<p><b>#undef APSTUDIO_READONLY_SYMBOLS</b></p>
<p><b>#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)</b></p>
<p><b>#ifdef _WIN32</b></p>
<p><b>LANGUAGE LAN G__RU SSI AN, SUBLANG_DE FAULT #pragma code_page(1251) #endif //_WIN32</b></p>
<p><b>#ifdef APSTUDIO_INVOKED</b></p>
<p><b>1</b> <b>TEXTINCLUDE DISCARDABLE BEGIN</b></p>
<p><b>&quot;resource. h\0&quot;</b></p>
<p><b>END</b></p>
<p><b>2</b> <b>TEXTINCLUDE DISCARDABLE . BEGIN</b></p>
<p><b>&quot;#include <sup>xw</sup>&#8216;afxres.h&quot;&quot;\r\n&quot; &quot;\0&quot;</b></p>
<p><b>END</b></p>
<p><b>3</b> <b>TEXTINCLUDE DISCARDABLE BEGIN</b></p>
<p><b>&quot;\r\n&quot; &quot;\0&quot;</b></p>
<p><b>END</b></p>
<p><b>#endif // APSTUDIO_INVOKED</b></p>
<p><b>IDR_RESOURCE</b> <b>ICON DISCARDABLE &quot;ResWCommon.ico&quot;</b></p>
<p><b>IDR_RESOURCE MENU DISCARDABLE BEGIN</b></p>
<p><b>ID_FILE_OPEN ID APP EXIT</b></p>
<p><b>POPUP &quot;&amp;File&quot;</b></p>
<p><b>BEGIN</b></p>
<p><b>MENUI</b><b>ТЕМ</b><b> &quot;&amp;Open\tCtrl+0&quot;, MENUI</b><b>ТЕМ</b><b> SEPARATOR MENUI</b><b>ТЕМ</b><b> &quot;E&amp;xit\tCtrl+x&quot;,</b></p>
<p><b>END</b></p>
<p><b>POPUP &quot;SWindow&quot;, GRAYED BEGIN</b></p>
<p><b>MENUITEM &quot;Tile &amp;horizontally\tCtrl+H&quot;, ID_WINDOW_TILEHORZ, GRAYED</b></p>
<p><b>MENUITEM &quot;Tile &amp;vertically\tCtrl+V&quot;, ID_WINDOW_TILE_VERT, GRAYED</b></p>
<p><b>MENUI</b><b>ТЕМ</b><b> &quot;&amp;Cascade\tCtrl+C&quot;, ID_WINDOW_CASCADE</b></p>
<p><b>END</b></p>
<p><b>POPUP &quot;Help&quot; BEGIN</b></p>
<p><b>MENUI</b><b>ТЕМ</b><b> &quot;&amp;About&quot;,</b> <b>ID_APP_ABOUT</b></p>
<p><b>END</b></p>
<p><b>END</b></p>
<p><b>STRINGTABLE DISCARDABLE BEGIN</b></p>
<p><b>ID_FILE_OPEN</b> <b>&quot;Open an existing document&quot;</b></p>
<p><b>END</b></p>
<p><b>&quot;Display program information, version number and copyright&quot; &quot;Quit the application&quot;</b></p>
<p><b>STRINGTABLE DISCARDABLE BEGIN</b></p>
<p><b>ID_APP_ABOUT</b></p>
<p><b>ID_APP_EXIT</b></p>
<p><b>END</b></p>
<p><b>STRINGTABLE DISCARDABLE BEGIN</b></p>
<p><b>IDR_RESOURCE</b> <b>&quot;PE-file viewer and disassembler&quot;</b></p>
<p><b>END</b></p>
]]></content:encoded>
			<wfw:commentRss>http://www.programmfc.ru/uncategorized/%d0%bf%d1%83%d1%82%d1%8c-%d0%ba-%d0%b4%d0%be%d0%ba%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d1%83.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Метод Abort</title>
		<link>http://www.programmfc.ru/uncategorized/%d0%bc%d0%b5%d1%82%d0%be%d0%b4-abort-2.html</link>
		<comments>http://www.programmfc.ru/uncategorized/%d0%bc%d0%b5%d1%82%d0%be%d0%b4-abort-2.html#comments</comments>
		<pubDate>Mon, 08 Feb 2010 19:31:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Первая программа на MFC]]></category>
		<category><![CDATA[Приложения]]></category>
		<category><![CDATA[Load]]></category>
		<category><![CDATA[Метод Abort]]></category>

		<guid isPermaLink="false">http://www.programmfc.ru/uncategorized/%d0%bc%d0%b5%d1%82%d0%be%d0%b4-abort-2.html</guid>
		<description><![CDATA[Тем не менее, мы может прекратить работу архива в любое время при помощи метода Abort(), исходный текст которого находится в файле агссоге.срр:
void CArchive::Abort() {
ASSERT(m_bDirectBuffer &#124;&#124;
m_lpBufStart == NULL &#124;&#124; AfxIsValidAddress(m_lpBufStart,
m_lpBufMax &#8211; m_lpBufStart, IsStoring()));
ASSERT(m_bDirectBuffer &#124;&#124;
m_lpBufCur == NULL &#124;&#124; AfxIsValidAddress(m_lpBufCur,
m_lpBufMax &#8211; m_lpBufCur, IsStoring()));
// disconnect from the file mjpFile = NULL;
if (!m_bUserBuf) {
ASSERT(!m_bDirectBuffer); delete[] m_lpBufStart; m_lpBufStart = NULL; m_lpBufCur [...]]]></description>
			<content:encoded><![CDATA[<p>Тем не менее, мы может прекратить работу архива в любое время при помощи метода Abort(), исходный текст которого находится в файле агссоге.срр:</p>
<p><b>void CArchive::Abort() {</b></p>
<p><b>ASSERT(m_bDirectBuffer ||</b></p>
<p><b>m_lpBufStart == NULL || AfxIsValidAddress(m_lpBufStart,</b></p>
<p><b>m_lpBufMax &#8211; m_lpBufStart, IsStoring()));</b></p>
<p><b>ASSERT(m_bDirectBuffer ||</b></p>
<p><b>m_lpBufCur == NULL || AfxIsValidAddress(m_lpBufCur,</b></p>
<p><b>m_lpBufMax &#8211; m_lpBufCur, IsStoring()));</b></p>
<p><b>// disconnect from the file mjpFile = NULL;</b></p>
<p><b>if (!m_bUserBuf) {</b></p>
<p><b>ASSERT(!m_bDirectBuffer); delete[] m_lpBufStart; m_lpBufStart = NULL; m_lpBufCur = NULL;</b></p>
<p>}</p>
<p><b>delete m_pSchemaMap; m_pSchemaMap = NULL;</b></p>
<p><b>// m_pStoreMap and m_pLoadArray are unioned, // so we only need to delete one</b></p>
<p><b>ASSERT((CObject*)m_pStoreMap == (CObject*)m_pLoadArray); delete (CObject*)m_pLoadArray; m_pLoadArray = NULL;</b>Посмотрим, что происходит с архивом в случае прекращения работы посредством вызова метода AbortQ. Первым делом метод «отсоединяет» архив от файла, присваивая полю m__pFile значе­ние NULL. Затем в том случае, если у архива есть ассоциированный с ним буфер, производится удаление буфера. Если в буфере остались данные, которые не были записаны в файл, то эти данные будут потеряны. Указатели на начало буфера и на текущую позицию буфера делаются равными NULL. Затем удаляется указатель на хэш-таблицу, содержащую номера схем классов, а за ней и хэш-таблица (или массив) сохраненных объектов.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programmfc.ru/uncategorized/%d0%bc%d0%b5%d1%82%d0%be%d0%b4-abort-2.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Класс CMDIChildWnd</title>
		<link>http://www.programmfc.ru/prilozheniya/%d0%ba%d0%bb%d0%b0%d1%81%d1%81-cmdichildwnd.html</link>
		<comments>http://www.programmfc.ru/prilozheniya/%d0%ba%d0%bb%d0%b0%d1%81%d1%81-cmdichildwnd.html#comments</comments>
		<pubDate>Wed, 03 Feb 2010 19:52:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Приложения]]></category>
		<category><![CDATA[CMDIChildWnd]]></category>

		<guid isPermaLink="false">http://www.programmfc.ru/uncategorized/%d0%ba%d0%bb%d0%b0%d1%81%d1%81-cmdichildwnd.html</guid>
		<description><![CDATA[Мне бы хотелось, чтобы вы вспомнили, что происходит при по­лучении окном класса CMDIChildWnd сообщения WM_CREATE. Во время работы этого метода вызываются еще много других мето­дов, в том числе CFrameWnd::CreateView(). Именно при работе этого метода и происходит вызов метода CreateObject() для объекта клас­са окна представления. Естественно, метод CreateObject() вызы­вает конструктор объекта окна представления. И, разумеется, вы­зываются [...]]]></description>
			<content:encoded><![CDATA[<p>Мне бы хотелось, чтобы вы вспомнили, что происходит при по­лучении окном класса CMDIChildWnd сообщения WM_CREATE. Во время работы этого метода вызываются еще много других мето­дов, в том числе CFrameWnd::CreateView(). Именно при работе этого метода и происходит вызов метода CreateObject() для объекта клас­са окна представления. Естественно, метод CreateObject() вызы­вает конструктор объекта окна представления. И, разумеется, вы­зываются строго по порядку конструкторы классов, от которых унас­ледован наш объект. Если мы в качестве окна приложения исполь­зуем объект класса CEditView, то первым вызывается конструктор CEditView::CEditView(). Исходный код этого конструктора находит­ся в файде viewedit.cpp:</p>
<p><b>// pass a NULL style because dwStyleDefault stays for // backward compatibility</b></p>
<p><b>CEditView::CEditView() : CCtrlView(_T(&quot;EDIT&quot;), NULL) </b><b><i></i></b></p>
<p><b>m_nTabStops = 8*4; // default 8 character positions m_hPrinterFont = NULL; m_hMirrorFont = NULL; m_pShadowBuffer = NULL; m_nShadowSize = 4);</b></p>
<p>}</p>
<p>Перед тем, как отработает этот конструктор, управление будет передано конструктору класса CCtrlView.</p>
<p>Исходный текст конструктора класса CCtrlView можно найти в файле viewcore.cpp:</p>
<p><b>CCtrlView::CCtrlView(LPCTSTR IpszClass, DWORD dwStyle) {</b></p>
<p><b>m_strClass = IpszClass;</b></p>
<p><b>m_dwDefaultStyle = dwStyle;</b></p>
<p>}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programmfc.ru/prilozheniya/%d0%ba%d0%bb%d0%b0%d1%81%d1%81-cmdichildwnd.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Отображение без проблем</title>
		<link>http://www.programmfc.ru/prilozheniya/%d0%be%d1%82%d0%be%d0%b1%d1%80%d0%b0%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b1%d0%b5%d0%b7-%d0%bf%d1%80%d0%be%d0%b1%d0%bb%d0%b5%d0%bc.html</link>
		<comments>http://www.programmfc.ru/prilozheniya/%d0%be%d1%82%d0%be%d0%b1%d1%80%d0%b0%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b1%d0%b5%d0%b7-%d0%bf%d1%80%d0%be%d0%b1%d0%bb%d0%b5%d0%bc.html#comments</comments>
		<pubDate>Wed, 03 Feb 2010 19:52:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Приложения]]></category>

		<guid isPermaLink="false">http://www.programmfc.ru/uncategorized/%d0%be%d1%82%d0%be%d0%b1%d1%80%d0%b0%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b1%d0%b5%d0%b7-%d0%bf%d1%80%d0%be%d0%b1%d0%bb%d0%b5%d0%bc.html</guid>
		<description><![CDATA[Я начал писать программу и остановился, словно услышал вопрос, задаваемый читателем: «Как же так, если, к примеру, мне хочется отображать данные в виде дерева или, скажем, в виде текста, мне так и придется прорисовывать дерево или использовать TextOut()?» Что ж, вопрос вполне закономерный. Мне тоже очень не хотелось думать, что разработчики MFC остановились на полпути [...]]]></description>
			<content:encoded><![CDATA[<p>Я начал писать программу и остановился, словно услышал вопрос, задаваемый читателем: «Как же так, если, к примеру, мне хочется отображать данные в виде дерева или, скажем, в виде текста, мне так и придется прорисовывать дерево или использовать TextOut()?» Что ж, вопрос вполне закономерный. Мне тоже очень не хотелось думать, что разработчики MFC остановились на полпути и не до­вели дело до конца. Помните, читатель, мое федположение о том, что класс CView является абстрактным и предоставляет только базовые возможности для объектов класса окна представления? Отправной точкой дальнейших изысканий послужило предположе­ние, что более специализированные классы окон представлений наследуются от CView. Заглянув в исходные коды MFC, я слегка обомлел. Оказывается, от CView наследуются классы CCtrlView, CScrollView. В свою очередь от CCtrlView унаследованы классы CListView, CTreeView, CEditView, CRichEditView. От CScrollView унас­ледованы CFormView, CPreviewView. От CFormView унаследованы классы CDaoRecordView, CRecordView, CHtmlView, COIeDBRecord-View. Графически это можно представить так:</p>
<p style="text-align: center;"><img class="aligncenter" src="http://www.programmfc.ru/image/12.jpg" alt="Пример" width="464" height="303" /></p>
<p><span style="text-decoration: underline;">(CVievT</span>)</p>
<p>-<span style="text-decoration: underline;">[CCtrlView ]</span></p>
<p>—<span style="text-decoration: underline;">( CListView ]</span></p>
<p>—<span style="text-decoration: underline;">[CTreeView]</span></p>
<p>-<span style="text-decoration: underline;">(CEditVievT)</span></p>
<p><strong></strong><span style="text-decoration: underline;">CRichEditView]</span></p>
<p>-<span style="text-decoration: underline;">(CScrollView ~)</span></p>
<p>—<span style="text-decoration: underline;">[CFormView ]</span></p>
<p>-<span style="text-decoration: underline;">(CDAORecordView)</span></p>
<p>—<span style="text-decoration: underline;">(CRecordView ]</span></p>
<p>-<span style="text-decoration: underline;">(CHtmlView ]</span></p>
<p>—<span style="text-decoration: underline;">[CQIeDBRecordView ]</span></p>
<p>—[ CPreviewView]</p>
<p>Даже судя по названиям, уже можно сделать выводы о предна­значении этих классов. Наверное, класс окна отображения в моей программе мне нужно было наследовать не от CView, а от более специализированного класса, скажем, CEditView. Что ж, попробу­ем так и сделать. Но теперь нам нужно отследить,каким образом работают объекты этого класса. Давайте, читатель, подумаем вме­сте вами. На каком этапе начинает работать объект класса, унас­ледованного от CView? Наверное, при создание объекта окна пред­ставления. Давайте попробуем проследить, что произойдет в мо­мент создания окна представления.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programmfc.ru/prilozheniya/%d0%be%d1%82%d0%be%d0%b1%d1%80%d0%b0%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b1%d0%b5%d0%b7-%d0%bf%d1%80%d0%be%d0%b1%d0%bb%d0%b5%d0%bc.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Методы CArchive::Close и CDocument::ReleaseFile</title>
		<link>http://www.programmfc.ru/prilozheniya/%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d1%8b-carchiveclose-%d0%b8-cdocumentreleasefile.html</link>
		<comments>http://www.programmfc.ru/prilozheniya/%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d1%8b-carchiveclose-%d0%b8-cdocumentreleasefile.html#comments</comments>
		<pubDate>Wed, 03 Feb 2010 19:49:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Приложения]]></category>

		<guid isPermaLink="false">http://www.programmfc.ru/uncategorized/%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d1%8b-carchiveclose-%d0%b8-cdocumentreleasefile.html</guid>
		<description><![CDATA[Но вернемся от нашей программы к методу CDocument.On-OpenDocument(). Естественно, что после того, как мы считали со­держимое архива в поля нашего документа, архив и файл нашей программе больше не нужны и мы их можем спокойно закрыть, что и происходит. Для этого используются методы CArchive::Close() и CDocument::ReleaseFile().
Что ж, та задача, которую мы поставили перед собой, мы ус­пешно [...]]]></description>
			<content:encoded><![CDATA[<p>Но вернемся от нашей программы к методу CDocument.On-OpenDocument(). Естественно, что после того, как мы считали со­держимое архива в поля нашего документа, архив и файл нашей программе больше не нужны и мы их можем спокойно закрыть, что и происходит. Для этого используются методы CArchive::Close() и CDocument::ReleaseFile().</p>
<p>Что ж, та задача, которую мы поставили перед собой, мы ус­пешно выполнили: узнали не только, как подготовиться к открытию файла, но и прошли по всему пути от файла до документа, начи­ная от подготовки диалогового окна для открытия файла, продол­жая созданием окна фрейма и завершая чтением файла в поля документа. Кроме того, мы узнали какие ресурсы при этом исполь­зуются, частично определили формат и назначение этих ресурсов. На этом наша работа с файлом завершена до момента сохране­ния файла на диске. Но теперь нам необходимо понять, что проис­ходит при отображении документа.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programmfc.ru/prilozheniya/%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d1%8b-carchiveclose-%d0%b8-cdocumentreleasefile.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Метод Serialize</title>
		<link>http://www.programmfc.ru/prilozheniya/%d0%bc%d0%b5%d1%82%d0%be%d0%b4-serialize-3.html</link>
		<comments>http://www.programmfc.ru/prilozheniya/%d0%bc%d0%b5%d1%82%d0%be%d0%b4-serialize-3.html#comments</comments>
		<pubDate>Wed, 03 Feb 2010 19:49:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Приложения]]></category>
		<category><![CDATA[CDocTemplate]]></category>
		<category><![CDATA[CMDIChildWnd]]></category>
		<category><![CDATA[CWinApp]]></category>
		<category><![CDATA[OnFileOpen]]></category>

		<guid isPermaLink="false">http://www.programmfc.ru/uncategorized/%d0%bc%d0%b5%d1%82%d0%be%d0%b4-serialize-3.html</guid>
		<description><![CDATA[Документ, естественно, рождается из файла, поэтому первым делом метод, вызывая GetFile(), открывает файл, имя которого, как я уже говорил, он получил в качестве аргумента. Затем начинается самое интересное. На основе файла создается объект класса САг-chive, т. е. АРХИВ. В архитектуре «документ/представление» счи­тается, что программист должен иметь возможность легко сохра­нять созданные в памяти структуры данных в [...]]]></description>
			<content:encoded><![CDATA[<p>Документ, естественно, рождается из файла, поэтому первым делом метод, вызывая GetFile(), открывает файл, имя которого, как я уже говорил, он получил в качестве аргумента. Затем начинается самое интересное. На основе файла создается объект класса САг-chive, т. е. АРХИВ. В архитектуре «документ/представление» счи­тается, что программист должен иметь возможность легко сохра­нять созданные в памяти структуры данных в дисковом файле, после чего он должен иметь возможность вновь считать их из фай­ла. Архив позволяет программисту читать и записывать в файл не просто некоторые объемы информации, а ОБЪЕКТЫ всевозмож­ных типов! Именно поэтому его использование в большинстве слу­чаев представляется оправданным. И дальше вызывается метод Serialize(), который работает уже не с файлом, а с архивом! По умолчанию этот метод не делает ничего. Естественно, откуда про­грамме знать, что и как программисту захотелось сохранить в ар­хиве? А для программиста здесь раздолье! Можно проверить фор­мат открытого файла, определить, при необходимости, его струк­туру, выполнить все мыслимые и немыслимые действия. Для того чтобы продемонстрировать работу метода Serialize(), давайте по­пробуем открыть файл в нашей программе и считать его в буфер. Внесем небольшие изменения в наш класс документа &#8211; добавим два поля, в которые запишем, во-первых, размер файла, а второй будет являться указателем на буфер, в который мы будем читать файл. После внесенных изменений наша программа выглядит сле­дующим образом:</p>
<p><b>#include &quot;stdafx.h&quot; #include &lt;afxcview.h&gt; #include &quot;resource.h&quot;</b></p>
<p><b>// Объявляем класс приложения, его поля и методы.</b></p>
<p><b>class CDoc : public CDocument {</b></p>
<p><b>DECLARE_DYNCREATE( CDoc ) int nFileLength; void* pMyFile; public: CDocO ;</b></p>
<p><b>void Serialize ( CArchive &amp;ar ); virtual -CDoc();</b></p>
<p><b>}/</b></p>
<p><b>• IMPLEMENT_DYNCREATE( CDoc, CDocument )</b></p>
<p><b>CDoc::CDoc()</b></p>
<p>{</p>
<p>}</p>
<p><b>CDoc::-CDoc()</b></p>
<p>{</p>
<p>}</p>
<p><b>void CDoc::Serialize( CArchive &amp;ar ) {</b></p>
<p><b>if( ar.IsStoring() )</b></p>
<p>{</p>
<p>}</p>
<p><b>else {</b></p>
<p><b>// </b><b>Определяем</b><b> </b><b>длину</b><b> </b><b>файла</b><b>.</b></p>
<p><b>nFileLength = ar.GetFile()-&gt;GetLength();&#8217;</b></p>
<p><b>TRACE( _T( &quot;File length = %d.\n&quot;), nFileLength&#8217; );</b></p>
<p><b>// Выделяем буфер в памяти, в который будем считывать файл. pMyFile = new chart nFileLength ];</b></p>
<p><b>// Считываем файл в буфер.</b></p>
<p><b>ar.Read( pMyFile, nFileLength ); }</b></p>
<p>}</p>
<p><b>class CDocViewlApp : public CWinApp {</b></p>
<p><b>public:</b></p>
<p><b>CDocViewlApp(); protected:</b></p>
<p><b>afx_msg void OnFileOpen(); virtual BOOL Inifrlnstance(); DEC LARE_ME S S AGE_MA P()</b></p>
<p>};</p>
<p><b>CDocViewlApp::CDocViewlApp()</b></p>
<p>{</p>
<p>}</p>
<p><b>void CDocViewlApp::OnFileOpen()</b></p>
<p>{</p>
<p>}</p>
<p><b>class CMainFrame : public CMDIFrameWnd {</b></p>
<p><b>DECLARE_DYNAMIC( CMainFrame ); public:</b></p>
<p><b>CMainFrame();</b></p>
<p><b>&gt;;</b></p>
<p><b>IMPLEMENT_DYNAMIC (CMainFrame, CMDIFrameWnd)</b></p>
<p><b>CMainFrame::CMainFrame()</b></p>
<p>{</p>
<p>}</p>
<p><b>BOOL CDocViewlApp::Initlnstance() {</b></p>
<p><b>#ifdef _AFXDLL</b></p>
<p><b>Enable3dControls(); #else</b></p>
<p><b>Enable3dControlsStatic(); #endif</b></p>
<p><b>LoadStdProfileSettings(); CDocTemplate* pDocTemplate;</b></p>
<p><b>pDocTemplate = new CMultiDocTemplate( IDR_DOCUMENT,</b></p>
<p><b>RUNTIME_CLASS( CDoc ) , RUNTIME_CLASS( CMDIChildWnd ), NULL );</b></p>
<p><b>AddDocTemplate( pDocTemplate ); CMainFrame* pMainFrame = new CMainFrame; pMainFrame-&gt;LoadFrame ( IDR__RESOURCE ) ; m_pMainWnd = pMainFrame; pMainFrame-&gt;ShowWindow(m_nCmdShow ); pMainFrame-&gt;UpdateWindow();</b></p>
<p><b>return TRUE;</b></p>
<p>}</p>
<p><b>BEGIN_MESSAGE_MAP( CDocViewlApp, CWinApp )</b></p>
<p><b>ON_COMMAND( ID_FILE_OPEN, CWinApp::OnFileOpen ) END_MESSAGE_MAP()</b></p>
<p><b>CDocViewlApp theApp;</b></p>
<p>Если мы запустим нашу программу на выполнение (внутри сре­ды разработки) и откроем какой-нибудь файл, то увидим, что на отладочном мониторе появилось сообщение о размере открытого файла. Любознательный читатель может проверить, произойдет ли считывание содержимого файла в буфер. Я абсолютно уверен, что в обычных условиях файл будет считан в буфер без каких-либо проблем.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programmfc.ru/prilozheniya/%d0%bc%d0%b5%d1%82%d0%be%d0%b4-serialize-3.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Возвра&#173;щенное значение FALSE</title>
		<link>http://www.programmfc.ru/uncategorized/%d0%b2%d0%be%d0%b7%d0%b2%d1%80%d0%b0%d1%89%d0%b5%d0%bd%d0%bd%d0%be%d0%b5-%d0%b7%d0%bd%d0%b0%d1%87%d0%b5%d0%bd%d0%b8%d0%b5-false.html</link>
		<comments>http://www.programmfc.ru/uncategorized/%d0%b2%d0%be%d0%b7%d0%b2%d1%80%d0%b0%d1%89%d0%b5%d0%bd%d0%bd%d0%be%d0%b5-%d0%b7%d0%bd%d0%b0%d1%87%d0%b5%d0%bd%d0%b8%d0%b5-false.html#comments</comments>
		<pubDate>Wed, 03 Feb 2010 19:30:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Первая программа на MFC]]></category>
		<category><![CDATA[Приложения]]></category>
		<category><![CDATA[Метод Read]]></category>

		<guid isPermaLink="false">http://www.programmfc.ru/uncategorized/%d0%b2%d0%be%d0%b7%d0%b2%d1%80%d0%b0%d1%89%d0%b5%d0%bd%d0%bd%d0%be%d0%b5-%d0%b7%d0%bd%d0%b0%d1%87%d0%b5%d0%bd%d0%b8%d0%b5-false.html</guid>
		<description><![CDATA[Этот метод не делает ничего особенного, просто перебирается цепочка базовых классов. Если указатель на информацию време­ни выполнения базового класса совпадет с информацией времени исполнения проверяемого класса, то, значит, проверяемый класс является наследником базового класса. В этом случае метод воз­вратит значение TRUE. В противном случае мы дойдем до значе­ния NULL, что будет означать, что проверяемый класс [...]]]></description>
			<content:encoded><![CDATA[<p>Этот метод не делает ничего особенного, просто перебирается цепочка базовых классов. Если указатель на информацию време­ни выполнения базового класса совпадет с информацией времени исполнения проверяемого класса, то, значит, проверяемый класс является наследником базового класса. В этом случае метод воз­вратит значение TRUE. В противном случае мы дойдем до значе­ния NULL, что будет означать, что проверяемый класс наследни­ком базового класса не является. Признаком этого будет возвра­щенное значение FALSE.</p>
<p>И, кажется, все, что можно проверить, уже проверено. Метод ReadClassQ записывает по переданным ему ссылкам значения подготовленных схемы и ссылки на класс, после чего возвраща­ет указатель на информацию времени выполнения объекта. Не забудьте, что помимо возвращаемых значений, результатом работы метода ReadClass() является и заполненный элемент в массиве.</p>
<p>Итак, мы опять вернулись в метод ReadObject(). Какие возмож­ные варианты дальнейших действий необходимо рассмотреть?</p>
<p>Вариант первый &#8211; метод ReadClass() вернул NULL. Это означает, что из архива был считан тэг объекта.</p>
<p>Вариант второй &#8211; метод ReadClass вернул ненулевое значение. Это означает, что из архива был считан тэг класса.</p>
<p>Итак, что происходит в том случае, если считан тэг класса? Во-первых, создается объект этого класса. Согласитесь, чита­тель, мы не можем записать в архив просто класс, мы записыва­ем в архив ОБЪЕКТЫ класса, следовательно, после каждого описания класса или ссылки на класс должен следовать тэг объ­екта, верно? Во-вторых, указатель на этот объект помещается в очередной элемент массива указателей. И, в-третьих, вызы­вается метод Serialize() объекта. <i>Метод ReadObjectQ возвраща­ет указатель на считанный из архива объект. </i>Мы дошли до логического завершения процесса сериализации. Нерассмотрен­ным осталась небольшая деталь.</p>
<p>Итак, что происходит в случае считывания тэга объекта? Если индекс объекта превышает число элементов в массиве, то, значит, произошла ошибка, на которую метод реагирует выработкой ис­ключения. После этого метод выбирает из массива ранее записан­ный указатель на объект и проверяет, принадлежит ли он к ожи­даемому классу. Если проверка проходит успешно, <i>метод возвра­щает указатель на объект, который был считан ранее. </i>В про­тивном случае вырабатывается исключение.</p>
<p>После того, как данные были записаны в архив или считаны из архива, архив желательно закрыть. Это делается при помощи об­ращения к методу Close(), исходный код которого находится в фай­ле агссоге.срр:</p>
<p><b>void CArchive::Close() {</b></p>
<p><b>ASSERT_VALID(m_pFile);</b></p>
<p><b>Flush(); m_pFile = NULL;</b></p>
<p>Как видно из исходного текста метода, содержимое буфера «сбра­сывается» в файл и поле m_pFile делается равным NULL, т. е. архив «отсоединяется» от файла, на основе которого он был создан.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programmfc.ru/uncategorized/%d0%b2%d0%be%d0%b7%d0%b2%d1%80%d0%b0%d1%89%d0%b5%d0%bd%d0%bd%d0%be%d0%b5-%d0%b7%d0%bd%d0%b0%d1%87%d0%b5%d0%bd%d0%b8%d0%b5-false.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
