﻿<?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++博客-四角小楼</title><link>http://www.cppblog.com/weigtcs/</link><description>热情、专注、责任</description><language>zh-cn</language><lastBuildDate>Thu, 09 Apr 2026 07:05:57 GMT</lastBuildDate><pubDate>Thu, 09 Apr 2026 07:05:57 GMT</pubDate><ttl>60</ttl><item><title>Windows下搭建Linux编码环境</title><link>http://www.cppblog.com/weigtcs/archive/2016/02/15/212816.html</link><dc:creator>weigtcs</dc:creator><author>weigtcs</author><pubDate>Mon, 15 Feb 2016 03:53:00 GMT</pubDate><guid>http://www.cppblog.com/weigtcs/archive/2016/02/15/212816.html</guid><wfw:comment>http://www.cppblog.com/weigtcs/comments/212816.html</wfw:comment><comments>http://www.cppblog.com/weigtcs/archive/2016/02/15/212816.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weigtcs/comments/commentRss/212816.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weigtcs/services/trackbacks/212816.html</trackback:ping><description><![CDATA[对于一个扎根于Windows的开发者来说，很难离开图形界面，如直接使用无图形界面的Linux（以下使用的是CentOS）进行编码，会严重影响该开发者的工作效率。本文描述了如何在Windows下面搭建Linux开发平台，以用于Linux服务器开发。这里使用的工具是Source insight、Virtualbox、Samba、XShell，其中Source insight用来编辑代码（代码是放在CentOS下面的），Virtualbox用来安装CentOS虚拟机，这里使用的是没有图形界面的CentOS7，Samba用来共享Windows与Linux的目录，XShell用来远程登录CentOS<br />虚拟机，这个工具比原始的Linux终端好用，提供了诸多类似于Windows图形界面支持的操作，如选择、复制和粘贴等。<br />从前面的描述可以看到，我们只是在Windows下面编写代码，而构建与调试，都是在CentOS下面完成的，本文不涉及在Windows下面构建与调试Linux程序。<br />安装Source insight、Virtualbox、XShell是非常简单的。<br />安装与配置CentOS虚拟机。<br />1、安装CentOS。这里需要注意的是，CentOS默认安装的是最小安装，最小安装里面只包含少量的工具，没有gcc，gdb等常用的开发工具，因此要选择合适自己的安装方式，最好把要使用的工具都装上。<br />2、配置网络。因为我们在开发的时候要将CentOS的目录共享到Windows，所以我们要保证两边都能够通信，所以这里我们选择使用桥接网络，然后根据具体情况进行CentOS的网络配置。<br />3、安装Samba。Samba安装在CentOS中，用以共享CentOS的目录。<br />4、映射共享目录。Source insight使用网络路径时，会出现一些莫名其妙的错误，因此我们最后将CentOS的共享目录映射为一个驱动器，如B盘。<br />安装XShell。XShell提供了丰富的界面交互功能，可以根据自己的爱好选择不同的主题元素，如字体、背景等。<br />既然使用了XShell，那么Virtualbox的终端界面就可以不要了，我们可以使用Virtualbox提供的管理工具将CentOS隐藏到后台运行。<img src ="http://www.cppblog.com/weigtcs/aggbug/212816.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weigtcs/" target="_blank">weigtcs</a> 2016-02-15 11:53 <a href="http://www.cppblog.com/weigtcs/archive/2016/02/15/212816.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为什么std::wstring不提供CString那样的Format的方法</title><link>http://www.cppblog.com/weigtcs/archive/2015/07/29/212826.html</link><dc:creator>weigtcs</dc:creator><author>weigtcs</author><pubDate>Wed, 29 Jul 2015 10:23:00 GMT</pubDate><guid>http://www.cppblog.com/weigtcs/archive/2015/07/29/212826.html</guid><wfw:comment>http://www.cppblog.com/weigtcs/comments/212826.html</wfw:comment><comments>http://www.cppblog.com/weigtcs/archive/2015/07/29/212826.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weigtcs/comments/commentRss/212826.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weigtcs/services/trackbacks/212826.html</trackback:ping><description><![CDATA[很多时候想使用字符串格式化输出，但是std::wstring偏偏没有提供这个方法。CString只存在于ATL/MFC，使用Win32平台没有CString可用，使用底层的spintf之类的函数，又时常担心buffer越界，写重复的越界检测之类的代码...所以这里把CString的Format方法搬了过来：<br />String.h<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;String&nbsp;:&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;std::wstring<br /><span style="color: #008080; ">2</span>&nbsp;{<br /><span style="color: #008080; ">3</span>&nbsp;<span style="color: #0000FF; ">public</span>:<br /><span style="color: #008080; ">4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Format(<span style="color: #0000FF; ">const</span>&nbsp;wchar_t*&nbsp;pszFormat,&nbsp;<img src="http://www.cppblog.com/Images/dot.gif" alt="" />);<br /><span style="color: #008080; ">5</span>&nbsp;<span style="color: #0000FF; ">protected</span>:<br /><span style="color: #008080; ">6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;FormatV(<span style="color: #0000FF; ">const</span>&nbsp;wchar_t*&nbsp;pszFormat,&nbsp;va_list&nbsp;args);<br /><span style="color: #008080; ">7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;GetFormattedLength(<span style="color: #0000FF; ">const</span>&nbsp;wchar_t*&nbsp;pszFormat,&nbsp;va_list&nbsp;args);<br /><span style="color: #008080; ">8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;Format(wchar_t*&nbsp;pszBuffer,&nbsp;ULONG&nbsp;nLength,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;wchar_t*&nbsp;pszFormat,&nbsp;va_list&nbsp;args);<br /><span style="color: #008080; ">9</span>&nbsp;};</div>String.cpp<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->std::wstring&nbsp;StrFormat(&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;wchar_t*&nbsp;pstrFormat,&nbsp;<img src="http://www.cppblog.com/Images/dot.gif" alt="" />&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;WCHAR&nbsp;szBuffer[300]&nbsp;=&nbsp;{&nbsp;0&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;va_list&nbsp;args;<br />&nbsp;&nbsp;&nbsp;&nbsp;va_start(args,&nbsp;pstrFormat);<br />&nbsp;&nbsp;&nbsp;&nbsp;::wvnsprintf(szBuffer,&nbsp;lengthof(szBuffer)&nbsp;-&nbsp;2,&nbsp;pstrFormat,&nbsp;args);<br />&nbsp;&nbsp;&nbsp;&nbsp;wcscat_s(szBuffer,&nbsp;300,&nbsp;L"\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;va_end(args);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;szBuffer;<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;String::Format(&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;wchar_t*&nbsp;pszFormat,&nbsp;<img src="http://www.cppblog.com/Images/dot.gif" alt="" />&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;va_list&nbsp;arglist;<br />&nbsp;&nbsp;&nbsp;&nbsp;va_start(arglist,&nbsp;pszFormat);<br />&nbsp;&nbsp;&nbsp;&nbsp;FormatV(pszFormat,&nbsp;arglist);<br />&nbsp;&nbsp;&nbsp;&nbsp;va_end(arglist);<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;String::Format(&nbsp;wchar_t*&nbsp;pszBuffer,&nbsp;ULONG&nbsp;nLength,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;wchar_t*&nbsp;pszFormat,&nbsp;va_list&nbsp;args&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;vswprintf_s(pszBuffer,&nbsp;nLength,&nbsp;pszFormat,&nbsp;args);<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;String::FormatV(&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;wchar_t*&nbsp;pszFormat,&nbsp;va_list&nbsp;args&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(pszFormat&nbsp;==&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;nLength&nbsp;=&nbsp;GetFormattedLength(pszFormat,&nbsp;args);<br />&nbsp;&nbsp;&nbsp;&nbsp;wchar_t*&nbsp;pszBuffer&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;wchar_t[nLength&nbsp;+&nbsp;1];<br />&nbsp;&nbsp;&nbsp;&nbsp;::ZeroMemory(pszBuffer,&nbsp;nLength&nbsp;+&nbsp;1);<br />&nbsp;&nbsp;&nbsp;&nbsp;Format(pszBuffer,&nbsp;nLength&nbsp;+&nbsp;1,&nbsp;pszFormat,&nbsp;args);<br />&nbsp;&nbsp;&nbsp;&nbsp;std::wstring::<span style="color: #0000FF; ">operator</span>=(std::wstring(pszBuffer));<br />&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;[]pszBuffer;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;String::GetFormattedLength(&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;wchar_t*&nbsp;pszFormat,&nbsp;va_list&nbsp;args&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;_vscwprintf(pszFormat,&nbsp;args);<br />}</div><br />以上代码在VS2008编译通过。<br /><img src="http://www.cppblog.com/wxtnote/aggbug/211410.html" width="1" height="1"  alt="" /><br /><div align="right"></div><img src ="http://www.cppblog.com/weigtcs/aggbug/212826.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weigtcs/" target="_blank">weigtcs</a> 2015-07-29 18:23 <a href="http://www.cppblog.com/weigtcs/archive/2015/07/29/212826.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>查看某个文件正在被哪些进程访问</title><link>http://www.cppblog.com/weigtcs/archive/2015/04/27/212827.html</link><dc:creator>weigtcs</dc:creator><author>weigtcs</author><pubDate>Mon, 27 Apr 2015 15:28:00 GMT</pubDate><guid>http://www.cppblog.com/weigtcs/archive/2015/04/27/212827.html</guid><wfw:comment>http://www.cppblog.com/weigtcs/comments/212827.html</wfw:comment><comments>http://www.cppblog.com/weigtcs/archive/2015/04/27/212827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weigtcs/comments/commentRss/212827.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weigtcs/services/trackbacks/212827.html</trackback:ping><description><![CDATA[通过使用Sysinternals的procexp.exe工具提供的Process Explorer Search（菜单-&gt;Find-&gt;Find Handle or Dll或Ctrl+F）功能，我们可以看到某个文件正在被哪些进程使用。这个功能在你想删除某个文件，而系统提示&#8220;该文件正在被占用，不能删除&#8221;的时候非常有用。<br /><img src="http://www.cppblog.com/images/cppblog_com/wxtnote/Find3.jpg" width="458" height="341" alt="" /><img src="http://www.cppblog.com/wxtnote/aggbug/210460.html" width="1" height="1"  alt="" /><br /><br /><div align="right"></div><img src ="http://www.cppblog.com/weigtcs/aggbug/212827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weigtcs/" target="_blank">weigtcs</a> 2015-04-27 23:28 <a href="http://www.cppblog.com/weigtcs/archive/2015/04/27/212827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Gdiplus的初始化辅助类</title><link>http://www.cppblog.com/weigtcs/archive/2015/03/19/212828.html</link><dc:creator>weigtcs</dc:creator><author>weigtcs</author><pubDate>Thu, 19 Mar 2015 07:14:00 GMT</pubDate><guid>http://www.cppblog.com/weigtcs/archive/2015/03/19/212828.html</guid><wfw:comment>http://www.cppblog.com/weigtcs/comments/212828.html</wfw:comment><comments>http://www.cppblog.com/weigtcs/archive/2015/03/19/212828.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weigtcs/comments/commentRss/212828.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weigtcs/services/trackbacks/212828.html</trackback:ping><description><![CDATA[在使用Gdiplus的功能之前，要先进行初始化，对应的函数是Gdiplus::GdiplusStartup，在使用完Gdiplus的功能之后，要进行反初始化，对应的函数则是Gdiplus::GdiplusShutdown。<br />为了简化编程，这里实现了一个简单的Gdiplus初始化类，作为全局对象使用，类似于MFC的theApp对象。代码如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#pragma&nbsp;once<br /><br />#include&nbsp;&lt;GdiPlus.h&gt;<br /><br /><span style="color: #0000FF; ">class</span>&nbsp;GdiPlusHelper<br />{<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;GdiPlusHelper()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Gdiplus::GdiplusStartupInput&nbsp;gdiplusStartupInput;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Gdiplus::GdiplusStartup(&amp;m_nGdiPlusToken,&nbsp;&amp;gdiplusStartupInput,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;~GdiPlusHelper()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Gdiplus::GdiplusShutdown(m_nGdiPlusToken);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;ULONG_PTR&nbsp;m_nGdiPlusToken;<br />};</div><img src="http://www.cppblog.com/wxtnote/aggbug/210101.html" width="1" height="1"  alt="" /><br /><div align="right"></div><img src ="http://www.cppblog.com/weigtcs/aggbug/212828.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weigtcs/" target="_blank">weigtcs</a> 2015-03-19 15:14 <a href="http://www.cppblog.com/weigtcs/archive/2015/03/19/212828.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用GdiPlus::Matrix实现图形旋转</title><link>http://www.cppblog.com/weigtcs/archive/2015/03/18/212829.html</link><dc:creator>weigtcs</dc:creator><author>weigtcs</author><pubDate>Wed, 18 Mar 2015 07:34:00 GMT</pubDate><guid>http://www.cppblog.com/weigtcs/archive/2015/03/18/212829.html</guid><wfw:comment>http://www.cppblog.com/weigtcs/comments/212829.html</wfw:comment><comments>http://www.cppblog.com/weigtcs/archive/2015/03/18/212829.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weigtcs/comments/commentRss/212829.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weigtcs/services/trackbacks/212829.html</trackback:ping><description><![CDATA[用Gdiplus::Matrix对图形进行简单的旋转，可以免除繁琐的数学计算。<br />这里主要用到了Gdiplus::Matrix::RotateAt和Gdiplus::Graphics::SetTransForm实现图形旋转。<br /><br />1、类GdiPlus::Matrix的RotateAt方法，原型如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Status&nbsp;RotateAt(&nbsp;REAL&nbsp;angle,<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;PointF&nbsp;&amp;center,<br />&nbsp;&nbsp;&nbsp;&nbsp;MatrixOrder&nbsp;order<br />);</div>参数angle为需要旋转的角度，center为旋转的中心，order为旋转Matrix的顺序。order的取值有两个：Gdiplus::MatrixOrderPrepend和Gdiplus::MatrixOrderAppend，默认取值为Gdiplus::MatrixOrderPrepend。<br /><br />2、类Gdiplus::Graphics的SetTransForm方法，原型如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Status&nbsp;SetTransform(&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;Matrix&nbsp;*matrix<br />);</div>参数matrix就是上面的Gdiplus::Matrix对象指针。<br /><br />示例代码如下：<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->VOID&nbsp;Example_Rotate(HDC&nbsp;hdc)<br />{<br />&nbsp;&nbsp;&nbsp;Gdiplus::Graphics&nbsp;graphics(hdc);<br />&nbsp;&nbsp;&nbsp;Gdiplus::Pen&nbsp;pen(Color(255,&nbsp;0,&nbsp;0,&nbsp;255));<br />&nbsp;&nbsp;&nbsp;Gdiplus::Matrix&nbsp;matrix;<br />&nbsp;&nbsp;&nbsp;Gdiplus::PonitF&nbsp;P(50,&nbsp;50);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;旋转中心</span><br />&nbsp;&nbsp;&nbsp;matrix.RotateAt(100.0f,&nbsp;P);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000;">&nbsp;旋转100度</span><br />&nbsp;&nbsp;&nbsp;graphics.SetTransform(&amp;matrix);<br />&nbsp;&nbsp;&nbsp;graphics.DrawEllipse(&amp;pen,&nbsp;0,&nbsp;0,&nbsp;100,&nbsp;50);&nbsp;<br />}</div><br />效果展示：<br /><img src="http://www.cppblog.com/images/cppblog_com/wxtnote/GdiplusRotate2.png" width="486" height="350" alt="" /><br /><br />参考资料：MSDN<img src="http://www.cppblog.com/wxtnote/aggbug/210095.html" width="1" height="1"  alt="" /><br /><div align="right"></div><img src ="http://www.cppblog.com/weigtcs/aggbug/212829.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weigtcs/" target="_blank">weigtcs</a> 2015-03-18 15:34 <a href="http://www.cppblog.com/weigtcs/archive/2015/03/18/212829.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>仿MFC消息映射</title><link>http://www.cppblog.com/weigtcs/archive/2015/01/11/212830.html</link><dc:creator>weigtcs</dc:creator><author>weigtcs</author><pubDate>Sun, 11 Jan 2015 12:00:00 GMT</pubDate><guid>http://www.cppblog.com/weigtcs/archive/2015/01/11/212830.html</guid><wfw:comment>http://www.cppblog.com/weigtcs/comments/212830.html</wfw:comment><comments>http://www.cppblog.com/weigtcs/archive/2015/01/11/212830.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weigtcs/comments/commentRss/212830.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weigtcs/services/trackbacks/212830.html</trackback:ping><description><![CDATA[在开发图形界面（GUI）程序时，对于无句柄的图形控件的框架，在编写响应消息的代码时，可以采用虚函数的方法，在界面框架基类里面调用这些函数，而在子类重写这些虚函数，就可以得到消息的响应。但是，由于windows的消息众多，对应需要编写的虚函数就有很多，这样无疑加大了资源开销，效率也降低。而在MFC消息映射框架里，没有使用虚函数，而是使用了一大堆宏，减少了内存开销，提高了效率。本文提取了MFC消息映射框架，将窗口（CWnd）换成自己的图元（Element），实现了与MFC相同形式的消息映射。<br />在本代码中，Element是所有界面元素的基类，地位相当与MFC的CWnd。<br />消息响应函数类型定义的枚举：<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">enum</span>&nbsp;ESig<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ESig_end&nbsp;=&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;[marks&nbsp;end&nbsp;of&nbsp;message&nbsp;map]</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;ESig_b_D_v,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;BOOL&nbsp;(CDC*)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;ESig_b_b_v,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;BOOL&nbsp;(BOOL)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;ESig_b_u_v,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000;">//</span><span style="color: #008000; ">&nbsp;BOOL&nbsp;(UINT)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;ESig_b_h_v,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;BOOL&nbsp;(HANDLE)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;ESig_b_W_uu,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;BOOL&nbsp;(CWnd*,&nbsp;UINT,&nbsp;UINT)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;ESig_b_W_COPYDATASTRUCT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;BOOL&nbsp;(CWnd*,&nbsp;COPYDATASTRUCT*)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;ESig_b_v_HELPINFO,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;BOOL&nbsp;(LPHELPINFO);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;ESig_CTLCOLOR,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;HBRUSH&nbsp;(CDC*,&nbsp;CWnd*,&nbsp;UINT)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;ESig_CTLCOLOR_REFLECT,&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;HBRUSH&nbsp;(CDC*,&nbsp;UINT)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;ESig_i_u_W_u,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;int&nbsp;(UINT,&nbsp;CWnd*,&nbsp;UINT)&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;?TOITEM</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;ESig_i_uu_v,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;int&nbsp;(UINT,&nbsp;UINT)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;ESig_i_W_uu,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;int&nbsp;(CWnd*,&nbsp;UINT,&nbsp;UINT)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;ESig_i_v_s,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;int&nbsp;(LPTSTR)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;ESig_l_w_l,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;LRESULT&nbsp;(WPARAM,&nbsp;LPARAM)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;ESig_l_uu_M,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;LRESULT&nbsp;(UINT,&nbsp;UINT,&nbsp;CMenu*)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;ESig_v_b_h,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;void&nbsp;(BOOL,&nbsp;HANDLE)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;ESig_v_h_v,<br />&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif" alt="" /><br />};</div>这里只列举了部分响应函数类型。<br /><br />基类消息映射函数回调函数定义：<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->typedef&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;(Element::*pEMsgFun)(<span style="color: #0000FF; ">void</span>);</div><br />消息映射入口结构体，各个域的含义与MFC类似。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">struct</span>&nbsp;EMsgMap_Entery<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT&nbsp;nMessage;<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT&nbsp;nCode;<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT&nbsp;nID;<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT&nbsp;nLastID;<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT_PTR&nbsp;nSig;<br />&nbsp;&nbsp;&nbsp;&nbsp;pEMsgFun&nbsp;pfn;<br />};</div><br />消息映射列表结构体。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">struct</span>&nbsp;EMsgMap<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;EMsgMap*&nbsp;(*pfnGetMessageMap)();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;EMsgMap_Entery*&nbsp;lpEnteries;<br />};</div><br />消息映射声明与定义。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">#define</span>&nbsp;BEGIN_EMSG_MAP(theClass)\<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;EMsgMap*&nbsp;theClass::GetMessageMap()&nbsp;<span style="color: #0000FF; ">const</span>\<br />{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;GetThisMessageMap();&nbsp;}\<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;EMsgMap*&nbsp;theClass::GetThisMessageMap()\<br />{\<br />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;theClass&nbsp;ThisClass;\<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;EMsgMap_Entery&nbsp;_messageEntries[]=\<br />{<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;END_EMSG_MAP()\<br />{0,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;ESig_end,&nbsp;(pEMsgFun)0}\<br />};\<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;EMsgMap&nbsp;messageMap=\<br />{&nbsp;0,&nbsp;&amp;_messageEntries[0]&nbsp;};\<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;&amp;messageMap;\<br />&nbsp;&nbsp;&nbsp;&nbsp;\<br />}</div><br />部分已经实现的消息映射。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">#define</span>&nbsp;ON_EM_PAINT()&nbsp;\<br />{&nbsp;WM_PAINT,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;ESig_vv,&nbsp;\<br />&nbsp;&nbsp;&nbsp;&nbsp;(pEMsgFun)&nbsp;\<br />&nbsp;&nbsp;&nbsp;&nbsp;(static_cast&lt;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;(Element::*)(<span style="color: #0000FF; ">void</span>)&nbsp;&gt;&nbsp;(&nbsp;&amp;ThisClass&nbsp;::&nbsp;OnPaint))&nbsp;},<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;ON_EM_LBUTTONDOWN()\<br />{WM_LBUTTONDOWN,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;ESig_vwp,\<br />&nbsp;&nbsp;&nbsp;&nbsp;(pEMsgFun)\<br />&nbsp;&nbsp;&nbsp;&nbsp;(static_cast&lt;<span style="color: #0000FF; ">void</span>(Element::*)(UINT,&nbsp;POINT)&gt;(&amp;ThisClass::OnLButtonDown))},<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;ON_EM_LBUTTONUP()&nbsp;\<br />{&nbsp;WM_LBUTTONUP,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;ESig_vwp,&nbsp;\<br />&nbsp;&nbsp;&nbsp;&nbsp;(pEMsgFun)&nbsp;\<br />&nbsp;&nbsp;&nbsp;&nbsp;(static_cast&lt;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;(&nbsp;Element::*)(UINT,&nbsp;POINT)&nbsp;&gt;&nbsp;(&nbsp;&amp;ThisClass&nbsp;::&nbsp;OnLButtonUp))&nbsp;},<br /><br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;ON_EM_MOUSEMOVE()&nbsp;\<br />{&nbsp;WM_MOUSEMOVE,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;ESig_vwp,&nbsp;\<br />&nbsp;&nbsp;&nbsp;&nbsp;(pEMsgFun)&nbsp;\<br />&nbsp;&nbsp;&nbsp;&nbsp;(static_cast&lt;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;(&nbsp;Element::*)(UINT,&nbsp;POINT)&nbsp;&gt;&nbsp;(&nbsp;&amp;ThisClass&nbsp;::&nbsp;OnMouseMove))&nbsp;},<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;ON_EM_MOUSELEAVE()&nbsp;\<br />{&nbsp;WM_MOUSELEAVE,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;ESig_vv,&nbsp;\<br />&nbsp;&nbsp;&nbsp;&nbsp;(pEMsgFun)&nbsp;\<br />&nbsp;&nbsp;&nbsp;&nbsp;(static_cast&lt;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;(Element::*)(<span style="color: #0000FF; ">void</span>)&nbsp;&gt;&nbsp;(&nbsp;&amp;ThisClass&nbsp;::&nbsp;OnMouseLeave))&nbsp;},<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;ON_EM_SIZE()&nbsp;\<br />{&nbsp;WM_SIZE,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;ESig_vwii,&nbsp;\<br />&nbsp;&nbsp;&nbsp;&nbsp;(pEMsgFun)&nbsp;\<br />&nbsp;&nbsp;&nbsp;&nbsp;(static_cast&lt;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;(&nbsp;Element::*)(UINT,&nbsp;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">int</span>)&nbsp;&gt;&nbsp;(&nbsp;&amp;ThisClass&nbsp;::&nbsp;OnSize))&nbsp;},<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;efx_msg</div><br />消息处理过程函数，只实现了部分。<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->LRESULT&nbsp;Element::HandleMessage(&nbsp;UINT&nbsp;uMsg,&nbsp;WPARAM&nbsp;wParam,&nbsp;LPARAM&nbsp;lParam&nbsp;)<br />{<br /><span style="color: #0000ff;">&nbsp; &nbsp; const</span>&nbsp;EMsgMap*&nbsp;pMsgMap&nbsp;=&nbsp;GetMessageMap();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(pMsgMap&nbsp;==&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;EMsgMap_Entery*&nbsp;pEntry&nbsp;=&nbsp;pMsgMap-&gt;lpEnteries;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(pEntry[i].nSig&nbsp;!=&nbsp;ESig_end)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(pEntry[i].nMessage&nbsp;==&nbsp;uMsg)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">switch</span>(pEntry[i].nSig)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;ESig_vwp:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;POINT&nbsp;pt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pt.x&nbsp;=&nbsp;LOWORD(lParam);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pt.y&nbsp;=&nbsp;HIWORD(lParam);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span style="color: #0000FF; ">this</span>-&gt;*(reinterpret_cast&lt;<span style="color: #0000FF; ">void</span>(Element::*)(UINT,&nbsp;POINT)&gt;(pEntry[i].pfn)))((UINT)wParam,&nbsp;pt);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;ESig_vv:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span style="color: #0000FF; ">this</span>-&gt;*(reinterpret_cast&lt;<span style="color: #0000FF; ">void</span>(Element::*)()&gt;(pEntry[i].pfn)))();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;ESig_vwii:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span style="color: #0000FF; ">this</span>-&gt;*(reinterpret_cast&lt;<span style="color: #0000FF; ">void</span>(Element::*)(UINT,&nbsp;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">int</span>)&gt;(pEntry[i].pfn)))((UINT)wParam,&nbsp;LOWORD(lParam),&nbsp;HIWORD(lParam));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">default</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;1;<br />}</div><br />使用方法。<br />声明：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">class</span>&nbsp;Element<br />{<br /><span style="color: #008000; ">//</span><span style="color: #008000; "><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span style="color: #008000; "><br /></span>DECLARE_EMSG_MAP();<br /><span style="color: #008000; ">//</span><span style="color: #008000; "><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span style="color: #008000; "><br /></span><br /><span style="color: #0000FF; ">protected</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;efx_msg&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;OnPaint();<br />&nbsp;&nbsp;&nbsp;&nbsp;efx_msg&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;OnMouseMove(UINT&nbsp;nFlag,&nbsp;POINT&nbsp;pt);<br />&nbsp;&nbsp;&nbsp;&nbsp;efx_msg&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;OnMouseLeave();<br />&nbsp;&nbsp;&nbsp;&nbsp;efx_msg&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;OnLButtonDown(UINT&nbsp;uFlag,&nbsp;POINT&nbsp;pt);<br />&nbsp;&nbsp;&nbsp;&nbsp;efx_msg&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;OnLButtonUp(UINT&nbsp;uFlag,&nbsp;POINT&nbsp;pt);<br /><span style="color: #008000; ">//</span><span style="color: #008000; "><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span style="color: #008000; "><br /></span>};</div><br />实现：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->BEGIN_EMSG_MAP(Element)<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">{</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;ON_EM_PAINT()<br />&nbsp;&nbsp;&nbsp;&nbsp;ON_EM_MOUSEMOVE()<br />&nbsp;&nbsp;&nbsp;&nbsp;ON_EM_MOUSELEAVE()<br />&nbsp;&nbsp;&nbsp;&nbsp;ON_EM_LBUTTONDOWN()<br />&nbsp;&nbsp;&nbsp;&nbsp;ON_EM_LBUTTONUP()<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">}</span><span style="color: #008000; "><br /></span>END_EMSG_MAP()</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span>&nbsp;Element::OnMouseMove(&nbsp;UINT&nbsp;nFlag,&nbsp;POINT&nbsp;pt&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;TRACE(TEXT("%ld::Element::OnMouseMove"),&nbsp;<span style="color: #0000FF; ">this</span>);<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;Element::OnMouseLeave()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;TRACE(TEXT("%ld::Element::OnMouseLeave"),&nbsp;<span style="color: #0000FF; ">this</span>);<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;Element::OnLButtonDown(&nbsp;UINT&nbsp;uFlag,&nbsp;POINT&nbsp;pt&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;TRACE(TEXT("%ld::Element::OnLButtonDown"),&nbsp;<span style="color: #0000FF; ">this</span>);<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;Element::OnLButtonUp(&nbsp;UINT&nbsp;uFlag,&nbsp;POINT&nbsp;pt&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;TRACE(TEXT("%ld::Element::OnLButtonUp"),&nbsp;<span style="color: #0000FF; ">this</span>);<br />}</div><br />这样可以按照以上的思路，不断完善消息映射函数类型。<br />由于Element是无窗口的图元元素，没有系统的窗口消息的分发支持，所以要想真正实现这些功能，还需要一个图元管理器，用于度量的坐标，消息的分发等等。<br /><img src="http://www.cppblog.com/weigt/aggbug/209475.html" width="1" height="1"  alt="" /><br /><div align="right"></div><img src ="http://www.cppblog.com/weigtcs/aggbug/212830.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weigtcs/" target="_blank">weigtcs</a> 2015-01-11 20:00 <a href="http://www.cppblog.com/weigtcs/archive/2015/01/11/212830.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>