﻿<?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++博客-citywanderer-文章分类-C++</title><link>http://www.cppblog.com/citywanderer/category/1956.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 04 Jul 2008 12:48:30 GMT</lastBuildDate><pubDate>Fri, 04 Jul 2008 12:48:30 GMT</pubDate><ttl>60</ttl><item><title>MFC消息映射的实现（转）</title><link>http://www.cppblog.com/citywanderer/articles/14461.html</link><dc:creator>citywanderer</dc:creator><author>citywanderer</author><pubDate>Wed, 01 Nov 2006 02:03:00 GMT</pubDate><guid>http://www.cppblog.com/citywanderer/articles/14461.html</guid><wfw:comment>http://www.cppblog.com/citywanderer/comments/14461.html</wfw:comment><comments>http://www.cppblog.com/citywanderer/articles/14461.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/citywanderer/comments/commentRss/14461.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/citywanderer/services/trackbacks/14461.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: http://www.blog.edu.cn/user2/28873/archives/2005/252013.shtml												http://www.vczx.com/tutorial/mfc/mfc4.php						消息映射的实现																																													...&nbsp;&nbsp;<a href='http://www.cppblog.com/citywanderer/articles/14461.html'>阅读全文</a><img src ="http://www.cppblog.com/citywanderer/aggbug/14461.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/citywanderer/" target="_blank">citywanderer</a> 2006-11-01 10:03 <a href="http://www.cppblog.com/citywanderer/articles/14461.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Assembly</title><link>http://www.cppblog.com/citywanderer/articles/9286.html</link><dc:creator>citywanderer</dc:creator><author>citywanderer</author><pubDate>Sun, 02 Jul 2006 08:46:00 GMT</pubDate><guid>http://www.cppblog.com/citywanderer/articles/9286.html</guid><wfw:comment>http://www.cppblog.com/citywanderer/comments/9286.html</wfw:comment><comments>http://www.cppblog.com/citywanderer/articles/9286.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/citywanderer/comments/commentRss/9286.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/citywanderer/services/trackbacks/9286.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 今天比较搞笑，在看《Inside vc.net》的com的时候，讲到了c++中的vftable，这个虚拟表还真不是很清楚，所以就在网上查了一些关于vftable的资料，地址为：http://blog.csdn.net/gzjh1/archive/2006/05/26/756024.aspx，转贴一下：）在面向对象的C++语言中，虚函数（virtual function）是一个非常重要的概念。因为它...&nbsp;&nbsp;<a href='http://www.cppblog.com/citywanderer/articles/9286.html'>阅读全文</a><img src ="http://www.cppblog.com/citywanderer/aggbug/9286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/citywanderer/" target="_blank">citywanderer</a> 2006-07-02 16:46 <a href="http://www.cppblog.com/citywanderer/articles/9286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>The relation between MFC class and Resource</title><link>http://www.cppblog.com/citywanderer/articles/9170.html</link><dc:creator>citywanderer</dc:creator><author>citywanderer</author><pubDate>Thu, 29 Jun 2006 10:14:00 GMT</pubDate><guid>http://www.cppblog.com/citywanderer/articles/9170.html</guid><wfw:comment>http://www.cppblog.com/citywanderer/comments/9170.html</wfw:comment><comments>http://www.cppblog.com/citywanderer/articles/9170.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/citywanderer/comments/commentRss/9170.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/citywanderer/services/trackbacks/9170.html</trackback:ping><description><![CDATA[
		<br />
		<img src="file:///C:/Documents%20and%20Settings/newuser/Desktop/temp/untitled.bmp" />
		<br />                                 (<span class="fignum">Figure 1-1.</span><span class="description">The Visual C++ MFC application build process. in 《inside vc.net》</span>)<br />From Figure1.1 above, we can see that resource.h is the bridge between MFC files and Resource file. Any an ID value in resource.h corresponds to a control.<br /><strong>1、</strong>If haven't Resouce file, we can also create a control by Create function. For instance:<br />//in .h file<br />CButton m_nRTButton;<br />//in OnInitDialog() function<br />m_nRTButton.Create("RunTime", WS_CHILD|WS_VISIBLE|BS_AUTO3STATE, CRect(0,0,100,20), this, 100);<br /><pre><b>virtual BOOL</b><b>Create<br />(<br /></b><b>   LPCTSTR</b><span class="parameter">lpszCaption</span><b>,<br /></b><b>   DWORD</b><span class="parameter">dwStyle</span><b>,<br /></b><b>   const</b><b>RECT&amp;</b><span class="parameter">rect</span><b>,<br /></b><b>   CWnd*</b><span class="parameter">pParentWnd</span><b>,<br /></b><b>   UINT</b><span class="parameter">nID<br /></span><strong>);<br /></strong>nID can be any number if you will use it later, otherwise, the id number may conflict with <br />others.<br /><strong>2、</strong>If you want to change data between a control and a variable, here are three ways as <br />follow:<br />(1):DDX_Control(……)<br />……<br />(2):object = (Class*)GetDlgItem(nID)<br />The class must derive from CWND, and the data flow just from variable to control <strong>i think</strong><br />(3):Create(……)<br />CButton m_nRTButton;<br />m_nRTButton.Create("RunTime", WS_CHILD|WS_VISIBLE|BS_AUTO3STATE, CRect(0,0,100,20), this, 100);<br />as above.<br />(4):create an object of the class corresponding to a resource.<br />Of cource if you want to generate a modeless dialog, you must use Create function, otherwise<br />, you can</pre><img src ="http://www.cppblog.com/citywanderer/aggbug/9170.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/citywanderer/" target="_blank">citywanderer</a> 2006-06-29 18:14 <a href="http://www.cppblog.com/citywanderer/articles/9170.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Start my network program with winpcap using C++</title><link>http://www.cppblog.com/citywanderer/articles/8868.html</link><dc:creator>citywanderer</dc:creator><author>citywanderer</author><pubDate>Fri, 23 Jun 2006 03:14:00 GMT</pubDate><guid>http://www.cppblog.com/citywanderer/articles/8868.html</guid><wfw:comment>http://www.cppblog.com/citywanderer/comments/8868.html</wfw:comment><comments>http://www.cppblog.com/citywanderer/articles/8868.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/citywanderer/comments/commentRss/8868.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/citywanderer/services/trackbacks/8868.html</trackback:ping><description><![CDATA[go on...<img src ="http://www.cppblog.com/citywanderer/aggbug/8868.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/citywanderer/" target="_blank">citywanderer</a> 2006-06-23 11:14 <a href="http://www.cppblog.com/citywanderer/articles/8868.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Inside MFC: Handle Maps and Temporary Objects</title><link>http://www.cppblog.com/citywanderer/articles/8824.html</link><dc:creator>citywanderer</dc:creator><author>citywanderer</author><pubDate>Thu, 22 Jun 2006 03:34:00 GMT</pubDate><guid>http://www.cppblog.com/citywanderer/articles/8824.html</guid><wfw:comment>http://www.cppblog.com/citywanderer/comments/8824.html</wfw:comment><comments>http://www.cppblog.com/citywanderer/articles/8824.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/citywanderer/comments/commentRss/8824.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/citywanderer/services/trackbacks/8824.html</trackback:ping><description><![CDATA[
		<a href="http://www.mindfiresolutions.com/download/Inside%20MFC=Handle%20Maps%20and%20Temporary%20Objects.pdf">http://www.mindfiresolutions.com/download/Inside%20MFC=Handle%20Maps%20and%20Temporary%20Objects.pdf</a>
