<?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; CWinApp</title>
	<atom:link href="http://www.programmfc.ru/tag/cwinapp/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>Объекты класса CDocMan­ager</title>
		<link>http://www.programmfc.ru/uncategorized/%d0%be%d0%b1%d1%8a%d0%b5%d0%ba%d1%82%d1%8b-%d0%ba%d0%bb%d0%b0%d1%81%d1%81%d0%b0-cdocmanager.html</link>
		<comments>http://www.programmfc.ru/uncategorized/%d0%be%d0%b1%d1%8a%d0%b5%d0%ba%d1%82%d1%8b-%d0%ba%d0%bb%d0%b0%d1%81%d1%81%d0%b0-cdocmanager.html#comments</comments>
		<pubDate>Mon, 08 Feb 2010 19:34:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Архитектура]]></category>
		<category><![CDATA[Первая программа на MFC]]></category>
		<category><![CDATA[Работа с файлами]]></category>
		<category><![CDATA[CDocTemplate]]></category>
		<category><![CDATA[CWinApp]]></category>
		<category><![CDATA[Объекты класса CDocMan­ager]]></category>

		<guid isPermaLink="false">http://www.programmfc.ru/uncategorized/%d0%be%d0%b1%d1%8a%d0%b5%d0%ba%d1%82%d1%8b-%d0%ba%d0%bb%d0%b0%d1%81%d1%81%d0%b0-cdocmanager.html</guid>
		<description><![CDATA[Что мы можем здесь увидеть? То, что в описании этого класса присутствует поле rnJTemplateList класса CPtrList, только подтвер­ждает нашу догадку о том, что de facto объекты класса CDocMan­ager являются списками указателей на какие-то шаблоны. Для того чтобы убедиться, что наша догадка верна, достаточно взглянуть на исходный код методов GetFirstDocTemplatePosition() и GetNext-DocTemplate(), который находится в файле [...]]]></description>
			<content:encoded><![CDATA[<p>Что мы можем здесь увидеть? То, что в описании этого класса присутствует поле rnJTemplateList класса CPtrList, только подтвер­ждает нашу догадку о том, что de facto объекты класса CDocMan­ager являются списками указателей на какие-то шаблоны. Для того чтобы убедиться, что наша догадка верна, достаточно взглянуть на исходный код методов GetFirstDocTemplatePosition() и GetNext-DocTemplate(), который находится в файле docmgr.cpp:</p>
<p><b>POSITION CDocManager::GetFirstDocTemplatePosition() const {</b></p>
<p><b>return m_templateList.GetHeadPosition() ;</b></p>
<p>}</p>
<p><b>CDocTemplate* CDocManager::GetNextDocTemplate(</b></p>
<p><b>POSITIONS pos) const</b></p>
<p>{</p>
<p><b>return (CDocTemplate*)m_templateList.GetNext(pos) ;</b></p>
<p>Теперь возникает вопрос о том, что за шаблоны включаются в список. Позвольте, уважаемый читатель, высказать предположе­ние о том, что этими шаблонами являются шаблоны ДОКУМЕН­ТОВ, с которыми работает данное приложение. Я не буду сейчас останавливаться на том, что такое шаблон документа. Это станет ясно из дальнейшего изложения.</p>
<p>Сейчас нам необходимо научиться создавать объект этого класса. Естественно, что для создания объекта мы восполь­зуемся конструктором. Раз конструктор класса CDocManager параметров не имеет, то создание объекта этого класса за­труднений не вызовет. Но каким-то образом нам необходимо передать нашему приложению информацию о том, с документа­ми каких типов (шаблонов) он будет иметь дело! Вспомним, что у класса CWinApp для добавления шаблона в список есть метод AddDocTemplate(), который, фактически является вызовом одно­именного метода класса CDocManager. Наверное, именно этим методом и следует воспользоваться при добавлении шаблона документа!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programmfc.ru/uncategorized/%d0%be%d0%b1%d1%8a%d0%b5%d0%ba%d1%82%d1%8b-%d0%ba%d0%bb%d0%b0%d1%81%d1%81%d0%b0-cdocmanager.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Класс CDocManager</title>
		<link>http://www.programmfc.ru/uncategorized/%d0%ba%d0%bb%d0%b0%d1%81%d1%81-cdocmanager.html</link>
		<comments>http://www.programmfc.ru/uncategorized/%d0%ba%d0%bb%d0%b0%d1%81%d1%81-cdocmanager.html#comments</comments>
		<pubDate>Mon, 08 Feb 2010 19:34:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Архитектура]]></category>
		<category><![CDATA[Первая программа на MFC]]></category>
		<category><![CDATA[Работа с файлами]]></category>
		<category><![CDATA[CDocTemplate]]></category>
		<category><![CDATA[CWinApp]]></category>
		<category><![CDATA[DoPromptFileName]]></category>
		<category><![CDATA[OnFileOpen]]></category>
		<category><![CDATA[OpenDocumentFile]]></category>
		<category><![CDATA[Класс CDocManager]]></category>

		<guid isPermaLink="false">http://www.programmfc.ru/uncategorized/%d0%ba%d0%bb%d0%b0%d1%81%d1%81-cdocmanager.html</guid>
		<description><![CDATA[Наверное, из описания класса CWinApp мы не сумеем извлечь еще какую-то информацию о классе CDocManager. Настало время взглянуть на описание этого класса. Думаю, нет необходимости описывать всю внутреннюю реализацию этого класса. Достаточно будет, если мы рассмотрим назначение наиболее часто используе­мых полей и методов.
Класс CDocManager в файле afxwin.h описан следующим образом:
class CDocManager : public CObject {
DECLARE_DYNAMIC(CDocManager) [...]]]></description>
			<content:encoded><![CDATA[<p>Наверное, из описания класса CWinApp мы не сумеем извлечь еще какую-то информацию о классе CDocManager. Настало время взглянуть на описание этого класса. Думаю, нет необходимости описывать всю внутреннюю реализацию этого класса. Достаточно будет, если мы рассмотрим назначение наиболее часто используе­мых полей и методов.</p>
<p>Класс CDocManager в файле afxwin.h описан следующим образом:</p>
<p><b>class CDocManager : public CObject {</b></p>
<p><b>DECLARE_DYNAMIC(CDocManager) public:</b></p>
<p><b>// Constructor CDocManager();</b></p>
<p><b>//Document functions</b></p>
<p><b>virtual void AddDocTemplate(CDocTemplate* pTemplate); virtual POSITION GetFirstDocTemplatePosition() const; virtual CDocTemplate* GetNextDocTemplate(</b></p>
<p><b>POSITIONS pos) const; virtual void RegisterShellFileTypes(BOOL bCompat); void UnregisterShellFileTypes();</b></p>
<p><b>virtual CDocument* OpenDocumentFile(LPCTSTR IpszFileName);</b></p>
<p><b>// open named file</b></p>
<p><b>virtual BOOL SaveAllModified(); // save before exit virtual void CloseAllDocuments(BOOL bEndSession);</b></p>
<p><b>// close documents before exiting virtual int GetOpenDocumentCount();</b></p>
<p><b>// helper for standard commdlg dialogs virtual BOOL DoPromptFileName(CString&amp; fileName</b></p>
<p><b>UINT nIDSTitle, DWORD lFlags, BOOL bOpenFileDialog, CDocTemplate* pTemplate);</b></p>
<p><b>//Commands</b></p>
<p><b>// Advanced: process async DDE request</b></p>
<p><b>virtual BOOL OnDDECommand(LPTSTR IpszCommand); virtual void OnFileNew(); virtual void OnFileOpen();</b></p>
<p><b>// Implementation protected:</b></p>
<p><b>CPtrList m_templateList;</b></p>
<p><b>int GetDocumentCount(); // helper to count number</b></p>
<p><b>// of total documents</b></p>
<p><b>public:</b></p>
<p><b>static CPtrList* pStaticList;</b></p>
<p><b>// for static CDocTemplate objects static BOOL bStaticInit;</b></p>
<p><b>// TRUE during static initialization static CDocManager* pStaticDocManager;</b></p>
<p><b>// for static CDocTemplate objects</b></p>
<p><b>public:</b></p>
<p><b>virtual -CDocManager(); #ifdef _DEBUG</b></p>
<p><b>virtual void AssertValid() const;</b></p>
<p><b>virtual void Dump(CDumpContext&amp; dc) const; #endif };</b></p>
]]></content:encoded>
			<wfw:commentRss>http://www.programmfc.ru/uncategorized/%d0%ba%d0%bb%d0%b0%d1%81%d1%81-cdocmanager.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Как ошибка привела меня к пониманию того, что такое шаблон документа</title>
		<link>http://www.programmfc.ru/uncategorized/%d0%ba%d0%b0%d0%ba-%d0%be%d1%88%d0%b8%d0%b1%d0%ba%d0%b0-%d0%bf%d1%80%d0%b8%d0%b2%d0%b5%d0%bb%d0%b0-%d0%bc%d0%b5%d0%bd%d1%8f-%d0%ba-%d0%bf%d0%be%d0%bd%d0%b8%d0%bc%d0%b0%d0%bd%d0%b8%d1%8e-%d1%82%d0%be.html</link>
		<comments>http://www.programmfc.ru/uncategorized/%d0%ba%d0%b0%d0%ba-%d0%be%d1%88%d0%b8%d0%b1%d0%ba%d0%b0-%d0%bf%d1%80%d0%b8%d0%b2%d0%b5%d0%bb%d0%b0-%d0%bc%d0%b5%d0%bd%d1%8f-%d0%ba-%d0%bf%d0%be%d0%bd%d0%b8%d0%bc%d0%b0%d0%bd%d0%b8%d1%8e-%d1%82%d0%be.html#comments</comments>
		<pubDate>Mon, 08 Feb 2010 19:33:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Архитектура]]></category>
		<category><![CDATA[Первая программа на MFC]]></category>
		<category><![CDATA[Работа с файлами]]></category>
		<category><![CDATA[CWinApp]]></category>
		<category><![CDATA[OnFileOpen]]></category>

		<guid isPermaLink="false">http://www.programmfc.ru/uncategorized/%d0%ba%d0%b0%d0%ba-%d0%be%d1%88%d0%b8%d0%b1%d0%ba%d0%b0-%d0%bf%d1%80%d0%b8%d0%b2%d0%b5%d0%bb%d0%b0-%d0%bc%d0%b5%d0%bd%d1%8f-%d0%ba-%d0%bf%d0%be%d0%bd%d0%b8%d0%bc%d0%b0%d0%bd%d0%b8%d1%8e-%d1%82%d0%be.html</guid>
		<description><![CDATA[

Значит, либо я сделал что-то не так, либо в программе не опре­делил какие-то данные. Второй вариант, конечно, более вероя­тен. Для того чтобы убедиться в этом, давайте, уважаемый чи­татель, посмотрим на то место, в котором была обнаружена ошибка. Как оказалось, на этом месте находится исходный текст метода OnFileOpenQ класса CWinApp. Ниже приведен текст это­го метода:
void CWinApp::OnFileOpen() [...]]]></description>
			<content:encoded><![CDATA[<p><b></b></p>
<p><b></b></p>
<p>Значит, либо я сделал что-то не так, либо в программе не опре­делил какие-то данные. Второй вариант, конечно, более вероя­тен. Для того чтобы убедиться в этом, давайте, уважаемый чи­татель, посмотрим на то место, в котором была обнаружена ошибка. Как оказалось, на этом месте находится исходный текст метода OnFileOpenQ класса CWinApp. Ниже приведен текст это­го метода:</p>
<p><b>void CWinApp::OnFileOpen() {</b></p>
<p><b>ASSERT(m_pDocManager != NULL); m_pDocManager-&gt;OnFileOpen();</b></p>
<p>}</p>
<p>Помните, я говорил, что имеющий уши да услышит? Во-первых, судя по наименованию переменных, используемых в приведенном выше тексте метода, MFC по умолчанию считает, что наше прило­жение построено в соответствии с идеологией «Документ/представ­ление»! Другими словами, именно эта идеология считается при­оритетной при работе с MFC! Значит, именно ЭТОЙ идеологии в MFC отводится очень важная роль. Возможно, подумал я, что понимание одного из ключевых моментов MFC приблизит меня к по­ниманию идеологии всей библиотеки в целом! Но оставим «лири­ческое отступление» и продолжим нашу работу.</p>
<p>Во-вторых, здесь MFC сама подсказывает нам причину ошибки в программе! Из приведенного выше текста метода мы можем сделать три важных заключения. Заключение первое состоит в том, что у класса CWinApp есть член m_pDocManager, кото­рый, судя по его названию, является указателем на какой-то ме­неджер документов. Заключение второе &#8211; вероятнее всего, имен­но этот менеджер документов и отвечает за управление доку­ментами в приложении. И наконец, заключение третье. Очевид­но, что единственной причиной, которая может привести к выда­че приведенного выше сообщения об ошибке, является равен­ство нулю указателя на менеджер документов. Следовательно, причина этой ошибки состоит в том, что мы просто-напросто не создали менеджер документов!</p>
<p>А что следует из этих заключений? Из этих заключений следует один очень важный вывод.</p>
<p>Тсли наше приложение не обрабатывает команду ID_FILE_OPEN и обработку производит метод CWinApp::OnFileOpen, то перед вызовом этого метода дол­жен быть создан объект класса CDocManager и указатель на этот объект должен быть присвоен полю CWinApp::m_pDocManager.</p>
<p>К сожалению, искать информацию о менеджере документов в MSDN совершенно бесполезно. И в описании членов класса CWi­nApp мы также не найдем и упоминания об m_pDocManager. При­дется опять смотреть исходные коды MFC&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programmfc.ru/uncategorized/%d0%ba%d0%b0%d0%ba-%d0%be%d1%88%d0%b8%d0%b1%d0%ba%d0%b0-%d0%bf%d1%80%d0%b8%d0%b2%d0%b5%d0%bb%d0%b0-%d0%bc%d0%b5%d0%bd%d1%8f-%d0%ba-%d0%bf%d0%be%d0%bd%d0%b8%d0%bc%d0%b0%d0%bd%d0%b8%d1%8e-%d1%82%d0%be.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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%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>Метод 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>Изменения в метод Initlnstance</title>
		<link>http://www.programmfc.ru/uncategorized/%d0%b8%d0%b7%d0%bc%d0%b5%d0%bd%d0%b5%d0%bd%d0%b8%d1%8f-%d0%b2-%d0%bc%d0%b5%d1%82%d0%be%d0%b4-initlnstance.html</link>
		<comments>http://www.programmfc.ru/uncategorized/%d0%b8%d0%b7%d0%bc%d0%b5%d0%bd%d0%b5%d0%bd%d0%b8%d1%8f-%d0%b2-%d0%bc%d0%b5%d1%82%d0%be%d0%b4-initlnstance.html#comments</comments>
		<pubDate>Wed, 03 Feb 2010 19:44:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Архитектура]]></category>
		<category><![CDATA[Первая программа на MFC]]></category>
		<category><![CDATA[CDocTemplate]]></category>
		<category><![CDATA[CWinApp]]></category>
		<category><![CDATA[OnFileOpen]]></category>
		<category><![CDATA[OpenDocumentFile]]></category>

		<guid isPermaLink="false">http://www.programmfc.ru/uncategorized/%d0%b8%d0%b7%d0%bc%d0%b5%d0%bd%d0%b5%d0%bd%d0%b8%d1%8f-%d0%b2-%d0%bc%d0%b5%d1%82%d0%be%d0%b4-initlnstance.html</guid>
		<description><![CDATA[Вносим необходимые изменения в метод InitlnstanceQ нашего приложения:
BOOL CDocViewlApp::Initlnstance() {
fifdef _AFXDLL
Enable3dControls(); #else
Enable3dControlsStatic(); #endif
.»
LoadStdProfileSettings(); CDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate( IDR_DOCUMENT,
RUNTIME_CLASS(CDoc), NULL, NULL ); AddDocTemplate( pDocTemplate ); CMainFrame* pMainFrame = new CMainFrame; pMainFrame-&#62;LoadFrame( IDR_RESOURCE ); m_pMainWnd = pMainFrame; pMainFrame-&#62;ShowWindow(m_nCmdShow );
pMainFrame-&#62;UpdateWindow(); return TRUE;
}
Снова компилируем программу, запускаем на выполнение. ..И б-лагополучно минуем то место, на котором в прошлый раз [...]]]></description>
			<content:encoded><![CDATA[<p>Вносим необходимые изменения в метод InitlnstanceQ нашего приложения:</p>
<p><b>BOOL CDocViewlApp::Initlnstance() {</b></p>
<p><b>fifdef _AFXDLL</b></p>
<p><b>Enable3dControls(); #else</b></p>
<p><b>Enable3dControlsStatic(); #endif</b></p>
<p><b>.»</b></p>
<p><b>LoadStdProfileSettings(); CDocTemplate* pDocTemplate;</b></p>
<p><b>pDocTemplate = new CMultiDocTemplate( IDR_DOCUMENT,</b></p>
<p><b>RUNTIME_CLASS(CDoc), NULL, NULL ); AddDocTemplate( pDocTemplate ); CMainFrame* pMainFrame = new CMainFrame; pMainFrame-&gt;LoadFrame( IDR_RESOURCE ); m_pMainWnd = pMainFrame; pMainFrame-&gt;ShowWindow(m_nCmdShow );</b></p>
<p><b>pMainFrame-&gt;UpdateWindow(); return TRUE;</b></p>
<p>}</p>
<p>Снова компилируем программу, запускаем на выполнение. ..И б-лагополучно минуем то место, на котором в прошлый раз у нас было выдано сообщение об ошибке. Однако нам необходимо по­нять, что происходит при создании документа, т. е. что происходит при работе метода CDocTemplate::CreateNewDocument().</p>
<p><b>CObject* CRuntimeClass::CreateObject() {</b></p>
<p><b>if (m_pfnCreateObject == NULL) {</b></p>
<p><b>TRACE(_T(&quot;Error: Trying to create object which is not &quot;) _T(&quot;DECLARE_DYNCREATE \nor DECLARE_SERIAL: %hs.\n&quot;), m_lpszClassName); return NULL;</b></p>
<p>}</p>
<p><b>CObject* pObject = NULL;</b></p>
<p><b>TRY</b></p>
<p>{</p>
<p><b>pObject = (*m_pfnCreateObject) () ;</b></p>
<p>}</p>
<p><b>END_TRY</b></p>
<p><b>return pObject;</b>(CWJnApp::OnFJIeOpen ) Во-вторых, при помощи метода    <br /><s>S</s> <i>. </i>CMultiDocTemplate::AddDocu-</p>
<p><u>Ц</u><u>CDocManager::OnFileOpen J</u> <sub>men</sub>t() (файл docmulti.cpp)</p>
<p>UcWinAppriOpenDocumentFile) <sup>только</sup> <sup>что</sup> созданный</p>
<p><s>N</s> <i><u><sup>J</sup></u></i> документ добавля-</p>
<p>L-<u>[ CDocManager::OpenDocumentFile ]</u> ется в список</p>
<p>CMultiDocTemplate::OpenDocumentFjle] Документов   <br />— <u>—&#8217;</u> шаблона:</p>
<p>CDocTemplate::CreateNewDocum^n?)</p>
<p><u>^CMultiDocTemplate::AddDocument]</u></p>
<p><b>void CMultiDocTemplate::AddDocument(CDocument* pDoc) {</b></p>
<p><b>ASSERT_VALID(pDoc);</b></p>
<p><b>CDocTemplate::AddDocument(pDoc);</b></p>
<p><b>ASSERT(m_docList.Find(pDoc, NULL) == NULL);</b></p>
<p><b>// must not be in list</b></p>
<p><b>m_docList.AddTail(pDoc);</b></p>
<p><b>}</b></p>
<p>CWinA<sub>PP</sub>::OnFileOpen <i>) </i><sup>A</sup> <sup>этот</sup> <i><sup>мет0</sup>* </i>Фактически представ-    <br />&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; <sup>J</sup><i> </i>ляет собой вызов одноименного</p>
<p><i>ч</i></p>
<p><u>CDocManager::OnFileOpen ]</u> метода базового класса</p>
<p><u>CWinApp::OpenPocumentFilQ</u> <sup>(</sup><sup>фаЙЛ</sup> <sup>doctem</sup>P<sup>lc</sup>PP)<sup>:</sup></p>
<p>^-<u>{CDocManager^OpenDocumentFile&quot;)</u></p>
<p><b>L</b><u>^CMultiDocTemplate::OpenDocumentFile] </u>CDocTemplate::CreateNewDocument] CMultiDocTemplate::AddDocument] L^CDocTemplate::AddDocument ]</p>
<p><b>void CDocTemplate::AddDocument(CDocument* pDoc) {</b></p>
<p><b>ASSERT_VALID(pDoc);</b></p>
<p><b>ASSERT(pDoc-&gt;m_pDocTemplate == NULL); // no template attached yet pDoc-&gt;m_pDocTemplate = this;</b></p>
<p>Исходя из текстов этих методов, можно заметить, что не только у шаблона документа есть список документов, открытых на основе данного шаблона, но и у каждого документа есть указатель на тот шаблон, при помощи которого он был открыт. Этакая своеобраз­ная обратная связь!</p>
<p>Итак, что происходит при создании нового документа, мы выяс­нили. Фактически создается пустой документ, на него делается ссылка в шаблоне, а документ, в свою очередь, запоминает указа­тель на шаблон.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programmfc.ru/uncategorized/%d0%b8%d0%b7%d0%bc%d0%b5%d0%bd%d0%b5%d0%bd%d0%b8%d1%8f-%d0%b2-%d0%bc%d0%b5%d1%82%d0%be%d0%b4-initlnstance.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Метод CWinApp::OnFileOpen</title>
		<link>http://www.programmfc.ru/uncategorized/%d0%bc%d0%b5%d1%82%d0%be%d0%b4-cwinapponfileopen.html</link>
		<comments>http://www.programmfc.ru/uncategorized/%d0%bc%d0%b5%d1%82%d0%be%d0%b4-cwinapponfileopen.html#comments</comments>
		<pubDate>Wed, 03 Feb 2010 19:40:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Архитектура]]></category>
		<category><![CDATA[Первая программа на MFC]]></category>
		<category><![CDATA[CWinApp]]></category>
		<category><![CDATA[DoPromptFileName]]></category>
		<category><![CDATA[OnFileOpen]]></category>
		<category><![CDATA[OpenDocumentFile]]></category>
		<category><![CDATA[Метод CWinApp]]></category>

		<guid isPermaLink="false">http://www.programmfc.ru/uncategorized/%d0%bc%d0%b5%d1%82%d0%be%d0%b4-cwinapponfileopen.html</guid>
		<description><![CDATA[Но взглянем на это окно повнимательнее. В основном меня все в нем устраивает, за исключением того, что мне предлагается осу­ществить выбор из всех имеющихся файлов. А если я хочу, чтобы мне был показаны только файлы с расширением «ехе» или «txt»? Могу ли я каким-нибудь образом изменить фильтр? А на этот во­прос ответить не так просто, [...]]]></description>
			<content:encoded><![CDATA[<p>Но взглянем на это окно повнимательнее. В основном меня все в нем устраивает, за исключением того, что мне предлагается осу­ществить выбор из всех имеющихся файлов. А если я хочу, чтобы мне был показаны только файлы с расширением «ехе» или «txt»? Могу ли я каким-нибудь образом изменить фильтр? А на этот во­прос ответить не так просто, как на первый. Здесь ответ не лежит на поверхности. Что ж, делать нечего, придется опять разбираться с исходным текстом MFC.</p>
<p>Поставим точку прерывания на методе CWinApp::OnFileOpen() в файле appdlg.cpp и запустим программу на выполнение. Стоп! Выполнение программы приостановилось. Исходный текст мето­да, на котором мы остановились, приведен ниже:</p>
<p>docmgr.cpp берем исходный код</p>
<p>метода CDocManager::OnFileOpen():</p>
<p><b>void CDocManager::OnFileOpen() {</b></p>
<p><b>// prompt the user (with all document templates) CString newName;</b></p>
<p><b>if (!DoPromptFileName(newName,</b></p>
<p><b>AFX_IDS_OPENFILE, OFN_HIDEREADONLY | FN_FILEMUS TEX1ST,</b></p>
<p><b>TRUE, NULL))</b></p>
<p><b>return; // open cancelled</b></p>
<p><b>AfxGetApp()-&gt;OpenDocumentFile(newName)/</b></p>
<p><b>// if returns NULL, the userhas already been alerted</b></p>
<p>CDocManager::OnFileOpen ]</p>
<p>Здесь же явно видно, что процесс открытия файла J разделен на два этапа. Этап</p>
<p>первый &#8211; вызов метода DoPromptFileNameO (забегая вперед, скажу, что именно эта функция обеспечивает подготов­ку и выдачу диалогового окна для выбора файла). Этап второй -непосредственно открытие файла и преобразование его в доку­мент. Наверное, логично будет, если мы изложение материала так же разделим на две части. В первой части мы должны рассмот­реть, каким образом формируется стандартное диалоговое окно для выбора открываемого файла. Кроме этого, мы должны опре­делить, каким образом мы можем повлиять на процесс формиро­вания этого окна. Во второй части нам необходимо понять, что про­исходит после того, как имя открываемого файла определено. Дру­гими словами, нам нужно понять, как из файла рождается доку­мент. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.programmfc.ru/uncategorized/%d0%bc%d0%b5%d1%82%d0%be%d0%b4-cwinapponfileopen.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Создание документа</title>
		<link>http://www.programmfc.ru/uncategorized/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b4%d0%be%d0%ba%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0.html</link>
		<comments>http://www.programmfc.ru/uncategorized/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b4%d0%be%d0%ba%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0.html#comments</comments>
		<pubDate>Wed, 03 Feb 2010 19:39:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Архитектура]]></category>
		<category><![CDATA[Первая программа на MFC]]></category>
		<category><![CDATA[Работа с файлами]]></category>
		<category><![CDATA[CWinApp]]></category>
		<category><![CDATA[OnFileOpen]]></category>

		<guid isPermaLink="false">http://www.programmfc.ru/uncategorized/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b4%d0%be%d0%ba%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0.html</guid>
		<description><![CDATA[Итак, мы создали заготовку шаблона документа. Но до сих пор нам не ясно, что происходит непосредственно после того, как мы выбе­рем элемент «Ореп» меню «File». Другими словами, мы не знаем, как происходит открытие документа.
Естественно, до написания этих заметок я уже трассировал метод CWinApp::OnFileOpen(). Поэтому мне бы хотелось, чтобы чи­татель набрался терпения. Работа предстоит не очень [...]]]></description>
			<content:encoded><![CDATA[<p>Итак, мы создали заготовку шаблона документа. Но до сих пор нам не ясно, что происходит непосредственно после того, как мы выбе­рем элемент «Ореп» меню «File». Другими словами, мы не знаем, как происходит открытие документа.</p>
<p>Естественно, до написания этих заметок я уже трассировал метод CWinApp::OnFileOpen(). Поэтому мне бы хотелось, чтобы чи­татель набрался терпения. Работа предстоит не очень сложная, однако достаточно кропотливая.</p>
<p>(cWinApp::OnFileOpen J <sup>Итак</sup>&gt;<sup>после</sup> создания шаблона документа нам необходимо создать документ. О том, что такое документ и что нам необходимо сделать для того, чтобы создать его, мы пока не имеем ни малейшего понятия. Именно поэто­му мы не сделали НИКАКИХ изменений при вызове конструктора шаб­лона. Указатель на информацию времени выполнения нашего доку­мента при инициализации шаблона до сих пор равен NULL.</p>
<p>Что ж, откомпилируем нашу программу и постараемся выпол­нить ее. Так, окно отобразилось. Выбираем элемент «Ореп» меню «File»&#8230; Вот это да! В этот момент произошло то, чего я, честно говоря, никак не ожидал. На экране появилось стандартное диало­говое окно (см. 12), предлагающее мне осуществить выбор того файла, который будет открыт.</p>
<p>Откуда оно взялось? Я же не писал ни строчки кода для вызова этого окна! Мне так и захотелось воскликнуть: «Ай да MFC!» © Биб­лиотека оказала мне такую услугу! Как вспомню о том множестве полей, которые необходимо было заполнить соответствующими зна­чениями при подготовке стандартного диалогового окна&#8230; Ответ на вопрос о «происхождении» окна очевиден. Код, обеспечиваю­щий выдачу диалогового окна находится где-то в недрах MFC. Иначе</p>
<p><i>) tookpif^</i>MyProjects</p>
<p>· sti</p>
<p>· the first<b></b></p>
<p><b>Fitebarne:: </b>r[&quot; <b>.Files of typer</b></p>
<p><b>Cancel</b></p>
<p>просто и быть не может. По мановению волшебной палочки стан­дартные диалоговые окна не создаются.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programmfc.ru/uncategorized/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b4%d0%be%d0%ba%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b0.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CWinApp</title>
		<link>http://www.programmfc.ru/uncategorized/cwinapp.html</link>
		<comments>http://www.programmfc.ru/uncategorized/cwinapp.html#comments</comments>
		<pubDate>Wed, 03 Feb 2010 19:38:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Архитектура]]></category>
		<category><![CDATA[Первая программа на MFC]]></category>
		<category><![CDATA[Работа с файлами]]></category>
		<category><![CDATA[CDocTemplate]]></category>
		<category><![CDATA[CWinApp]]></category>
		<category><![CDATA[Метод CWinApp]]></category>

		<guid isPermaLink="false">http://www.programmfc.ru/uncategorized/cwinapp.html</guid>
		<description><![CDATA[Здесь мы увидим кое-что интересное. Так&#8230; MFC пытается за­грузить меню и таблицу акселераторов&#8230; Но их идентификатор совпадает с идентификатором строки, которую пытается загрузить конструктор базового класса! Отсюда следующие выводы.
Вывод первый. В состав ресурсов, идентификатор которых используется при создании шаблона документа, могут входить строка, меню и таблица акселераторов. Вывод второй (обратный первому). Идентификаторы строки, меню и [...]]]></description>
			<content:encoded><![CDATA[<p>Здесь мы увидим кое-что интересное. Так&#8230; MFC пытается за­грузить меню и таблицу акселераторов&#8230; Но их идентификатор совпадает с идентификатором строки, которую пытается загрузить конструктор базового класса! Отсюда следующие выводы.</p>
<p>Вывод первый. В состав ресурсов, идентификатор которых используется при создании шаблона документа, могут входить строка, меню и таблица акселераторов. Вывод второй (обратный первому). Идентификаторы строки, меню и таблицы акселераторов, которые будут использоваться при работе программы, написанной в соответствии с архитектурой «документ/представление»,<span style="text-decoration: underline;">должны быть ОДИНАКОВЫМИ!</span></p>
<p>Таким образом, мы в первом приближении поняли, какого рода ресурсы должны содержаться в нашем приложении. Пока нам не совсем ясно, где используются эти ресурсы. Но, надеюсь, в даль­нейшем мы сможем вычислить, где используются эти ресурсы и, со­ответственно, создать их.</p>
<p>Метод CWinApp::AddDocTemplate(CDocTemplate* pTemplate) ни­чего интересного для нас в себе не содержит. В нем происходит инициализация списка шаблонов и добавление шаблона в этот список. Мне кажется, что более подробное рассмотрение этого вопроса ничего существенного к пониманию нами процесса созда­ния шаблона не добавит.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://www.programmfc.ru/image/5.jpg" alt="Пример" width="402" height="301" /></p>
<p>Ну, кажется, «охота на ресурсы» завершена успешно. Мы выяс­нили, какие ресурсы могут входить в состав приложения. Обрати­те, пожалуйста, внимание на то, что мы НИ РАЗУ не заглянули в документацию, предлагаемую MSDN, или в какие-нибудь другие пособия по MFC. Исходный код MFC позволил нам самостоятель­но сделать выводы, приведенные выше.</p>
<p>Теперь, можно немного отдохнуть, выпить чашку чая или кофе, а потом продолжить рассмотрение. В дальнейшем мы остано­вимся на процессах, происходящих при создании документа.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programmfc.ru/uncategorized/cwinapp.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
