﻿<?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++博客-小山日志-随笔分类-windows program</title><link>http://www.cppblog.com/nj-blog/category/2936.html</link><description>读书,学习与思考.</description><language>zh-cn</language><lastBuildDate>Fri, 23 May 2008 22:37:57 GMT</lastBuildDate><pubDate>Fri, 23 May 2008 22:37:57 GMT</pubDate><ttl>60</ttl><item><title>Message Crack Wizard for Win32 SDK Developer</title><link>http://www.cppblog.com/nj-blog/archive/2006/11/02/14559.html</link><dc:creator>小山日志</dc:creator><author>小山日志</author><pubDate>Wed, 01 Nov 2006 16:00:00 GMT</pubDate><guid>http://www.cppblog.com/nj-blog/archive/2006/11/02/14559.html</guid><wfw:comment>http://www.cppblog.com/nj-blog/comments/14559.html</wfw:comment><comments>http://www.cppblog.com/nj-blog/archive/2006/11/02/14559.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/nj-blog/comments/commentRss/14559.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/nj-blog/services/trackbacks/14559.html</trackback:ping><description><![CDATA[本文译自<a class="" title="" href="www.codeproject.com" target="_blank">codeproject.com</a>，原文链接与工具及其源代码下载点击<a class="" title="" href="http://www.codeproject.com/win32/msgcrackwizard.asp" target="_blank">这里</a>。<br />－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br /> <span style="COLOR: rgb(255,153,0)">导引：WINDOWSX.H头文件简化Win32 SDK编程</span><br /><br />许多的新手或者调试程序员在编写C/C++的Windows API程序时都要面对像意大利面一样的<span style="COLOR: rgb(51,102,255)">switch...case<span style="COLOR: rgb(51,0,51)"><span style="COLOR: rgb(0,0,0)">代码块。当你需要加入一个消息处理到你的窗口处理过程中时，在些代码块中查找例如：<span style="COLOR: rgb(255,0,0)">WM_COMMAND</span>或<span style="COLOR: rgb(255,0,0)">WM_CHAR</span>，是相当让人恐惧的事情。<br /><br />早在Windows 3.1时代的Windows软件开发工具包和C/C++7.0编译器就附带一个包含一千多行Windows处理代码的头文件。这个头文件是<span style="FONT-STYLE: italic">&lt;windowsX.h&gt;</span>，它包含<br />了许多有用的宏。微软的对这个头文件的介绍如下：<br /></span></span></span><br /><ul><li>对C程序做更严格的类型检查的<span style="COLOR: rgb(255,0,0)">STRICT</span>宏。 
</li><li>一些简化Windows编程的通用操作的宏。 
</li><li>一些简化与Windows控件交流的控件宏。 
</li><li>消息分流器（一种方便，轻便并且类型安全的处理消息的方法）以及它们在Windows环境下的参数和返回值。 </li></ul><br />在Message Cracker Wizard被设计出现之前，我就从使用这些的宏中获得了效率。如果你对<span style="FONT-STYLE: italic">Windows.h</span>的简单描述感兴趣，你可以参见MS知识库的文章<a title="#8356" href="http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q83/4/56.asp">#8356</a> 。<br /><br />好了，让我们来介绍消息分流器的便利，以及，为什么这里发布的工具可以你编写代码的效率。<br /><br />当你在编写Win32 SDK程序时，你处理窗口消息通过一个窗口函数，通常命名为<span style="COLOR: rgb(255,0,0)">WndProc<span style="COLOR: rgb(0,0,0)">。在Windows C 程序中常见的是窗口函数通过关键字<span style="COLOR: rgb(51,51,255)">switch<span style="COLOR: rgb(0,0,0)">和分支标签<span style="COLOR: rgb(51,51,255)">case<span style="COLOR: rgb(0,0,0)">处理所有你需要处理的消息。<br /><br />可以料想的是我们通常需要在主窗口中处理<span style="COLOR: rgb(255,0,0)">WM_COMMAND<span style="COLOR: rgb(0,0,0)">，</span>WM_KEYUP<span style="COLOR: rgb(0,0,0)">，</span>WM_CLOSE<span style="COLOR: rgb(0,0,0)">和</span>WM_DESTROY<span style="COLOR: rgb(0,0,0)">消息。理论上我们会把窗口函数写成这样：<br /></span></span></span></span></span></span></span></span><span name="intelliTxt"></span><span name="intelliTxt"><pre><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><font face="Times New Roman"><span style="COLOR: #000000">LRESULT CALLBACK MainWndProc (HWND hwnd, UINT msg,   WPARAM wParam, LPARAM lParam)<br />{<br />  </span><span style="COLOR: #0000ff">switch</span></font><font face="Times New Roman"><span style="COLOR: #000000">(msg)<br />  {<br />    </span><span style="COLOR: #0000ff">case</span></font><font face="Times New Roman"><span style="COLOR: #000000"> WM_COMMAND:<br />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> <img src="http://www.cppblog.com/images/dot.gif" /></span></font><span style="COLOR: #008000"><br /></span><font face="Times New Roman"><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">break</span></font><font face="Times New Roman"><span style="COLOR: #000000">;    <br />     <br />    </span><span style="COLOR: #0000ff">case</span></font><font face="Times New Roman"><span style="COLOR: #000000"> WM_KEYUP:<br />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> <img src="http://www.cppblog.com/images/dot.gif" /></span></font><span style="COLOR: #008000"><br /></span><font face="Times New Roman"><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">break</span></font><font face="Times New Roman"><span style="COLOR: #000000">;<br /><br />    </span><span style="COLOR: #0000ff">case</span></font><font face="Times New Roman"><span style="COLOR: #000000"> WM_CLOSE:<br />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> <img src="http://www.cppblog.com/images/dot.gif" /></span></font><span style="COLOR: #008000"><br /></span><font face="Times New Roman"><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">break</span></font><font face="Times New Roman"><span style="COLOR: #000000">;       <br />     <br />    </span><span style="COLOR: #0000ff">case</span></font><font face="Times New Roman"><span style="COLOR: #000000"> WM_DESTROY:<br />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/dot.gif" /></span></font><span style="COLOR: #008000"><br /></span><font face="Times New Roman"><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">break</span></font><font face="Times New Roman"><span style="COLOR: #000000">;      <br />        <br />    </span><span style="COLOR: #0000ff">default</span></font><font face="Times New Roman"><span style="COLOR: #000000">:   <br />       </span><span style="COLOR: #0000ff">return</span></font><span style="COLOR: #000000"><font face="Times New Roman"> DefWindowProc(hwnd, msg, wParam, lParam);<br />  }<br />}</font></span></div></pre></span>这是自Windows 1.0时代以来处理Windows消息使用最多的，确实地，它工作。但是问题是当你开始向你程序中加入更多复杂的特性，例如 MDI，OLE，通用控件，等等，你会获得一个行数以千记的窗口函数。你开始反复使用PageDn和PageUp键跳跃，来寻找你需要修改的消息。<br /><br />这是使用消息分流器的第一个好处：它们提供了处理函数来简化<span style="COLOR: rgb(51,51,255)">case<span style="COLOR: rgb(0,0,0)">标签意大利面，就像MFC做的那样。<br /><br />第二个好处是正确的参数规范化了你的处理函数的使用。你可以简单地使用<span style="COLOR: rgb(51,51,255)">switch<span style="COLOR: rgb(204,0,0)">(id)<span style="COLOR: rgb(0,0,0)">来替代</span></span></span><span style="COLOR: rgb(51,51,255)">switch<span style="COLOR: rgb(204,0,0)">(LOWORD(wparam))<span style="COLOR: rgb(0,0,0)">，因为你把<span style="COLOR: rgb(204,0,0)">id<span style="COLOR: rgb(0,0,0)">作为一个“分流器”的参数传递给消息函数时，等同于<span style="COLOR: rgb(204,0,0)">LOWORD(wparam)<span style="COLOR: rgb(0,0,0)">。<br /><br />消息处理宏<span style="COLOR: rgb(204,0,0)">HANDLE_MSG<span style="COLOR: rgb(0,0,0)">定义在<span style="FONT-STYLE: italic">windows.h</span>中，如下：</span></span></span></span></span></span></span></span></span></span></span><span class="cpp-preprocessor" style="COLOR: rgb(0,0,153)"><span style="FONT-FAMILY: monospace"><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><font face="Times New Roman"><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000"> HANDLE_MSG(hwnd, message, fn) \</span></font><span style="COLOR: #000000"><br /><font face="Times New Roman">    </font></span><font face="Times New Roman"><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000"> (message) : </span><span style="COLOR: #0000ff">return</span></font><span style="COLOR: #000000"><font face="Times New Roman"> HANDLE_##message((hwnd), (wParam), (lParam), (fn)) <br /></font></span></div><br /></span></span><span name="intelliTxt">如你从上面宏定义中可以想到的是，将你的代码转换成“消息分流器”版本，你必须支持分流宏，<span style="COLOR: rgb(204,0,0)">HANDLE_MSG<span style="COLOR: rgb(0,0,0)">，并且使用函数来处理消息。现在将<span style="COLOR: rgb(204,0,0)">HANDLE_MSG<span style="COLOR: rgb(0,0,0)">宏加入到窗口函数中来。这个宏需要三个参数：一个窗口句柄(<span style="COLOR: rgb(204,0,0)">hwnd</span>)<span style="COLOR: rgb(0,0,0)">，你要处理的消息(<span style="COLOR: rgb(204,0,0)">WM_xxxx</span>)<span style="COLOR: rgb(0,0,0)">，以及你用来处理此消息的函数。为了更好的说明，我把之前的窗口函数替换成下面的消息分流版：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">LRESULT CALLBACK MainWndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)<br />{<br />  </span><span style="COLOR: #0000ff">switch</span><span style="COLOR: #000000">(msg)<br />  {<br />    HANDLE_MSG (hwnd, WM_COMMAND, OnCommand);<br />    HANDLE_MSG (hwnd, WM_KEYUP,   OnKeyup);<br />    HANDLE_MSG (hwnd, WM_CLOSE,   OnClose);<br />    HANDLE_MSG (hwnd, WM_DESTROY, OnDestroy);<br />    </span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000">:<br />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> DefWindowProc(hwnd, msg, wParam, lParam);<br />  }<br />}<br /></span></div><br /><br /></span></span></span></span></span></span></span>哇！这是更好的，简洁的并且容易控制的窗口函数。现在你需要定义的的消息处理函数(<span style="COLOR: rgb(204,0,0)">OnKeyUp, OnClose<span style="COLOR: rgb(0,0,0)">和<span style="COLOR: rgb(204,0,0)">OnDestroy</span></span></span>)。更加便利的是你可以使用Visual Studio IDE跳到你消息处理函数：<br /><img title="ide1" src="http://docs.google.com/File?id=dcjhdv5v_4gpjjqq" /><br /><br />问题是每一次你增加一个消息处理你都必须搜寻<span style="FONT-STYLE: italic">WINDOWS.H</span>里的定义，以匹配你的消息处理函数的参数类型，因为你不能随意的使用参数类型：处理函数的格式是清楚定义的。在头文件中反复的查找是单调乏味的任务，且容易出错。消息分流器Wizard工具来搭救你了：它允许你粘贴任何你需要的消息处理的正确的参数。如果你刚刚开始编写代码，它还可以生成一个窗口模板或者对话框函数作为你处理窗口消息的开始。<br /><br /><span style="COLOR: rgb(255,153,0)"><span style="FONT-WEIGHT: bold">Message forwarding</span>宏：另一个WINDOWS.H特色<br /><br /><span style="COLOR: rgb(0,0,0)">头文件<span style="FONT-STYLE: italic">windowsx.h</span>的另一个特色大约是<span style="FONT-WEIGHT: bold">message forwarding</span>。它用来“拆除”消息处理函数的参数为有效的<span style="COLOR: rgb(204,0,0)">WPARAM<span style="COLOR: rgb(0,0,0)">和<span style="COLOR: rgb(204,0,0)">LPARAM<span style="COLOR: rgb(0,0,0)">的值</span></span></span></span>，以调用诸如<span style="COLOR: rgb(204,0,0)">PostMessage<span style="COLOR: rgb(0,0,0)">，<span style="COLOR: rgb(204,0,0)">SendMessage<span style="COLOR: rgb(0,0,0)">，<span style="COLOR: rgb(204,0,0)">CallWindowProc<span style="COLOR: rgb(0,0,0)">等等，此类的函数。<br /><br /><br />假设你你希望使用<span style="COLOR: rgb(204,0,0)">SendMessage<span style="COLOR: rgb(0,0,0)">函数来发送<span style="COLOR: rgb(204,0,0)">WM_COMMAND<span style="COLOR: rgb(0,0,0)">消息给父窗口，通过以一个通知码<span style="COLOR: rgb(204,0,0)">BN_DBLCLK<span style="COLOR: rgb(0,0,0)">来“模拟”双击一个命名为<span style="COLOR: rgb(204,0,0)">IDC_USERCTL<span style="COLOR: rgb(0,0,0)">的控件。你通常会这样写：<br /><br /></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="FONT-FAMILY: monospace"></span>SendMessage (hwndParent, WM_COMMAND, <span style="FONT-FAMILY: monospace"><br /></span>    MAKEWPARAM(IDC_USERCTL, BN_DBLCLK),<br />     (LPARAM)GetDlgItem(hwnd, ID_USERCTL));<br /><br /><span name="intelliTxt">这是一个复杂的的语法：函数<span style="COLOR: rgb(204,0,0)">SendMessage<span style="COLOR: rgb(0,0,0)">期望<span style="COLOR: rgb(0,0,0)">WPARAM参数的底字节是控件的ID，高字节是通知码；并且我们要通过API函数<span style="COLOR: rgb(204,0,0)">GetDlgItem<span style="COLOR: rgb(0,0,0)">获得控件句柄，传给</span>LPARAM<span style="COLOR: rgb(0,0,0)">参数。<br /><br />上面的代码可以用<span style="FONT-STYLE: italic">Windows.h</span>的message forwarding宏替换，<span style="COLOR: rgb(204,0,0)">FORWARD_WM_XXXX<span style="COLOR: rgb(0,0,0)">。对于每一个消息，forwarding宏都使用和消息分流器生成的消息处理函数相同的“捆扎”参数，增加你希望调用的函数并且传给它“拆除”后的<span style="COLOR: rgb(204,0,0)">LPARAM<span style="COLOR: rgb(0,0,0)">/<span style="COLOR: rgb(204,0,0)">WPARAM<span style="COLOR: rgb(0,0,0)">s。例如，消息分流器Wizard为<span style="COLOR: rgb(204,0,0)">WM_COMMAND<span style="COLOR: rgb(0,0,0)">消息和窗口ID<span style="COLOR: rgb(204,0,0)">myWnd<span style="COLOR: rgb(0,0,0)">生成如下的函数原型：<br /></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span name="intelliTxt"><pre><font face="Times New Roman"><span class="cpp-keyword">void</span> myWnd_OnCommand (HWND hwnd, <span class="cpp-keyword">int</span> id, HWND hwndCtl, UINT codeNotify)</font></pre></span><span name="intelliTxt"><pre><span class="cpp-keyword"><font face="Times New Roman">好了，这些分流器参数也同样被用于forwarding宏--因此，如你所期望的，我们之前调用</font><span style="COLOR: rgb(204,0,0)"><font face="Times New Roman">SendMessage</font><span style="COLOR: rgb(0,0,0)"><font face="Times New Roman">函数时展现的混乱可以减少了：<br /></font></span></span></span><span name="intelliTxt"><pre><font face="Times New Roman">FORWARD_WM_COMMAND (hwndParent, IDC_USERCTL, <br />  GetDlgItem(hwnd, ID_USERCTL), BN_DBLCLK, SendMessage);</font></pre></span><font face="Times New Roman">这种方式非常简便，并且可以为所有消息分流器Wizard支持的消息工作。<br /></font><span class="cpp-keyword"><span style="FONT-FAMILY: Verdana"><br /></span></span><br /><font face="Times New Roman"><span style="COLOR: rgb(255,153,0)">使用消息分流Wizard工具</span><br /><br />当你运行消息分流器Wizard时，你可以看到下面的窗口：<br /><br /><img title="MCW" src="http://docs.google.com/File?id=dcjhdv5v_7g4cnpf" /><br /><br />Wizard在左上角的列表框里为你提供了<span style="FONT-STYLE: italic">WINDOWS.H</span>里有的消息处理，你可以点击一个或者多个消息。你可以在窗口ID编辑框里指定一个窗口标识，以指定你要发送消息的<br />窗口。通用的ID有 </font><span style="COLOR: rgb(204,0,0)"><font face="Times New Roman">MainWnd ，About </font><span style="COLOR: rgb(0,0,0)"><font face="Times New Roman">(关于对话框），等等。这个标识会体现在消息处理函数中，和 </font><span style="COLOR: rgb(204,0,0)"><font face="Times New Roman">HANDLE_MSG </font><span style="COLOR: rgb(0,0,0)"><font face="Times New Roman">宏中，如果你刚刚开始编写代码，它还可以体现在窗<br />口/对话框处理函数中。“ <span style="FONT-WEIGHT: bold">Make Window Procedure</span>”选定框的作用是：允许你通过选定的消息分流器的宏来生成一个窗口/对话框函数的框架。以这种方式来开始一<br />个Windows API项目，你可以清晰的编写和组织你的代码，当然还有，避免错误。在窗口下面的两个编辑框会包含分流器的宏和处理所选消息的函数（只是原型）生成的代<br />码。要注意的是，当你选择“<span style="FONT-WEIGHT: bold">Make Window Procedure</span>”时窗口处理函数的模板代码不出现在这里：它仅体现在你点击了“<span style="FONT-WEIGHT: bold">Copy Macro</span>”时复制到你的C++编辑器中<br />的代码里。<br /><br />让我们通过例子来快速的浏览消息分流器Wizard工具的特性。记住你必须先通过<span style="FONT-STYLE: italic">#include &lt;windowsx.h&gt;</span>将头文件<span style="FONT-STYLE: italic">&lt;windowsx.h&gt;</span>包含到你.C/.CPP文件中。<br /><br /></font></span></span></span></span><span style="COLOR: rgb(255,153,0)"><font face="Times New Roman">快速浏览消息分流器Wizard特性<br /><br /></font><span style="COLOR: rgb(0,0,0)"><font face="Times New Roman">让我们开始吧。假设你已经编写了你的</font><span style="COLOR: rgb(204,0,0)"><font face="Times New Roman"> WinMain </font><span style="COLOR: rgb(0,0,0)"><font face="Times New Roman">的基本代码：已经成功填充了 </font><span style="COLOR: rgb(204,0,0)"><font face="Times New Roman">WNDCLASS </font><span style="COLOR: rgb(0,0,0)"><font face="Times New Roman">结构，注册了窗口类，并且编写了消息循环。现在你需要一个为你主函数编写<br />的消息处理函数。<br /><br />打开消息分流器Wizard。我们需要为我们的窗口选择消息，因为MCW需要用它来生成我们的消息处理函数。如你所知，Windows程序非常常见的处理消息是</font><span style="COLOR: rgb(255,0,0)"><span style="COLOR: rgb(204,0,0)"><font face="Times New Roman"> WM_CLOSE </font><span style="COLOR: rgb(0,0,0)"><font face="Times New Roman">和<br /></font><span style="COLOR: rgb(204,0,0)"><font face="Times New Roman">WM_DESTROY </font><span style="COLOR: rgb(0,0,0)"><font face="Times New Roman">和 </font><span style="COLOR: rgb(204,0,0)"><font face="Times New Roman">WM_CREATE </font><span style="COLOR: rgb(0,0,0)"><font face="Times New Roman">，所以让我们选择消息分流器处理这些消息来创建窗口函数。然后，我们创建窗口函数的主体消息处理函数。<br /><br />在列表框中选择</font><span style="COLOR: rgb(204,0,0)"><font face="Times New Roman"> WM_CLOSE </font><span style="COLOR: rgb(0,0,0)"><font face="Times New Roman">, </font><span style="COLOR: rgb(204,0,0)"><font face="Times New Roman">WM_DESTROY </font><span style="COLOR: rgb(0,0,0)"><font face="Times New Roman">和 </font><span style="COLOR: rgb(153,0,0)"><font face="Times New Roman">WM_CREATE </font><span style="COLOR: rgb(0,0,0)"><font face="Times New Roman">。因为此窗口是我们程序的主窗口，我们选用main做为窗口的ID。这个窗口ID表识了我们的窗口/对话框，并且<br />使分流宏和出理函数作为后缀。当然，你要使特定窗口的所有消息处理保持一致。观察下面的编辑框。它们显示<span style="COLOR: rgb(204,0,0)"> HANDLE_MSG <span style="COLOR: rgb(0,0,0)">分流宏和关联的消息处理函数的原型。</span></span></font></span></span></span></span></span></span><br /></span></span></span></span></span></span></span></span></span></span></span></span></span><font face="Times New Roman"><img title="MCW2" src="http://docs.google.com/File?id=dcjhdv5v_8f6dbxc" /><br /><br />但是，等一下......我们说我们需要一个准备好的窗口处理函数。所以单击“<span style="FONT-WEIGHT: bold">Make Window Procedure</span>”选定框，并且确认<span style="FONT-WEIGHT: bold">Window </span>单选按钮已经被选择了。现在<br />我们准备好了。要注意的是，对话框的工作也像这样，但是要改变处理函数为对话框类型。<br /><br />首先，我们需要我们源代码的窗口处理函数。点击“<span style="FONT-WEIGHT: bold">Copy Macro</span>”按钮（或者使用<span style="FONT-STYLE: italic">Ctrl-M</span>），最小化Wizard（或者把它放到一边），回到你的IDE并且从剪贴板粘贴<br />（<span style="FONT-STYLE: italic">Ctrl-V</span>）代码到你的窗口函数的位置。</font><span name="intelliTxt"><font face="Times New Roman">Voilá（阿根廷拉丁语，认识的通知下）！你可以得到像下面的代码： <br /></font></span><span name="intelliTxt"><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000"><font face="Times New Roman">//</font></span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008000"><font face="Times New Roman">//</font></span><span style="COLOR: #008000"><font face="Times New Roman"> main  Window Procedure<br /></font></span><span style="COLOR: #008000"><font face="Times New Roman">//<br /></font></span><font face="Times New Roman"><span style="COLOR: #000000">LRESULT CALLBACK main_WndProc (HWND hwnd, UINT msg, WPARAM wParam,   LPARAM lParam)<br />{<br />  </span><span style="COLOR: #0000ff">switch</span></font><font face="Times New Roman"><span style="COLOR: #000000">(msg)<br />  {<br />    HANDLE_MSG (hwnd, WM_CLOSE, main_OnClose);<br />    HANDLE_MSG (hwnd, WM_CREATE, main_OnCreate);<br />    HANDLE_MSG (hwnd, WM_DESTROY, main_OnDestroy);<br />      </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">/ TODO: Add window message crackers here<img src="http://www.cppblog.com/images/dot.gif" /></span></font><span style="COLOR: #808080"><br /></span><font face="Times New Roman"><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000">: </span><span style="COLOR: #0000ff">return</span></font><span style="COLOR: #000000"><font face="Times New Roman"> DefWindowProc (hwnd, msg, wParam, lParam);<br />  }<br />}</font></span></div><br /></span><br /><font face="Times New Roman"> 这个窗口处理函数以三个消息分流宏展开工作！并且，通过TODO注释提示你记得必须在这里添加消息分流器宏。当你只是要添加一个</font><span style="COLOR: rgb(204,0,0)"><font face="Times New Roman"> HANDLE_MSG </font><span style="COLOR: rgb(0,0,0)"><font face="Times New Roman">宏到窗口函数中时，<br />记得取消“<span style="FONT-WEIGHT: bold">Mke Window Procedure</span>”选定框的选择。</font></span></span><br /><br /><font face="Times New Roman">但是这些代码现在还什么都做不了，因为我们还需要添加三个我们需要的消息处理函数。回到消息分流器Wizard工具的界面，并且单击“<span style="FONT-WEIGHT: bold">Copy Function</span>”按钮。切<br />换到你的代码，用鼠标定位到你需要函数主体插入的位置，然后用Ctrl+V或者菜单Edit/Paste粘贴。Wizard自动生成函数，使用 <span style="FONT-WEIGHT: bold">main</span> 标识窗口ID，并修正参数类型<br />使之符合<span style="FONT-STYLE: italic"> WINDOWSX.H </span>头文件的宏:<br /><br /></font><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000"><font face="Times New Roman">//</font></span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008000"><font face="Times New Roman">//</font></span><span style="COLOR: #008000"><font face="Times New Roman">Process WM_CLOSE message for window/dialog: main<br /></font></span><font face="Times New Roman"><span style="COLOR: #008000">//<br /></span><span style="COLOR: #0000ff">void</span></font><font face="Times New Roman"><span style="COLOR: #000000"> main_OnClose(HWND hwnd)<br />{<br />  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> TODO: Add your message processing code here<img src="http://www.cppblog.com/images/dot.gif" /></span></font><span style="COLOR: #008000"><br /></span><font face="Times New Roman"><span style="COLOR: #000000">}<br /></span><span style="COLOR: #008000">//</span></font><span style="COLOR: #008000"><br /></span><span style="COLOR: #008000"><font face="Times New Roman">//</font></span><span style="COLOR: #008000"><font face="Times New Roman">  Process WM_CREATE message for window/dialog: main<br /></font></span><span style="COLOR: #008000"><font face="Times New Roman">//<br /></font></span><font face="Times New Roman"><span style="COLOR: #000000">BOOL main_OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct)<br />{<br />  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> TODO: Add your message processing code here<img src="http://www.cppblog.com/images/dot.gif" /></span></font><span style="COLOR: #008000"><br /></span><font face="Times New Roman"><span style="COLOR: #000000">}<br /></span><span style="COLOR: #008000">//</span></font><span style="COLOR: #008000"><br /></span><span style="COLOR: #008000"><font face="Times New Roman">//</font></span><span style="COLOR: #008000"><font face="Times New Roman">  Process WM_DESTROY message for window/dialog: main<br /></font></span><font face="Times New Roman"><span style="COLOR: #008000">//<br /></span><span style="COLOR: #0000ff">void</span></font><font face="Times New Roman"><span style="COLOR: #000000"> main_OnDestroy(HWND hwnd)<br />{<br />  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> TODO: Add your message processing code here<img src="http://www.cppblog.com/images/dot.gif" /></span></font><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000"><font face="Times New Roman">}</font></span></div><br /><font face="Times New Roman"><br /><br /></font><span name="intelliTxt"><br /></span><font face="Times New Roman">Wizard还可以自动生成开头注释，和TODO行以提醒你添加代码。现在你可以添加消息处理了，可以是简单的处理处理逻辑，或者复杂窗口函数。你也可以通过选定框移除<br />注释。<br /><br /></font><span style="COLOR: rgb(255,102,0)"><font face="Times New Roman">更多的消息分流器Wizard特性<br /></font><span style="COLOR: rgb(0,0,0)"><br /><font face="Times New Roman"><span style="FONT-WEIGHT: bold">消息过滤</span><br /><br />你可以过滤你暂时不打算处理的消息。单击“<span style="FONT-WEIGHT: bold">Filters..</span>”按钮（或者Ctrl+L），你会打开下面对话框。列表的消息按类型分类（分类标准来自Microsoft Spy++的效果），<br />你可以取消选定你不处理的消息。<br /></font></span></span><font face="Times New Roman"><img title="filter" src="http://docs.google.com/File?id=dcjhdv5v_9hn54g2" /><br /><br /></font><font face="Times New Roman"><span style="FONT-STYLE: italic">要注意的是在 v2.0 当前的问题是，当你打开消息过滤对话框时所有类型的消息都是选定的，当你点击OK，之前选定的消息会丢失（这并不意味着你粘贴到目标代码的<br />内容会消失）。<br /></span><br /><br /></font><span style="COLOR: rgb(255,102,0)"><span style="COLOR: rgb(0,0,0)"><br /><font face="Times New Roman"><span style="FONT-WEIGHT: bold">简洁窗口模式</span><br /><br />你可能需要减小消息分流Wizard窗体的大小。这可以通过取消菜单 <span style="FONT-WEIGHT: bold">View </span>的 “<span style="FONT-WEIGHT: bold">Show Target Code</span>”选项的选定（或者使用Ctrl+F11）。主窗口会取消目标代码区域：<br /><br /></font><font face="Times New Roman"><span style="FONT-WEIGHT: bold">窗体透明，取消注释和置顶<br /><br /></span>（译注：Sorry，暂不做翻译了，你可以通过尝试菜单 <span style="FONT-WEIGHT: bold">View</span> 的其它几个选项自己体会^_^）<br /><br /><br /></font><span style="COLOR: rgb(255,102,0)"><br /><font face="Times New Roman">未来特性<br /><br /><span style="COLOR: rgb(0,0,0)">下面的特性会在下一次发布时实现：</span><br /></font></span></span></span></pre></span><ul><li>帮助文件。 
</li><li>所有消息分流的参数和消息的完整帮助。 
</li><li>支持WTL！:) 
</li><li>窗口ID和配置保存（这个会在下一个2.x版本实现）。 
</li><li>项目配置和“消息映射”（a la MFC）（译注：好像是西班牙语，不认识:P）（这个也会在之后的2.5版本实现）。<br /></li></ul><span style="COLOR: rgb(255,102,0)"><span style="COLOR: rgb(0,0,0)"><br /><span style="COLOR: rgb(255,102,0)">快乐的编程！<br /><br /><span style="COLOR: rgb(0,0,0)">我希望这个小工具可以让每个 Windows SDK 程序员感兴趣，并且干净的编写 Win32 API 程序。我乐于接受改进这个工具的主意。如果你发现这个程序很好用，请给我发邮件，因为我非常高兴听到任何好的意见。<br /><br />谢谢所有支持！！You know who you are！（译注：不太明白这个要表达什么意思，“你知道你是谁！”乎？）<br /><br />任何时候，打开我的主页，你可以在那里找到这个程序的最新更新。<br /><br /><span style="COLOR: rgb(255,102,0)">历史：<br /><span style="COLOR: rgb(0,0,0)">  略...<br /><br /><span style="COLOR: rgb(255,102,0)">关于作者：</span></span></span></span></span></span></span><font style="COLOR: rgb(255,102,0)" size="2">Hernán Di Pietro<br /></font><img src="http://docs.google.com/File?id=dcjhdv5v_138hstzg" align="left" /><br /><font style="COLOR: rgb(255,102,0)" size="2"><span style="COLOR: rgb(0,0,0)">业余程序员。<br /><br />开始于1986年，在Commodore 64上编写BASIC程序。<br />在1990年第一台 8086 PC 上开始编写 QB 4.x。<br />1995-1996年转移到Visual Basic。<br />2002年，23岁时开始编写C++程序，并对 Windows API 上瘾。<br /><br />主页： http://usuarios.lycos.es/hernando<br /></span><br /></font><span style="COLOR: rgb(255,102,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(255,102,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(255,102,0)"><span style="COLOR: rgb(0,0,0)"></span></span></span></span></span></span><span name="intelliTxt"><pre><font face="Times New Roman"><br /></font></pre></span><span name="intelliTxt"><span style="COLOR: rgb(204,0,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(204,0,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(204,0,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(204,0,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(204,0,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(204,0,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(204,0,0)"><span style="COLOR: rgb(0,0,0)"></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br /></span><span style="COLOR: rgb(255,153,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(204,0,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(204,0,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(204,0,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(204,0,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(204,0,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(204,0,0)"><span style="COLOR: rgb(0,0,0)"></span></span></span></span></span></span></span></span><span style="COLOR: rgb(0,0,0)"></span></span></span></span></span></span></span><img src ="http://www.cppblog.com/nj-blog/aggbug/14559.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nj-blog/" target="_blank">小山日志</a> 2006-11-02 00:00 <a href="http://www.cppblog.com/nj-blog/archive/2006/11/02/14559.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>