<img src ="http://www.cppblog.com/citywanderer/aggbug/8824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/citywanderer/" target="_blank">citywanderer</a> 2006-06-22 11:34 <a href="http://www.cppblog.com/citywanderer/articles/8824.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.Net2005中项目工程的配置</title><link>http://www.cppblog.com/citywanderer/articles/8786.html</link><dc:creator>citywanderer</dc:creator><author>citywanderer</author><pubDate>Wed, 21 Jun 2006 08:06:00 GMT</pubDate><guid>http://www.cppblog.com/citywanderer/articles/8786.html</guid><wfw:comment>http://www.cppblog.com/citywanderer/comments/8786.html</wfw:comment><comments>http://www.cppblog.com/citywanderer/articles/8786.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/citywanderer/comments/commentRss/8786.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/citywanderer/services/trackbacks/8786.html</trackback:ping><description><![CDATA[
		<p>这里以《深入浅出MFC》中的hello程序为例。<br />1、创建一个General的空项目。<br />2、将后缀为.RC、.H、.CPP、.ICO的文件copy到新建目录下。<br />3、将这些文件添加到project中去。<br />4、在Project-〉Properties-〉ConfigurationProperties-〉Linker-〉System-〉Subsystem中选择Windows（/Subsystem：Windows）。（如果这里没有修改会产生这样的错误：Error 1 error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup libcmt.lib ，所有程序包括window、console等等都是从_tmainCRTStartup函数启动的，源代码可见……\Microsoft Visual Studio 8\VC\crt\src\crt0.c Line94，程序不同_tmainCRTStartup的定义也不同。）</p>
		<p>如果你想设断点调试的话，在C/C++-〉General-〉DebugInformationFormat中选择ProgramDatabase（/zi）</p>
