﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Sunshine Alike-随笔分类-MFC</title><link>http://www.cppblog.com/sunshinealike/category/9769.html</link><description>半完美主义</description><language>zh-cn</language><lastBuildDate>Wed, 08 Apr 2009 12:50:40 GMT</lastBuildDate><pubDate>Wed, 08 Apr 2009 12:50:40 GMT</pubDate><ttl>60</ttl><item><title>MFC Intro</title><link>http://www.cppblog.com/sunshinealike/archive/2009/03/25/77858.html</link><dc:creator>Sunshine Alike</dc:creator><author>Sunshine Alike</author><pubDate>Wed, 25 Mar 2009 11:02:00 GMT</pubDate><guid>http://www.cppblog.com/sunshinealike/archive/2009/03/25/77858.html</guid><wfw:comment>http://www.cppblog.com/sunshinealike/comments/77858.html</wfw:comment><comments>http://www.cppblog.com/sunshinealike/archive/2009/03/25/77858.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/sunshinealike/comments/commentRss/77858.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunshinealike/services/trackbacks/77858.html</trackback:ping><description><![CDATA[
		<h3 style="margin: 13pt 0cm;">
				<span style="font-size: 14pt; line-height: 173%;" lang="EN-US">
						<o:p>
						</o:p>
				</span> </h3>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">了解如何使用</span>
				<span lang="EN-US">windows API</span>
				<span style="font-family: 宋体;">函数编程后，对</span>
				<span lang="EN-US">windows</span>
				<span style="font-family: 宋体;">应用程序的大体结构框架有初步的认识。但是直接使用</span>
				<span lang="EN-US">windows API</span>
				<span style="font-family: 宋体;">进行编程程序员需要自己编写大量代码。像我这种从一开始接触程序开发就是学习的</span>
				<span lang="EN-US">OO</span>
				<span style="font-family: 宋体;">的人来说，实在是无法忍受。从现在开始，我把重点转到</span>
				<span lang="EN-US">VC++</span>
				<span style="font-family: 宋体;">的另一方面，利用</span>
				<span lang="EN-US">MFC</span>
				<span style="font-family: 宋体;">进行和向导来编写</span>
				<span lang="EN-US">windows</span>
				<span style="font-family: 宋体;">程序。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<b style="">
						<span lang="EN-US">MFC</span>
				</b>
				<b style="">
						<span style="font-family: 宋体;">（</span>
						<span lang="EN-US">Microsoft Foundation Class</span>
				</b>
				<b style="">
						<span style="font-family: 宋体;">）</span>
				</b>
				<span style="font-family: 宋体;">是用来编写</span>
				<span lang="EN-US">windows</span>
				<span style="font-family: 宋体;">应用程序的</span>
				<span lang="EN-US">C++</span>
				<span style="font-family: 宋体;">类集，它封装了大量的</span>
				<span lang="EN-US">windows API</span>
				<span style="font-family: 宋体;">函数和</span>
				<span lang="EN-US">windows</span>
				<span style="font-family: 宋体;">控件，并且以层次结构组织起来。使程序员在开发时能方便的进行代码重用，加快开发速度并提高代码的可靠性。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">应该注意的是</span>
				<span lang="EN-US">MFC</span>
				<span style="font-family: 宋体;">是</span> 使用<span lang="EN-US">C++</span><span style="font-family: 宋体;">语言实现的一个<strong>类库</strong>，但并非是进行</span><span lang="EN-US">GUI</span><span style="font-family: 宋体;">程序设计的唯一标准。</span></p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">有</span>
				<span lang="EN-US">OO</span>
				<span style="font-family: 宋体;">基础或者是学习过</span>
				<span lang="EN-US">JAVA</span>
				<span style="font-family: 宋体;">语言理解</span>
				<span lang="EN-US">MFC</span>
				<span style="font-family: 宋体;">的体系结构会比较轻松。目前，</span>
				<span lang="EN-US">MFC</span>
				<span style="font-family: 宋体;">中包含了大约</span>
				<span lang="EN-US">100</span>
				<span style="font-family: 宋体;">多个类，通过定义类对象并调用对象的成员函数来实现相应的功能。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">下面简要介绍一下</span>
				<span lang="EN-US">MFC</span>
				<span style="font-family: 宋体;">的类组织结构：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;">
				<span style="" lang="EN-US">
						<span style="">1.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				</span>
				<span style="font-family: 宋体;">根类</span>
				<span lang="EN-US">CObject</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span lang="EN-US">MFC</span>
				<span style="font-family: 宋体;">中绝大多数类和自定义子类的根类，它提供了许多编程所需要的公共操作如：对象建立和删除、串行化支持、对象诊断、运行时信息以及集合类的兼容等</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;">
				<span style="" lang="EN-US">
						<span style="">2.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				</span>
				<span style="font-family: 宋体;">命令相关类</span>
				<span lang="EN-US">CCmdTarget</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span style="font-family: 宋体;">它是</span>
				<span lang="EN-US">CObject</span>
				<span style="font-family: 宋体;">的直接子类，它是</span>
				<span lang="EN-US">MFC</span>
				<span style="font-family: 宋体;">中具有消息映射属性的基类。一般很少需要程序员直接从</span>
				<span lang="EN-US">CcmdTarget</span>
				<span style="font-family: 宋体;">直接派生新类。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;">
				<span style="" lang="EN-US">
						<span style="">3.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				</span>
				<span style="font-family: 宋体;">线程基类</span>
				<span lang="EN-US">CWinThread</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span style="font-family: 宋体;">所有线程的基类，可以直接使用，它封装了操作系统的线程化功能。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;">
				<span style="" lang="EN-US">
						<span style="">4.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				</span>
				<span style="font-family: 宋体;">窗口应用程序类</span>
				<span lang="EN-US">CWinApp</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span style="font-family: 宋体;">每个应用程序有且只有一个应用程序对象，在运行程序中该对象与其它对象相互协调，该对象从</span>
				<span lang="EN-US">CwinApp</span>
				<span style="font-family: 宋体;">类中派生而来。它封装了初始化，运行，终止应用程序的代码。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;">
				<span style="" lang="EN-US">
						<span style="">5.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				</span>
				<span style="font-family: 宋体;">文档</span>
				<span lang="EN-US">/</span>
				<span style="font-family: 宋体;">视类</span>
				<span lang="EN-US">CDocument/CView</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span style="font-family: 宋体;">文档对象由文档模板对象创建，管理应用程序的数据。</span>
				<span lang="EN-US">CDocument</span>
				<span style="font-family: 宋体;">支持标准的文档操作，这些操作包括文档创建、下载、保存等。一个应用程序可以操作多种文档类型，每一种文档类型都有特定的文档模板（</span>
				<span lang="EN-US">document template</span>
				<span style="font-family: 宋体;">）。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span style="font-family: 宋体;">用户通过文档和相关联的视图对象（</span>
				<span lang="EN-US">CView object</span>
				<span style="font-family: 宋体;">）与文档进行交互。一个视图显示文档中的信息，并把用户在框架窗口内的操作转换成对文档操作的相应命令。当用户打开一个文档时，应用程序实际上创建了一个视图并把这个视图和相应的文档联系在一起。一个视图充当了沟通用户和文档对象的中间桥梁的作用。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;">
				<span style="" lang="EN-US">
						<span style="">6.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				</span>
				<span style="font-family: 宋体;">可视对象类</span>
				<span lang="EN-US">CWnd</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span style="font-family: 宋体;">该类提供了</span>
				<span lang="EN-US">MFC</span>
				<span style="font-family: 宋体;">中所有窗口类的基本功能，它的消息<b style="">映射机制</b>隐藏了窗口<b style="">函数</b></span>
				<b style="">
						<span lang="EN-US">WndProc</span>
				</b>
				<span style="font-family: 宋体;">。一个</span>
				<span lang="EN-US">windows</span>
				<span style="font-family: 宋体;">消息通过消息映射发送到相应的</span>
				<span lang="EN-US">CWnd</span>
				<span style="font-family: 宋体;">类的</span>
				<span lang="EN-US">OnMessage</span>
				<span style="font-family: 宋体;">成员函数，通过重载</span>
				<span lang="EN-US">OnMessage</span>
				<span style="font-family: 宋体;">函数来对特定的消息进行处理。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span lang="EN-US">CWnd</span>
				<span style="font-family: 宋体;">类有许多经常使用的子类，如</span>
				<span lang="EN-US">CMenu</span>
				<span style="font-family: 宋体;">类，</span>
				<span lang="EN-US">CDialog</span>
				<span style="font-family: 宋体;">类，</span>
				<span lang="EN-US">CButton</span>
				<span style="font-family: 宋体;">类等等。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;">
				<span style="" lang="EN-US">
						<span style="">7.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				</span>
				<span style="font-family: 宋体;">通用类</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span style="font-family: 宋体;">通用类提供了许多共用服务，例如文件</span>
				<span lang="EN-US">I/O</span>
				<span style="font-family: 宋体;">（</span>
				<span lang="EN-US">CFile</span>
				<span style="font-family: 宋体;">类和</span>
				<span lang="EN-US">CArchive</span>
				<span style="font-family: 宋体;">类）、异常处理（</span>
				<span lang="EN-US">CException</span>
				<span style="font-family: 宋体;">类）等。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;">
				<span style="" lang="EN-US">
						<span style="">8.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				</span>
				<span lang="EN-US">OLE</span>
				<span style="font-family: 宋体;">类</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span lang="EN-US">OLE1.0</span>
				<span style="font-family: 宋体;">规范是</span>
				<span lang="EN-US">MS</span>
				<span style="font-family: 宋体;">在</span>
				<span lang="EN-US">1991</span>
				<span style="font-family: 宋体;">年发布的。它是处理复合文档的一种方法：</span>
				<span lang="EN-US">Object Linking and Embedding</span>
				<span style="font-family: 宋体;">技术。所谓复合文档，就是在一个文档中同时保存了如文本、图像和声音等多种不同类型的数据，而这些数据又可以通过不同的应用程序用不同的格式产生。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span lang="EN-US">1993</span>
				<span style="font-family: 宋体;">年发布的</span>
				<span lang="EN-US">OLE2.0</span>
				<span style="font-family: 宋体;">是基本对象的一整套体系结构，能够扩展、定制和增强服务功能，它的理论基础是</span>
				<span lang="EN-US">COM</span>
				<span style="font-family: 宋体;">技术。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span style="font-family: 宋体;">此外，</span>
				<span lang="EN-US">ActiveX</span>
				<span style="font-family: 宋体;">也是一种对</span>
				<span lang="EN-US">OLE</span>
				<span style="font-family: 宋体;">技术的扩展，它使</span>
				<span lang="EN-US">OLE</span>
				<span style="font-family: 宋体;">进入</span>
				<span lang="EN-US">Internet</span>
				<span style="font-family: 宋体;">和</span>
				<span lang="EN-US">Intranet</span>
				<span style="font-family: 宋体;">。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;">
				<span style="" lang="EN-US">
						<span style="">9.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				</span>
				<span lang="EN-US">ODBC</span>
				<span style="font-family: 宋体;">类</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span style="font-family: 宋体;">为了支持带有</span>
				<span lang="EN-US">ODBC</span>
				<span style="font-family: 宋体;">驱动程序的各种数据库管理系统，</span>
				<span lang="EN-US">MFC</span>
				<span style="font-family: 宋体;">也提供了</span>
				<span lang="EN-US">Cdatabase</span>
				<span style="font-family: 宋体;">和</span>
				<span lang="EN-US">CRecordset</span>
				<span style="font-family: 宋体;">类，用于管理数据库的连接及其操作。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;">
				<span style="" lang="EN-US">
						<span style="">10.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">     </span></span>
				</span>
				<span lang="EN-US">MFC</span>
				<span style="font-family: 宋体;">中全局函数和变量</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span style="font-family: 宋体;">在</span>
				<span lang="EN-US">MFC</span>
				<span style="font-family: 宋体;">中提供的全局函数和变量一般都以</span>
				<span lang="EN-US">Afx</span>
				<span style="font-family: 宋体;">开头，它们可以在</span>
				<span lang="EN-US">MFC</span>
				<span style="font-family: 宋体;">应用程序的任务地方中使用，如：</span>
				<span lang="EN-US">AfxAbort</span>
				<span style="font-family: 宋体;">、</span>
				<span lang="EN-US">AfxMessageBox</span>
				<span style="font-family: 宋体;">等等。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">在使用</span>
				<span lang="EN-US">VC</span>
				<span style="font-family: 宋体;">生成</span>
				<span lang="EN-US">MFC</span>
				<span style="font-family: 宋体;">应用程序时，</span>
				<span lang="EN-US">IDE</span>
				<span style="font-family: 宋体;">会自动生成许多代码，以一个简单的对话框程序为例，将会有如下几个主要的文件：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">stdafx.h/cpp <span style="">                </span></span>
				<span style="font-family: 宋体;">标准系统包含文件，或是常使用但不常更改的</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">MFCles1.h/.cpp<span style="">            </span></span>
				<span style="font-family: 宋体;">应用程序类</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">MFCles1Dlg.h/cpp<span style="">        </span></span>
				<span style="font-family: 宋体;">对话框类</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Resource.h<span style="">                   </span></span>
				<span style="font-family: 宋体;">资源头文件，被</span>
				<span lang="EN-US">MFCles1.rc</span>
				<span style="font-family: 宋体;">所使用</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="font-family: Wingdings;" lang="EN-US">
						<span style=""><span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">           </span></span>
				</span>
				<b style="">
						<span lang="EN-US">MFC</span>
				</b>
				<b style="">
						<span style="font-family: 宋体;">应用程序的一般结构</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span style="font-family: 宋体;">就设计模式来看，</span>
				<span lang="EN-US">MFC</span>
				<span style="font-family: 宋体;">应用程序是一个标准的单例模式。每一个应用程序有且仅有一个实例对象：</span>
				<span lang="EN-US">theApp</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<b style="">
						<span style="font-family: 宋体;">程序执行的基本流程，就我现在的理解而言：</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span style="font-family: 宋体;">首先应该从在应用程序体系结构类中声明的一个全局实例对象</span>
				<span lang="EN-US">theApp</span>
				<span style="font-family: 宋体;">入手（C++里的全局类对象初始化在main函数之前），在进入CWinApp类的构造函数之后，程序才进入原来Windows　API里的那个入口函数：<b>AfxWinMain</b>。</span>
				<span lang="EN-US">
				</span>
				<span style="font-family: 宋体;">
				</span>
				<span lang="EN-US">我们在写MFC程序时</span>并<span style="font-family: 宋体;">没有显示的指出</span><span lang="EN-US">WinMain</span><span style="font-family: 宋体;">入口函数的位置。这个函数的定义被安置在了APPMODUL.CPP</span><span style="font-family: 宋体;">文件里（这一文件位于VS安装目录下的VC98目录里的MFC源文件里）</span><span lang="EN-US"></span><span style="font-family: 宋体;">。每个</span><span lang="EN-US">app</span><span style="font-family: 宋体;">实例被构造后，会产调用相应的</span><b><span style="font-family: 新宋体;" lang="EN-US">InitInstance</span></b><span style="font-family: 新宋体;">函数进行初始化。原来的<b>注册窗口类</b>的工作被放在了WINCORE.CPP文件里的<b>AfxEndDeferRegisterClass</b>函数，这里MFC已经为我们定义好了几种默认的窗口类。然后就会调用<b>CPreCreateWnd</b>函数进行窗口的显示工作。最后，使用CWinThread：：Run方法启动消息循环，至此，整个窗口应用程序就运行起来了。<span lang="EN-US">windows</span>应用程序可以被同时多次运行，第一次运行完成初始化工作后，以后每次运行程序拷贝都全调用<span lang="EN-US">InitInstance</span>函数进行初始化工作。<span lang="EN-US"><o:p></o:p></span></span></p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">class CMFCles1App : public CWinApp</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">{</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">public:</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">
						<span style="">       </span>CMFCles1App();</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">// </span>
				<span style="font-family: 宋体;">重写一些父类方法</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">
						<span style="">       </span>public:</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">
						<span style="">       </span>virtual BOOL InitInstance();</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">// </span>
				<span style="font-family: 宋体;">实现消息映射的宏</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">
						<span style="">       </span>DECLARE_MESSAGE_MAP()</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">};</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">extern CMFCles1App theApp;//</span>
				<span style="font-family: 宋体;">代码应用程序本身</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;">以一个简单的对话框程序为例，在<span lang="EN-US">InitInstance</span>函数里完成了以下工作<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">CMFCles1Dlg dlg;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>m_pMainWnd = &amp;dlg;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span style="font-family: 新宋体;" lang="EN-US">INT_PTR nResponse = dlg.DoModal();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span style="font-family: 新宋体;">第一行声明了一个对话框类对象，第二行将其赋值给当前应用程序类的成员变量，这是一个指向主窗口的指针，最后一行显示窗口。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span style="font-family: 新宋体;">了解了一点关于应用程序类的知识后，再来分析剩下的与<span lang="EN-US">GUI</span>有关的另一个类，这里使用一个对话框类作一点说明。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span style="font-family: 宋体;">同样，</span>
				<span lang="EN-US">MFCles1Dlg</span>
				<span style="font-family: 宋体;">则派生自</span>
				<span lang="EN-US">CDialog</span>
				<span style="font-family: 宋体;">类</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">class CMFCles1Dlg : public CDialog</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">{</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">public:</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">
						<span style="">       </span>CMFCles1Dlg(CWnd* pParent = NULL);<span style="">    </span>// </span>
				<span style="font-family: 宋体;">标准构造函数</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">protected:</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">
						<span style="">       </span>HICON m_hIcon;//</span>
				<span style="font-family: 宋体;">应用程序图标的句柄</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt;">
				<span lang="EN-US">DECLARE_MESSAGE_MAP()</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">
						<span style="">       </span>// </span>
				<span style="font-family: 宋体;">生成的消息映射函数</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">
						<span style="">       </span>virtual BOOL OnInitDialog();</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">
						<span style="">       </span>afx_msg void OnSysCommand(UINT nID, LPARAM lParam);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">
						<span style="">       </span>afx_msg void OnPaint();</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">
						<span style="">       </span>afx_msg HCURSOR OnQueryDragIcon();</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">};</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">DECLARE_MESSAGE_MAP() </span>
				<span style="font-family: 宋体;">是一个用来定义消息映射的宏，而下面以</span>
				<span lang="EN-US">afx_msg</span>
				<span style="font-family: 宋体;">开头的函数都是消息的响应函数，这比起</span>
				<span lang="EN-US">API</span>
				<span style="font-family: 宋体;">里面把消息都写在一些</span>
				<span lang="EN-US">switch</span>
				<span style="font-family: 宋体;">语句中要更清楚，也方便了修改。要实现对话框对消息的响应还需要在类中加上这两行</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span style="font-family: 新宋体;" lang="EN-US">END_MESSAGE_MAP()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span style="font-family: 新宋体;">所有的消息映射函数都要写在这两行之间，例如<span lang="EN-US">ON_WM_RBUTTONDOWN( )</span>就定义了一个右键按下的消息映射。<span lang="EN-US">MFC</span>已经有了预定义好了许多消息映射函数的格式，需要查看可以参考<span lang="EN-US">MSDN</span>。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
<img src ="http://www.cppblog.com/sunshinealike/aggbug/77858.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunshinealike/" target="_blank">Sunshine Alike</a> 2009-03-25 19:02 <a href="http://www.cppblog.com/sunshinealike/archive/2009/03/25/77858.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>