<?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</title>
	<atom:link href="http://www.programmfc.ru/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%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>Вызов метода PreCreateWindow</title>
		<link>http://www.programmfc.ru/uncategorized/%d0%b2%d1%8b%d0%b7%d0%be%d0%b2-%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d0%b0-precreatewindow.html</link>
		<comments>http://www.programmfc.ru/uncategorized/%d0%b2%d1%8b%d0%b7%d0%be%d0%b2-%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d0%b0-precreatewindow.html#comments</comments>
		<pubDate>Wed, 03 Feb 2010 19:53:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Первая программа на MFC]]></category>
		<category><![CDATA[PreCreateWindow]]></category>

		<guid isPermaLink="false">http://www.programmfc.ru/uncategorized/%d0%b2%d1%8b%d0%b7%d0%be%d0%b2-%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d0%b0-precreatewindow.html</guid>
		<description><![CDATA[Для нас главным в этом методе является то, что происходит вызов метода PreCreateWindow() для нашего объекта окна пред­ставления:



BOOL CEditView::PreCreateWindow(CREATESTRUCT&#38; cs) {
m_dwDefaultStyle = dwStyleDefault; return CCtrlView::PreCreateWindow(cs);
}
Вызов же метода PreCreateWindow() родительского объекта все ставит на свои места:
BOOL CCtrlView::PreCreateWindow(CREATESTRUCT&#38; cs) {
ASSERT(cs.IpszClass == NULL); cs.IpszClass = m_strClass;
// initialize common controls
VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTLS_REG)) ; AfxDeferRegisterClass(AFX_WNDCOMMCTLSNEW_REG);
// map default CView style to default style [...]]]></description>
			<content:encoded><![CDATA[<p>Для нас главным в этом методе является то, что происходит вызов метода PreCreateWindow() для нашего объекта окна пред­ставления:</p>
<p style="text-align: center;"><img class="aligncenter" src="http://www.programmfc.ru/image/1.jpg" alt="Пример" width="333" height="436" /></p>
<p><strong><br />
</strong></p>
<p><strong>BOOL CEditView::PreCreateWindow(CREATESTRUCT&amp; cs) {</strong></p>
<p><strong>m_dwDefaultStyle = dwStyleDefault; return CCtrlView::PreCreateWindow(cs);</strong></p>
<p>}</p>
<p>Вызов же метода PreCreateWindow() родительского объекта все ставит на свои места:</p>
<p><strong>BOOL CCtrlView::PreCreateWindow(CREATESTRUCT&amp; cs) {</strong></p>
<p><strong>ASSERT(cs.IpszClass == NULL); cs.IpszClass = m_strClass;</strong></p>
<p><strong>// initialize common controls</strong></p>
<p><strong>VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTLS_REG)) ; AfxDeferRegisterClass(AFX_WNDCOMMCTLSNEW_REG);</strong></p>
<p><strong>// map default CView style to default style // WS_BORDER is insignificant</strong></p>
<p><strong>if ((cs.style </strong>I <strong>WS_BORDER) == AFX_WS_DEFAULT_VIEW)</strong></p>
<p><strong>cs.style = m_dwDefaultStyle &amp; (cs.style | ~WS_BORDER);</strong></p>
<p><strong>return CView::PreCreateWindow(cs);</strong></p>
<p>}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programmfc.ru/uncategorized/%d0%b2%d1%8b%d0%b7%d0%be%d0%b2-%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d0%b0-precreatewindow.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Метод CreateEx</title>
		<link>http://www.programmfc.ru/uncategorized/%d0%bc%d0%b5%d1%82%d0%be%d0%b4-createex.html</link>
		<comments>http://www.programmfc.ru/uncategorized/%d0%bc%d0%b5%d1%82%d0%be%d0%b4-createex.html#comments</comments>
		<pubDate>Wed, 03 Feb 2010 19:53:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Первая программа на MFC]]></category>
		<category><![CDATA[PreCreateWindow]]></category>

		<guid isPermaLink="false">http://www.programmfc.ru/uncategorized/%d0%bc%d0%b5%d1%82%d0%be%d0%b4-createex.html</guid>
		<description><![CDATA[Нетрудно заметить, что метод Create(), в свою очередь, вызы­вает метод CreateEx():
BOOL CWnd::CreateEx(DWORD dwExStyle,
LPCTSTR IpszClassName,
LPCTSTR IpszWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU nIDorHMenu,
LPVOID lpParam)
{
/I allow modification of several common create parameters CREATESTRUCT cs; cs.dwExStyle = dwExStyle; cs.IpszClass = IpszClassName; cs.lpszName = IpszWindowName; cs.style = dwStyle; cs.x = x; cs.y = y; cs.cx = nWidth; cs.cy = [...]]]></description>
			<content:encoded><![CDATA[<p>Нетрудно заметить, что метод Create(), в свою очередь, вызы­вает метод CreateEx():</p>
<p><b>BOOL CWnd::CreateEx(DWORD dwExStyle,</b></p>
<p><b>LPCTSTR IpszClassName,</b></p>
<p><b>LPCTSTR IpszWindowName,</b></p>
<p><b>DWORD dwStyle,</b></p>
<p><b>int x,</b></p>
<p><b>int y,</b></p>
<p><b>int nWidth,</b></p>
<p><b>int nHeight,</b></p>
<p><b>HWND hWndParent,</b></p>
<p><b>HMENU nIDorHMenu,</b></p>
<p><b>LPVOID lpParam)</b></p>
<p><b><i>{</i></b></p>
<p><i>/I </i><b>allow modification of several common create parameters CREATESTRUCT cs; cs.dwExStyle = dwExStyle; cs.IpszClass = IpszClassName; cs.lpszName = IpszWindowName; cs.style = dwStyle; cs.x = x; cs.y = y; cs.cx = nWidth; cs.cy = nHeight; cs.hwndParent = hWndParent; cs.hMenu = nIDorHMenu;</b></p>
<p><b>cs.hlnstance = AfxGetlnstanceHandle(); cs.lpCreateParams = lpParam;</b></p>
<p><b>if (!PreCreateWindow(cs)) {</b></p>
<p><b>PostNcDestroy(); return FALSE;</b></p>
<p>}</p>
<p><b>AfxHookWindowCreate(this);</b></p>
<p><b>HWND hWnd = ::CreateWindowEx(cs.dwExStyle,</b></p>
<p><b>cs.IpszClass, cs.IpszName, cs.style, cs .x, cs.y, cs.cx, cs.cy,</b></p>
<p><b>cs.hwndParent,     <br />cs.hMenu,      <br />&#8216;*</b> <b>cs.hlnstance,</b></p>
<p><b>cs.lpCreateParams);</b></p>
<p><b>#ifdef _DEBUG</b></p>
<p><b>if (hWnd == NULL) {</b></p>
<p><b>TRACE1(&quot;Warning: Window creation failed:</b></p>
<p><b>GetLastError returns 0x%8.8X\n&quot;,</b></p>
<p><b>GetLastError ());</b></p>
<p><b>#endif</b></p>
<p><b>if (!AfxUnhookWindowCreate()) PostNcDestroy();</b></p>
<p><b>// cleanup if CreateWindowEx fails too soon</b></p>
<p><b>if (hWnd == NULL)</b></p>
<p><b>return FALSE;     <br />ASSERT (hWnd == m_hWnd) ;</b> <b><sup>fl</sup></b></p>
<p><b>// should have been set in send msg hook return TRUE;</b></p>
<p>}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programmfc.ru/uncategorized/%d0%bc%d0%b5%d1%82%d0%be%d0%b4-createex.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