<img src ="http://www.cppblog.com/citywanderer/aggbug/8786.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/citywanderer/" target="_blank">citywanderer</a> 2006-06-21 16:06 <a href="http://www.cppblog.com/citywanderer/articles/8786.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC调试入门(转)</title><link>http://www.cppblog.com/citywanderer/articles/8777.html</link><dc:creator>citywanderer</dc:creator><author>citywanderer</author><pubDate>Wed, 21 Jun 2006 02:22:00 GMT</pubDate><guid>http://www.cppblog.com/citywanderer/articles/8777.html</guid><wfw:comment>http://www.cppblog.com/citywanderer/comments/8777.html</wfw:comment><comments>http://www.cppblog.com/citywanderer/articles/8777.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/citywanderer/comments/commentRss/8777.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/citywanderer/services/trackbacks/8777.html</trackback:ping><description><![CDATA[
		<p align="center">
				<b>VC调试入门<br /></b>
				<br />
				<br />作者：<a href="mailto:arongustc@hotmail.com">阿荣</a></p>
		<p>
				<br />
				<img src="http://www.vckbase.com/document/image/paragraph.gif" /> 概述<br />调试是一个程序员最基本的技能，其重要性甚至超过学习一门语言。不会调试的程序员就意味着他即使会一门语言，却不能编制出任何好的软件。<br />这里我简要的根据自己的经验列出调试中比较常用的技巧，希望对大家有用。<br />本文约定，在选择菜单时，通过/表示分级菜单，例如File/Open表示顶级菜单File的子菜单Open。<br /> <br /><img src="http://www.vckbase.com/document/image/paragraph.gif" /> 设置<br />为了调试一个程序，首先必须使程序中包含调试信息。一般情况下，一个从AppWizard创建的工程中包含的Debug Configuration自动包含调试信息，但是是不是Debug版本并不是程序包含调试信息的决定因素，程序设计者可以在任意的Configuration中增加调试信息，包括Release版本。<br />为了增加调试信息，可以按照下述步骤进行： 
</p>
		<ul>
				<li>打开Project settings对话框（可以通过快捷键ALT+F7打开，也可以通过IDE菜单Project/Settings打开) 
</li>
				<li>选择C/C++页，Category中选择general ，则出现一个Debug Info下拉列表框，可供选择的调试信息 方式包括： <br />　 
<table id="AutoNumber1" style="BORDER-COLLAPSE: collapse" bordercolor="#111111" cellspacing="0" cellpadding="0" width="614" border="1"><tbody><tr><td align="middle" width="56"><b>命令行</b></td><td align="middle" width="160"><b>Project settings</b></td><td align="middle" width="394"><b>说明</b></td></tr><tr><td width="56">无</td><td width="160">None</td><td width="394">没有调试信息</td></tr><tr><td width="56">/Zd</td><td width="160">Line Numbers Only</td><td width="394">目标文件或者可执行文件中只包含全局和导出符号以及代码行信息，不包含符号调试信息</td></tr><tr><td width="56">/Z7</td><td width="160">C 7.0- Compatible</td><td width="394">目标文件或者可执行文件中包含行号和所有符号调试信息，包括变量名及类型，函数及原型等</td></tr><tr><td width="56">/Zi</td><td width="160">Program Database</td><td width="394">创建一个程序库(PDB)，包括类型信息和符号调试信息。</td></tr><tr><td width="56">/ZI</td><td width="160">Program Database for Edit and Continue</td><td width="394">除了前面/Zi的功能外，这个选项允许对代码进行调试过程中的修改和继续执行。这个选项同时使#pragma设置的优化功能无效</td></tr></tbody></table><br /></li>
				<li>选择Link页，选中复选框"Generate Debug Info"，这个选项将使连接器把调试信息写进可执行文件和DLL 
