﻿<?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++博客-万水千山只等闲-随笔分类-VC++深入详解</title><link>http://www.cppblog.com/weining45/category/19454.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 20 Jun 2012 14:29:06 GMT</lastBuildDate><pubDate>Wed, 20 Jun 2012 14:29:06 GMT</pubDate><ttl>60</ttl><item><title>第4章	简单绘图</title><link>http://www.cppblog.com/weining45/archive/2012/06/05/177612.html</link><dc:creator>Winnie</dc:creator><author>Winnie</author><pubDate>Tue, 05 Jun 2012 01:34:00 GMT</pubDate><guid>http://www.cppblog.com/weining45/archive/2012/06/05/177612.html</guid><wfw:comment>http://www.cppblog.com/weining45/comments/177612.html</wfw:comment><comments>http://www.cppblog.com/weining45/archive/2012/06/05/177612.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weining45/comments/commentRss/177612.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weining45/services/trackbacks/177612.html</trackback:ping><description><![CDATA[<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-size: 10pt">MFC</span><span style="font-family: 宋体; font-size: 10pt">消息映射机制：</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-family: 宋体; font-size: 10pt">在每个能接收和处理消息的类中，定义一个消息和消息函数静态对照表，即消息映射表。在消息映射表中，消息与对应的消息处理函数指针是成对出现的。某个类能处理的所有消息及其对应的消息处理函数的地址都列在这个类所对应的静态表中。当有消息需要处理时，程序只要搜索该消息静态表，查看表中是否含有该消息，就可知道该类能否处理此消息。如果能处理该消息，则同样依照静态表能很容易找到并调用对应的消息处理函数。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-family: 宋体; font-size: 10pt">在程序中，当构造一个</span><span style="font-size: 10pt">GDI</span><span style="font-family: 宋体; font-size: 10pt">对象后，该对象并不会立即生效，必须选入设备描述表，它才会在以后的绘制操作中生效。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-family: 宋体; font-size: 10pt">一般情况下，在完成绘图操作之后，都要利用</span><span style="font-size: 10pt">SelectObject</span><span style="font-family: 宋体; font-size: 10pt">函数把先前的</span><span style="font-size: 10pt">GDI</span><span style="font-family: 宋体; font-size: 10pt">对象选入设备描述表，以便使其恢复到先前的状态。</span></p><img src ="http://www.cppblog.com/weining45/aggbug/177612.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weining45/" target="_blank">Winnie</a> 2012-06-05 09:34 <a href="http://www.cppblog.com/weining45/archive/2012/06/05/177612.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第3章	MFC框架程序剖析</title><link>http://www.cppblog.com/weining45/archive/2012/06/05/177611.html</link><dc:creator>Winnie</dc:creator><author>Winnie</author><pubDate>Tue, 05 Jun 2012 01:33:00 GMT</pubDate><guid>http://www.cppblog.com/weining45/archive/2012/06/05/177611.html</guid><wfw:comment>http://www.cppblog.com/weining45/comments/177611.html</wfw:comment><comments>http://www.cppblog.com/weining45/archive/2012/06/05/177611.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weining45/comments/commentRss/177611.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weining45/services/trackbacks/177611.html</trackback:ping><description><![CDATA[<p style="text-indent: 21pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span lang="EN-US"><font face="Calibri"><span style="font-size: 10pt">MFC</span></font></span><span style="font-family: 宋体; font-size: 10pt; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin">是微软为了简化程序员的开发工作，将大部分的</span><span lang="EN-US"><font face="Calibri"><span style="font-size: 10pt">Windows API</span></font></span><span style="font-family: 宋体; font-size: 10pt; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin">函数封装到</span><span lang="EN-US"><font face="Calibri"><span style="font-size: 10pt">C++</span></font></span><span style="font-family: 宋体; font-size: 10pt; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin">类中的面向对象的框架，是面向对象的函数库。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span lang="EN-US"><font face="Calibri"><span style="font-size: 10pt">CWnd</span></font></span><span style="font-family: 宋体; font-size: 10pt; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin">类是</span><span lang="EN-US"><font face="Calibri"><span style="font-size: 10pt">MFC</span></font></span><span style="font-family: 宋体; font-size: 10pt; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin">中一个非常重要的类，它封装了与窗口相关的操作。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span lang="EN-US"><font face="Calibri"><span style="font-size: 10pt">MFC</span></font></span><span style="font-family: 宋体; font-size: 10pt; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin">中的</span><span lang="EN-US"><font face="Calibri"><span style="font-size: 10pt">WinMain</span></font></span><span style="font-family: 宋体; font-size: 10pt; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin">函数是在程序编译链接时，由链接器将该函数链接到程序中的。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: 宋体; font-size: 10pt; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin">无论全局变量，还是全局对象，程序在运行时，在加载</span><span lang="EN-US"><font face="Calibri"><span style="font-size: 10pt">main</span></font></span><span style="font-family: 宋体; font-size: 10pt; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin">函数之前，就已经为全局变量或全局对象分配了内存空间。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: 宋体; font-size: 10pt; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin">应用程序的实例是由实例句柄来标识的。对于</span><span lang="EN-US"><font face="Calibri"><span style="font-size: 10pt">MFC</span></font></span><span style="font-family: 宋体; font-size: 10pt; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin">程序来说，通过产生一个应用程序类的对象来唯一标识应用程序的实例。每个</span><span lang="EN-US"><font face="Calibri"><span style="font-size: 10pt">MFC</span></font></span><span style="font-family: 宋体; font-size: 10pt; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin">程序有且仅有一个从应用程序类派生的类。每个</span><span lang="EN-US"><font face="Calibri"><span style="font-size: 10pt">MFC</span></font></span><span style="font-family: 宋体; font-size: 10pt; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin">程序实例有且仅有一个该派生类的实例化对象，该对象表示了应用程序本身。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span lang="EN-US"><font face="Calibri"><span style="font-size: 10pt">Afx</span></font></span><span style="font-family: 宋体; font-size: 10pt; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin">前缀的函数代表应用程序框架函数。应用程序框架实际上是一套辅助我们生成应用程序的框架模型，该模型把多个类进行了一个有机的集成，可以根据该模型提供的方案来设计我们自己的应用程序。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span lang="EN-US"><font face="Calibri"><span style="font-size: 10pt">InitApplication</span></font></span><span style="font-family: 宋体; font-size: 10pt; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin">函数完成</span><span lang="EN-US"><font face="Calibri"><span style="font-size: 10pt">MFC</span></font></span><span style="font-family: 宋体; font-size: 10pt; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin">内部管理方面的工作。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: 宋体; font-size: 10pt; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin">微软在设计基础类库时，考虑到要把数据本身与它的显示分离开，于是就采用文档</span><span lang="EN-US"><font face="Calibri"><span style="font-size: 10pt">/</span></font></span><span style="font-family: 宋体; font-size: 10pt; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin">视图结构。数据的存储和加载由文档类来完成，数据的显示和修改则由视图类来完成。</span></p><span style="font-family: 宋体; font-size: 10pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">定义一个单文档模板对象，把文档对象、框架对象、视图对象有机地组织在一起；利用</span><span style="font-family: 'Calibri','sans-serif'; font-size: 10pt; mso-fareast-font-family: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US">AddDocTemplate</span><span style="font-family: 宋体; font-size: 10pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">函数把这个单文档模板添加到文档模板中，从而把这三个类组织成为一个整体。</span> <img src ="http://www.cppblog.com/weining45/aggbug/177611.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weining45/" target="_blank">Winnie</a> 2012-06-05 09:33 <a href="http://www.cppblog.com/weining45/archive/2012/06/05/177611.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第2章	掌握C++</title><link>http://www.cppblog.com/weining45/archive/2012/06/05/177610.html</link><dc:creator>Winnie</dc:creator><author>Winnie</author><pubDate>Tue, 05 Jun 2012 01:33:00 GMT</pubDate><guid>http://www.cppblog.com/weining45/archive/2012/06/05/177610.html</guid><wfw:comment>http://www.cppblog.com/weining45/comments/177610.html</wfw:comment><comments>http://www.cppblog.com/weining45/archive/2012/06/05/177610.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weining45/comments/commentRss/177610.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weining45/services/trackbacks/177610.html</trackback:ping><description><![CDATA[<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-family: 宋体; font-size: 10pt">如果一个类中没有定义任何构造函数，那么</span><span style="font-size: 10pt">C++</span><span style="font-family: 宋体; font-size: 10pt">编译器在某些情况下会为该类提供一个默认的构造函数，这个默认的构造函数是一个不带参数的构造函数。只要一个类汇总定义了一个构造函数，不管这个构造函数是否是带参数的构造函数，</span><span style="font-size: 10pt">C++</span><span style="font-family: 宋体; font-size: 10pt">编译器就不再提供默认的构造函数。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-family: 宋体; font-size: 10pt">如果一个类中没有定义任何的构造函数，那么编译器只有在以下三种情况，才会提供默认的构造函数：</span></p>
<p style="text-indent: -21pt; margin: 0cm 0cm 6pt 42pt"><span style="font-size: 10pt">1)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; font-size: 10pt">如果类有虚拟成员函数或者虚拟继承父类（即有虚拟基类）时；</span></p>
<p style="text-indent: -21pt; margin: 0cm 0cm 6pt 42pt"><span style="font-size: 10pt">2)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; font-size: 10pt">如果类的基类有构造函数（可以是用户定义的构造函数，或编译器提供的默认构造函数）；</span></p>
<p style="text-indent: -21pt; margin: 0cm 0cm 6pt 42pt"><span style="font-size: 10pt">3)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; font-size: 10pt">在类中的所有非静态的对象数据成员，它们所属的类中有构造函数（可以是用户定义的构造函数，或编译器提供的默认构造函数）。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-family: 宋体; font-size: 10pt">在类中定义成员变量时，不能直接给成员变量赋初值。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-family: 宋体; font-size: 10pt">基类中的</span><span style="font-size: 10pt">private</span><span style="font-family: 宋体; font-size: 10pt">成员不能被派生类访问，因此</span><span style="font-size: 10pt">private</span><span style="font-family: 宋体; font-size: 10pt">成员不能被派生类所继承。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-family: 宋体; font-size: 10pt">函数的覆盖：基类函数必须是虚函数，发生覆盖的两个函数分别位于派生类和基类中，函数的名称与参数列表必须完全相同。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-family: 宋体; font-size: 10pt">函数的隐藏：派生类中具有与基类同名的函数，不考虑参数列表是否相同，从而在派生类中隐藏了基类的同名函数。</span></p><span style="font-family: 宋体; font-size: 10pt">生成可执行文件有两个步骤：</span><span style="font-family: 'Calibri','sans-serif'; font-size: 10pt">1.C++</span><span style="font-family: 宋体; font-size: 10pt">编译器对源文件单独进行编译：先由预处理器对预处理指令进行处理，在内存中输出翻译单元；编译器接收预处理的输出，将源代码转换成包含机器语言指令的目标文件。注意，在编译过程中，头文件不参见编译。</span><span style="font-family: 'Calibri','sans-serif'; font-size: 10pt">2.</span><span style="font-family: 宋体; font-size: 10pt">连接器将目标文件和所用到的</span><span style="font-family: 'Calibri','sans-serif'; font-size: 10pt">C++</span><span style="font-family: 宋体; font-size: 10pt">类库文件一起链接生成可执行文件。</span> <img src ="http://www.cppblog.com/weining45/aggbug/177610.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weining45/" target="_blank">Winnie</a> 2012-06-05 09:33 <a href="http://www.cppblog.com/weining45/archive/2012/06/05/177610.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第1章	Windows程序内部运行机制</title><link>http://www.cppblog.com/weining45/archive/2012/06/05/177609.html</link><dc:creator>Winnie</dc:creator><author>Winnie</author><pubDate>Tue, 05 Jun 2012 01:32:00 GMT</pubDate><guid>http://www.cppblog.com/weining45/archive/2012/06/05/177609.html</guid><wfw:comment>http://www.cppblog.com/weining45/comments/177609.html</wfw:comment><comments>http://www.cppblog.com/weining45/archive/2012/06/05/177609.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weining45/comments/commentRss/177609.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weining45/services/trackbacks/177609.html</trackback:ping><description><![CDATA[<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-family: 宋体; font-size: 10pt">编写标准</span><span style="font-size: 10pt">C</span><span style="font-family: 宋体; font-size: 10pt">程序经常调用的</span><span style="font-size: 10pt">C</span><span style="font-family: 宋体; font-size: 10pt">库函数是由编译器厂商提供的。</span><span style="font-size: 10pt">Windows</span><span style="font-family: 宋体; font-size: 10pt">平台下也有类似的函数可供调用，不同的是，这些函数是由</span><span style="font-size: 10pt">Windows</span><span style="font-family: 宋体; font-size: 10pt">操作系统本身提供的。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-size: 10pt">Windows</span><span style="font-family: 宋体; font-size: 10pt">操作系统提供了各种各样的函数，以方便我们开发</span><span style="font-size: 10pt">Windows</span><span style="font-family: 宋体; font-size: 10pt">应用程序，这些函数是</span><span style="font-size: 10pt">Windows</span><span style="font-family: 宋体; font-size: 10pt">操作系统提供给应用程序编程的接口，简称为</span><span style="font-size: 10pt">API</span><span style="font-family: 宋体; font-size: 10pt">函数。所有主要的</span><span style="font-size: 10pt">Windows</span><span style="font-family: 宋体; font-size: 10pt">函数都在</span><span style="font-size: 10pt">Windows.h</span><span style="font-family: 宋体; font-size: 10pt">头文件中进行了声明。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-size: 10pt">MSDN</span><span style="font-family: 宋体; font-size: 10pt">是微软向开发人员提供的一套帮助系统，其中包含大量的开发文档、技术文章和示例代码。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-size: 10pt">Win32 SDK</span><span style="font-family: 宋体; font-size: 10pt">是</span><span style="font-size: 10pt">Windows 32</span><span style="font-family: 宋体; font-size: 10pt">位平台下的软件开发包，包括了</span><span style="font-size: 10pt">API</span><span style="font-family: 宋体; font-size: 10pt">函数、帮助文档、微软提供的一些辅助开发工具。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-family: 宋体; font-size: 10pt">窗口是</span><span style="font-size: 10pt">Windows</span><span style="font-family: 宋体; font-size: 10pt">应用程序中的一个非常重要的元素，一个</span><span style="font-size: 10pt">Windows</span><span style="font-family: 宋体; font-size: 10pt">应用程序至少要有一个窗口。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-family: 宋体; font-size: 10pt">在消息的结构体中有相关窗口的句柄，消息类型，消息参数，时间和鼠标位置等信息。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-family: 宋体; font-size: 10pt">每一个</span><span style="font-size: 10pt">Windows</span><span style="font-family: 宋体; font-size: 10pt">应用程序开始执行后，系统都会为该程序创建一个消息队列，这个消息队列用来存放该程序创建的窗口的消息。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-size: 10pt">Windows</span><span style="font-family: 宋体; font-size: 10pt">程序中的消息可以分为&#8220;进队消息&#8221;和&#8220;不进队消息&#8221;。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-family: 宋体; font-size: 10pt">在函数调用过程中，会使用栈。</span><span style="font-size: 10pt">_stdcall</span><span style="font-family: 宋体; font-size: 10pt">与</span><span style="font-size: 10pt">_cdecl</span><span style="font-family: 宋体; font-size: 10pt">是两种不同的函数调用约定，定义了函数参数入栈的顺序，由调用函数还是被调用函数将参数弹出栈，以及产生函数修饰名的方法。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-size: 10pt">Windows</span><span style="font-family: 宋体; font-size: 10pt">应用程序的入口是</span><span style="font-size: 10pt">WinMain</span><span style="font-family: 宋体; font-size: 10pt">函数，由插入到可执行文件中的启动代码调用。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-size: 10pt">WinMain</span><span style="font-family: 宋体; font-size: 10pt">函数的参数指定了该程序当前运行的实例句柄，命令行参数，以及窗口应该如何显示。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-family: 宋体; font-size: 10pt">设计窗体类就是指定窗口的特征，包括窗口的样式，窗口过程函数，</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-family: 宋体; font-size: 10pt">窗口过程函数被调用的过程如下：</span></p>
<p style="text-indent: -21pt; margin: 0cm 0cm 6pt 42pt"><span style="font-size: 10pt">1)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; font-size: 10pt">在设计窗口类的时候，将窗口过程函数的地址赋值给</span><span style="font-size: 10pt">lpfnWWndProc</span><span style="font-family: 宋体; font-size: 10pt">成员变量；</span></p>
<p style="text-indent: -21pt; margin: 0cm 0cm 6pt 42pt"><span style="font-size: 10pt">2)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; font-size: 10pt">调用</span><span style="font-size: 10pt">RegsiterClass(&amp;wndclass)</span><span style="font-family: 宋体; font-size: 10pt">注册窗口类，那么系统就有了我们所编写的窗口过程函数的地址；</span></p>
<p style="text-indent: -21pt; margin: 0cm 0cm 6pt 42pt"><span style="font-size: 10pt">3)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; font-size: 10pt">当应用程序接收到某一窗口的消息时，调用</span><span style="font-size: 10pt">DispatchMessage(&amp;msg)</span><span style="font-family: 宋体; font-size: 10pt">将消息回传给系统，系统则利用先前注册窗口类时得到的函数指针，调用窗口过程函数对消息进行处理。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-size: 10pt">Win32</span><span style="font-family: 宋体; font-size: 10pt">的</span><span style="font-size: 10pt">API</span><span style="font-family: 宋体; font-size: 10pt">函数都遵循</span><span style="font-size: 10pt">_stdcall</span><span style="font-family: 宋体; font-size: 10pt">调用约定。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-family: 宋体; font-size: 10pt">在</span><span style="font-size: 10pt">VC++</span><span style="font-family: 宋体; font-size: 10pt">开发环境中，默认的编译选项是</span><span style="font-size: 10pt">_cdecl</span><span style="font-family: 宋体; font-size: 10pt">。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-family: 宋体; font-size: 10pt">在</span><span style="font-size: 10pt">Windows</span><span style="font-family: 宋体; font-size: 10pt">程序中，回调函数必须遵循</span><span style="font-size: 10pt">_stdcall</span><span style="font-family: 宋体; font-size: 10pt">调用约定。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-family: 宋体; font-size: 10pt">要在窗口中输出文字或者显示图形，需要用到设备描述表</span><span style="font-size: 10pt">DC</span><span style="font-family: 宋体; font-size: 10pt">。</span><span style="font-size: 10pt">DC</span><span style="font-family: 宋体; font-size: 10pt">是一个包含设备信息的结构体，在</span><span style="font-size: 10pt">Windows</span><span style="font-family: 宋体; font-size: 10pt">平台下，所有的图形操作都是利用</span><span style="font-size: 10pt">DC</span><span style="font-family: 宋体; font-size: 10pt">来完成的。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-family: 宋体; font-size: 10pt">当窗口从无到有、改变尺寸、最小化后恢复、被其他窗口遮盖后再显示时，窗口的客户区都将变为无效。当窗口客户区的一部分或者全部变为&#8220;无效&#8221;时，系统会发送</span><span style="font-size: 10pt">WM_PAINT</span><span style="font-family: 宋体; font-size: 10pt">消息，通知应用程序重新绘制窗口。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><span style="font-family: 宋体; font-size: 10pt">当窗口刚创建的时候，整个客户区都是无效的。因为这个时候程序还没有在窗口上绘制任何东西，当调用</span><span style="font-size: 10pt">UpdateWindow</span><span style="font-family: 宋体; font-size: 10pt">函数时，会发送</span><span style="font-size: 10pt">WM_PAINT</span><span style="font-family: 宋体; font-size: 10pt">消息给窗口过程，对窗口进行刷新。</span></p><img src ="http://www.cppblog.com/weining45/aggbug/177609.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weining45/" target="_blank">Winnie</a> 2012-06-05 09:32 <a href="http://www.cppblog.com/weining45/archive/2012/06/05/177609.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>