</li>
				<li>如果C/C++页中设置了Program Database以上的选项，则Link incrementally可以选择。选中这个选项，将使程序可以在上一次编译的基础上被编译（即增量编译），而不必每次都从头开始编译。 </li>
		</ul>
		<img src="http://www.vckbase.com/document/image/paragraph.gif" /> 断点<br />断点是调试器设置的一个代码位置。当程序运行到断点时，程序中断执行，回到调试器。断点是 最常用的技巧。调试时，只有设置了断点并使程序回到调试器，才能对程序进行在线调试。<br /><br />设置断点：可以通过下述方法设置一个断点。首先把光标移动到需要设置断点的代码行上，然后 
<ul><li>按F9快捷键 
</li><li>弹出Breakpoints对话框，方法是按快捷键CTRL+B或ALT+F9，或者通过菜单Edit/Breakpoints打开。打开后点击Break at编辑框的右侧的箭头，选择 合适的位置信息。一般情况下，直接选择line xxx就足够了，如果想设置不是当前位置的断点，可以选择Advanced，然后填写函数、行号和可执行文件信息。 </li></ul>去掉断点：把光标移动到给定断点所在的行，再次按F9就可以取消断点。同前面所述，打开Breakpoints对话框后，也可以按照界面提示去掉断点。<br /><br />条件断点：可以为断点设置一个条件，这样的断点称为条件断点。对于新加的断点，可以单击Conditions按钮，为断点设置一个表达式。当这个表达式发生改变时，程序就 被中断。底下设置包括“观察数组或者结构的元素个数”，似乎可以设置一个指针所指向的内存区的大小，但是我设置一个比较的值但是改动 范围之外的内存区似乎也导致断点起效。最后一个设置可以让程序先执行多少次然后才到达断点。<br /><br />数据断点：数据断点只能在Breakpoints对话框中设置。选择“Data”页，就显示了设置数据断点的对话框。在编辑框中输入一个表达式，当这个 表达式的值发生变化时，数据断点就到达。一般情况下，这个表达式应该由运算符和全局变量构成，例如：在编辑框中输入 g_bFlag这个全局变量的名字，那么当程序中有g_bFlag= !g_bFlag时，程序就将停在这个语句处。<br /><br />消息断点：VC也支持对Windows消息进行截获。他有两种方式进行截获：窗口消息处理函数和特定消息中断。<br />在Breakpoints对话框中选择Messages页，就可以设置消息断点。如果在上面那个对话框中写入消息处理函数的名字，那么 每次消息被这个函数处理，断点就到达（我觉得如果采用普通断点在这个函数中截获，效果应该一样）。如果在底下的下拉 列表框选择一个消息，则每次这种消息到达，程序就中断。<br /><br /><img src="http://www.vckbase.com/document/image/paragraph.gif" /> 值<br /><b>Watch</b><br />VC支持查看变量、表达式和内存的值。所有这些观察都必须是在断点中断的情况下进行。<br />观看变量的值最简单，当断点到达时，把光标移动到这个变量上，停留一会就可以看到变量的值。<br />VC提供一种被成为Watch的机制来观看变量和表达式的值。在断点状态下，在变量上单击右键，选择Quick Watch， 就弹出一个对话框，显示这个变量的值。<br />单击Debug工具条上的Watch按钮，就出现一个Watch视图（Watch1,Watch2,Watch3,Watch4），在该视图中输入变量或者表达式，就可以观察 变量或者表达式的值。注意：这个表达式不能有副作用，例如++运算符绝对禁止用于这个表达式中，因为这个运算符将修改变量的值，导致 软件的逻辑被破坏。<br /><br /><b>Memory</b><br />由于指针指向的数组，Watch只能显示第一个元素的值。为了显示数组的后续内容，或者要显示一片内存的内容，可以使用memory功能。在 Debug工具条上点memory按钮，就弹出一个对话框，在其中输入地址，就可以显示该地址指向的内存的内容。<b><br /><br />Varibles</b><br />Debug工具条上的Varibles按钮弹出一个框，显示所有当前执行上下文中可见的变量的值。特别是当前指令涉及的变量，以红色显示。<br /><br /><b>寄存器</b><br />Debug工具条上的Reigsters按钮弹出一个框，显示当前的所有寄存器的值。<br /><br /><img src="http://www.vckbase.com/document/image/paragraph.gif" /> 进程控制<br />VC允许被中断的程序继续运行、单步运行和运行到指定光标处，分别对应快捷键F5、F10/F11和CTRL+F10。各个快捷键功能如下： <br />　 
<table id="AutoNumber2" style="BORDER-COLLAPSE: collapse" bordercolor="#111111" cellspacing="0" cellpadding="0" width="91%" border="1"><tbody><tr><td align="middle" width="30%"><b>快捷键</b></td><td align="middle" width="70%"><b>说明</b></td></tr><tr><td align="middle" width="30%">F5</td><td width="70%">继续运行</td></tr><tr><td align="middle" width="30%">F10</td><td width="70%">单步，如果涉及到子函数，不进入子函数内部</td></tr><tr><td align="middle" width="30%">F11</td><td width="70%">单步，如果涉及到子函数，进入子函数内部</td></tr><tr><td align="middle" width="30%">CTRL+F10</td><td width="70%">运行到当前光标处。</td></tr></tbody></table><p><img src="http://www.vckbase.com/document/image/paragraph.gif" /> Call Stack<br />调用堆栈反映了当前断点处函数是被那些函数按照什么顺序调用的。单击Debug工具条上的Call stack就显示Call Stack对话框。在CallStack对话框中显示了一个调用系列，最上面的是当前函数，往下依次是调用函数的上级函数。单击这些函数名可以跳到对应的函数中去。<br /><br /><img src="http://www.vckbase.com/document/image/paragraph.gif" /> 其他调试手段<br />系统提供一系列特殊的函数或者宏来处理Debug版本相关的信息，如下： </p><table id="AutoNumber3" style="BORDER-COLLAPSE: collapse" bordercolor="#111111" cellspacing="0" cellpadding="0" width="86%" border="1"><tbody><tr><td align="middle" width="42%"><b>宏名/函数名</b></td><td align="middle" width="58%"><b>说明</b></td></tr><tr><td align="middle" width="42%">TRACE</td><td width="58%">使用方法和printf完全一致，他在output框中输出调试信息</td></tr><tr><td align="middle" width="42%">ASSERT</td><td width="58%">它接收一个表达式，如果这个表达式为TRUE，则无动作，否则中断当前程序执行。对于系统中出现这个宏 导致的中断，应该认为你的函数调用未能满足系统的调用此函数的前提条件。例如，对于一个还没有创建的窗口调用SetWindowText等。</td></tr><tr><td align="middle" width="42%">VERIFY</td><td width="58%">和ASSERT功能类似，所不同的是，在Release版本中，ASSERT不计算输入的表达式的值，而VERIFY计算表达式的值。</td></tr></tbody></table><p><img src="http://www.vckbase.com/document/image/paragraph.gif" /> 关注<br />一个好的程序员不应该把所有的判断交给编译器和调试器，应该在程序中自己加以程序保护和错误定位，具体措施包括： 
</p><ul><li>对于所有有返回值的函数，都应该检查返回值，除非你确信这个函数调用绝对不会出错，或者不关心它是否出错。 
</li><li>一些函数返回错误，需要用其他函数获得错误的具体信息。例如accept返回INVALID_SOCKET表示accept失败，为了查明 具体的失败原因，应该立刻用WSAGetLastError获得错误码，并针对性的解决问题。 
</li><li>有些函数通过异常机制抛出错误，应该用TRY-CATCH语句来检查错误 
</li><li>程序员对于能处理的错误，应该自己在底层处理，对于不能处理的，应该报告给用户让他们决定怎么处理。如果程序出了异常， 却不对返回值和其他机制返回的错误信息进行判断，只能是加大了找错误的难度。 </li></ul>另外：VC中要编制程序不应该一开始就写cpp/h文件，而应该首先创建一个合适的工程。因为只有这样，VC才能选择合适的编译、连接 选项。对于加入到工程中的cpp文件，应该检查是否在第一行显式的包含stdafx.h头文件，这是Microsoft Visual Studio为了加快编译 速度而设置的预编译头文件。在这个#include "stdafx.h"行前面的所有代码将被忽略，所以其他头文件应该在这一行后面被包含。<br />对于.c文件，由于不能包含stdafx.h，因此可以通过Project settings把它的预编译头设置为“不使用”，方法是： 
<ul><li>弹出Project settings对话框 
</li><li>选择C/C++ 
</li><li>Category选择Precompilation Header 
</li><li>选择不使用预编译头</li></ul><img src ="http://www.cppblog.com/citywanderer/aggbug/8777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/citywanderer/" target="_blank">citywanderer</a> 2006-06-21 10:22 <a href="http://www.cppblog.com/citywanderer/articles/8777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>剖析MFC内幕</title><link>http://www.cppblog.com/citywanderer/articles/8716.html</link><dc:creator>citywanderer</dc:creator><author>citywanderer</author><pubDate>Mon, 19 Jun 2006 09:51:00 GMT</pubDate><guid>http://www.cppblog.com/citywanderer/articles/8716.html</guid><wfw:comment>http://www.cppblog.com/citywanderer/comments/8716.html</wfw:comment><comments>http://www.cppblog.com/citywanderer/articles/8716.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/citywanderer/comments/commentRss/8716.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/citywanderer/services/trackbacks/8716.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 使用MFC向导，生成一个对话框的应用程序。通过调试、设置断点的方式解析MFC程序。下面只是给出主要的源代码以及它们所在文件的名字。  1/**//*  2    Noun Explain:   3    1、CRT: C run-time  4    you can refer to C运行库到底是什么东西？它和操作系统有没有关系？  5    http://tech.cixiong.com/t/...&nbsp;&nbsp;<a href='http://www.cppblog.com/citywanderer/articles/8716.html'>阅读全文</a><img src ="http://www.cppblog.com/citywanderer/aggbug/8716.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/citywanderer/" target="_blank">citywanderer</a> 2006-06-19 17:51 <a href="http://www.cppblog.com/citywanderer/articles/8716.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows message categories</title><link>http://www.cppblog.com/citywanderer/articles/8685.html</link><dc:creator>citywanderer</dc:creator><author>citywanderer</author><pubDate>Sun, 18 Jun 2006 06:19:00 GMT</pubDate><guid>http://www.cppblog.com/citywanderer/articles/8685.html</guid><wfw:comment>http://www.cppblog.com/citywanderer/comments/8685.html</wfw:comment><comments>http://www.cppblog.com/citywanderer/articles/8685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/citywanderer/comments/commentRss/8685.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/citywanderer/services/trackbacks/8685.html</trackback:ping><description><![CDATA[
		<p>There are three main categories:<br />1、Command message:<br />This includes WM_COMMAND notification messages from user-interface objects: menus, toolbar buttons, and accelerator keys.(digested from msdn)<br />for example:<br /> Add click event handler to menuitem about, the MFC generate automatically three lines code( macro definition: ON_COMMAND(ID_HELP_ABOUT, OnAbout) in .cpp file , event handle function: void CCapturePacketDlg::OnAbout()  in .cpp file, and event handle function's declaration: void OnAbout() in .h file), the macro ON_COMMAND(ID_HELP_ABOUT, OnAbout) depresent:  { WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSigCmd_v, static_cast&lt;AFX_PMSG&gt; (memberFxn) }, among therm, <strong>WM_COMMAND is message id</strong>, and is also Command message.<br />2、Windows messages<br />This includes primarily those messages beginning with the WM_ prefix, except for WM_COMMAND. Windows messages are handled by windows and views. These messages often have parameters that are used in determining how to handle the message.(digested by msdn)<br />for example:<br />Add event handle function OnHotkey() witch responds to Alt + F5 to show or hide the main window. I don't kown how use MFC to add the event code automatically, so i add code into three places( macro definition: ON_MESSAGE(WM_HOTKEY, OnHotkey) in .cpp file , event handle function: LRESULT CCapturePacketDlg::OnHotkey(WPARAM wp,LPARAM lp) in .cpp file, and event handle function's declaration: LRESULT OnHotkey(WPARAM wp,LPARAM lp) in .h file). But how does the application responde to Alt + F5? we must register the hot key, so i can call API RegisterHotKey in my dialog class's OnInitDialog function.<br />3、Control notifications <br />Sorry, so far, i have used it.</p>
<img src ="http://www.cppblog.com/citywanderer/aggbug/8685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/citywanderer/" target="_blank">citywanderer</a> 2006-06-18 14:19 <a href="http://www.cppblog.com/citywanderer/articles/8685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅析windows程序</title><link>http://www.cppblog.com/citywanderer/articles/8684.html</link><dc:creator>citywanderer</dc:creator><author>citywanderer</author><pubDate>Sun, 18 Jun 2006 04:05:00 GMT</pubDate><guid>http://www.cppblog.com/citywanderer/articles/8684.html</guid><wfw:comment>http://www.cppblog.com/citywanderer/comments/8684.html</wfw:comment><comments>http://www.cppblog.com/citywanderer/articles/8684.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/citywanderer/comments/commentRss/8684.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/citywanderer/services/trackbacks/8684.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 先给出一个纯净的Windows程序：												 1												#include 						&lt;						windows.h						&gt;																										 2																																		 3										...&nbsp;&nbsp;<a href='http://www.cppblog.com/citywanderer/articles/8684.html'>阅读全文</a><img src ="http://www.cppblog.com/citywanderer/aggbug/8684.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/citywanderer/" target="_blank">citywanderer</a> 2006-06-18 12:05 <a href="http://www.cppblog.com/citywanderer/articles/8684.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的深入浅出MFC之路</title><link>http://www.cppblog.com/citywanderer/articles/8683.html</link><dc:creator>citywanderer</dc:creator><author>citywanderer</author><pubDate>Sun, 18 Jun 2006 03:47:00 GMT</pubDate><guid>http://www.cppblog.com/citywanderer/articles/8683.html</guid><wfw:comment>http://www.cppblog.com/citywanderer/comments/8683.html</wfw:comment><comments>http://www.cppblog.com/citywanderer/articles/8683.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/citywanderer/comments/commentRss/8683.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/citywanderer/services/trackbacks/8683.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#000000" size="4">记得当初看侯先生的《深入浅出MFC》的时候，我是有一定的C++基础的，之前《windows程序设计》也看过大部分，但是对MFC还是看得非懂似懂。最主要的原因我想是理论并没有同实际结合，只是看书，自己并没有实际的去编示例程序，结果就是对书中所讲的没有主观的认识，印象也就不深刻了。<br />我本人在学校在公司一直做.net的项目，前段时间在外面接了一个网络监控的项目，也就是基于Winpcap的程序，这样促使我使用VC++。当熟悉了Winpcap之后，我发现我必须要深入MFC了。<br />虽然网络上存在很多的MFC入门之内的教程，但是我觉得每个人的基础不一样所掌握的知识也不一样，这就注定每个人学习MFC的过程是不尽相同。在介绍我学习MFC之前，我觉得我有必要提一下我具备的基础以及相应的学习过程：<br />1、C++基础知识。去年的时候，从公司回到家（租的地方）就呆在房间没有事情干了，就向室友借了一本机械出版社的《C++程序设计》，因为之前就有C++基础，这个只不过是温习一下，不到半个月就把那本书翻了一遍，书中的练习也作了一些（呵呵，还好那个时候工作不是很忙）。接着就一发不可收拾了，有很长一段时间我都在CSDN的C/C++板块混，尝试着回答别人的帖子，遇到自己不明白的或者是模糊的，我会在网上找资料，查看《C++Primer》，直到这个知识点搞懂为止。期间看了《高质量C++编程指南》、《C++Primer》，对内存分配、指针、数组、复杂的变量声明、结构体的对齐方式、参数传递、虚拟函数等都有了较深刻的认识（见我的msnBlog：<a href="http://citywanderer.spaces.msn.com/">http://citywanderer.spaces.msn.com</a>）。<br />2、英语基础。在这里为什么要提英语呢，因为我们必须要查msdn、要在google中搜索源代码。我是属于哑巴英语的那种，但由于是在公司的欧美部门，项目相关的文档都是英文，所以阅读英文资料是没有什么问题的。<br />3、Windows程序设计基础。MFC只是一个封装体，它的本质还是windows程序，所以了解windows程序设计的基础是必须的。在网上下载一个简单的windows程序的源代码（详见我的《解析windows程序》），  只要有一个msdn，加上你的C语言基础（对，这里并不要C++的知识），用个几天的时间搞懂这个windows程序（包括消息机制、类型，各种结构体……）就OK了。（附加API函数实现的源文件目录：\Microsoft Visual Studio 8\VC\atlmfc\src\）<br />4、深入浅出MFC。大家可以看看一位大虾写的MFC入门教程（<a href="http://www.vchelp.net/itbookreview/view_paper.asp?paper_id=1339">http://www.vchelp.net/itbookreview/view_paper.asp?paper_id=1339</a>），把它过一遍，对MFC有一个直观的认识。OK，看完这个教程之后，你应该明白了MFC的基本框架，等等，这该死的宏DECLARE_MESSAGE_MAP()、BEGIN_MESSAGE_MAP(class,baseclass)……是什么意思啊，要明白它，其实很简单，只有把这些宏全部展开了，详见我的文章《<a id="CategoryEntryList1_EntryStoryList_Entries_ctl00_TitleUrl" href="/citywanderer/articles/8660.html"><font color="#000080">解剖MFC消息宏定义</font></a> 》，好了如果这个时候你能将MFC中的类、方法对应到Windows的简单程序中去的话，这说明你对MFC的理解已经是差不多了。<br />再后来，当然你要清楚windows的各种消息了，用classWizard、EventWizard添加类和控件的事件，看MFC帮你添加了哪些东西，删除它们，自己手动添加，如果效果和MFC做的一样，那就恭喜你了（我们要知道这种wizard只是帮助我们减少开发时间的工具而已，我们只有明白了它们的本质，才能理直气壮地用它们，不然，你肯定会心虚的！）<br />再后来……哪里有这么多再后来！我也是才学到这里而已啦。<br /><br />希望能给各位初学MFC的看官一点帮助，我可能有些地方漏掉了，大家也可以回帖询问，我必定知而必言。</font>
		</p>
<img src ="http://www.cppblog.com/citywanderer/aggbug/8683.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/citywanderer/" target="_blank">citywanderer</a> 2006-06-18 11:47 <a href="http://www.cppblog.com/citywanderer/articles/8683.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解剖MFC自动生成的宏定义</title><link>http://www.cppblog.com/citywanderer/articles/8660.html</link><dc:creator>citywanderer</dc:creator><author>citywanderer</author><pubDate>Sat, 17 Jun 2006 06:20:00 GMT</pubDate><guid>http://www.cppblog.com/citywanderer/articles/8660.html</guid><wfw:comment>http://www.cppblog.com/citywanderer/comments/8660.html</wfw:comment><comments>http://www.cppblog.com/citywanderer/articles/8660.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/citywanderer/comments/commentRss/8660.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/citywanderer/services/trackbacks/8660.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、关于DECLARE_MESSAGE_MAP宏定义使用MFC向导，在ApplicationType页面选择DialogBased，生成一个对话框项目，Dialog类命名为CCapturePacketDlg，在CCapturePacketDlg.cpp中自动产生下列代码：						1								BEGIN_MESSAGE_MAP(CCapturePacketDlg, CDia...&nbsp;&nbsp;<a href='http://www.cppblog.com/citywanderer/articles/8660.html'>阅读全文</a><img src ="http://www.cppblog.com/citywanderer/aggbug/8660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/citywanderer/" target="_blank">citywanderer</a> 2006-06-17 14:20 <a href="http://www.cppblog.com/citywanderer/articles/8660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>