﻿<?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/Fox/CommentsRSS.aspx</link><description>游戏人生 != ( 人生 == 游戏 )</description><language>zh-cn</language><pubDate>Wed, 18 Feb 2009 18:16:00 GMT</pubDate><lastBuildDate>Wed, 18 Feb 2009 18:16:00 GMT</lastBuildDate><generator>cnblogs</generator><item><title>re: 消息映射机制的简单实现[未登录]</title><link>http://www.cppblog.com/Fox/archive/2009/02/19/63056.html#74251</link><dc:creator>cppexplore</dc:creator><author>cppexplore</author><pubDate>Thu, 19 Feb 2009 02:16:00 GMT</pubDate><guid>http://www.cppblog.com/Fox/archive/2009/02/19/63056.html#74251</guid><description><![CDATA[@OwnWaterloo <br>呵呵 你觉得你的想法来源于面向对象的纸上谈兵（没有贬义）以及基于win32的mfc框架程序设计。<br>我的实现不是为了模拟虚函数的实现，只是为了实现一个易维护的消息映射而已。<br>首先 对象A不能直接向对象B直接发送消息，需要调用对象B的ON_send_msg，由B自己的方法向自己发送消息，由B的DO_Msg方法处理消息，当然发送动作和处理动作在不同的线程内。任何对象向B发送消息都要调用B自己的方法。也就是说对象B的具体消息类型对其它对象是不可见的。<br>因此对象B中的消息类型是连续的，并且不存在自己不感兴趣的消息，既然不感兴趣，就不会存在这个消息类型，只要是存在的就是感兴趣的，就是要处理的。也不存在对多个消息，处理方式相同的问题，既然处理方式相同，它们就是同一个消息。<br>其次 你还是回避了大型程序开发中，使用虚函数方式，文件个数膨胀的问题。<br>最后 我讨论的是线程间的消息传递和映射，你的有偏向于 已经发送到UI线程的消息，对责任链模式上的 各个对象的后续处理。<img src ="http://www.cppblog.com/Fox/aggbug/74251.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Fox/" target="_blank">cppexplore</a> 2009-02-19 10:16 <a href="http://www.cppblog.com/Fox/archive/2009/02/19/63056.html#74251#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 消息映射机制的简单实现</title><link>http://www.cppblog.com/Fox/archive/2009/02/19/63056.html#74229</link><dc:creator>OwnWaterloo</dc:creator><author>OwnWaterloo</author><pubDate>Wed, 18 Feb 2009 18:16:00 GMT</pubDate><guid>http://www.cppblog.com/Fox/archive/2009/02/19/63056.html#74229</guid><description><![CDATA[<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 考虑<strong>扩展</strong></div>
<div>&nbsp;</div>
<div>添加一个新的消息处理类。</div>
<div>如果基类不是纯虚函数，那最简单了，覆写需要关心的消息就可以了。</div>
<div>如果是纯虚函数，需要实现所有消息处理函数，对不关心的消息，使用基类默认处理。</div>
<div>&nbsp;</div>
<div>而你的方案，不得不将<strong>所有的消息都映射一遍</strong>——因为【消息类型做数组下标，直接定位取处理函数】——即使不关心而作一个<strong>空函数</strong>。&nbsp;
<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"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">BEGIN_MESSAGE_MAP(SessionManager,SessionMsg)<br><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ON_MESSAGE(MSG_TYPE_1,&nbsp;SessionManager::do_msg_type_1_)<br><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ON_MESSAGE(MSG_TYPE_2,&nbsp;SessionManager::do_msg_type_2_)<br><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;.. <strong>MORE</strong></span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">END_MESSAGE_MAP()</span></div>
</div>
<div>如果不是这样，请<strong>务必</strong>告诉我你是怎么不使用虚函数实现的。</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>添加一个新的消息种类（消息代码）</div>
<div>如果可以保证消息代码连续，可以使用上面的方案2，在表格中多加入一条。</div>
<div>如果不能保证消息代码连续（并且非常稀疏），就只能采用swtich case。</div>
<div>&nbsp;</div>
<div><strong>已经编写好</strong>的具体的消息处理类，如果都可以安全忽略该消息，那么可以采用上面的方案2——基类有默认实现且不纯虚——那么除了基类，已经编写好的具体类都<strong>不需要修改</strong>。</div>
<div>如果不全都可以安全忽略该消息，那么可以采用上面的方案1——基类有空实现，但是纯虚——具类中可以忽略该消息的，使用基类实现，不能忽略的，编写处理函数。</div>
<div>&nbsp;</div>
<div>而你的方案，一旦添加一个新的消息处理代码（同时要<strong>保证连续</strong>），所有的消息处理类都必须在其表格中增加一项。</div>
<img src ="http://www.cppblog.com/Fox/aggbug/74229.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Fox/" target="_blank">OwnWaterloo</a> 2009-02-19 02:16 <a href="http://www.cppblog.com/Fox/archive/2009/02/19/63056.html#74229#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 消息映射机制的简单实现</title><link>http://www.cppblog.com/Fox/archive/2009/02/19/63056.html#74230</link><dc:creator>OwnWaterloo</dc:creator><author>OwnWaterloo</author><pubDate>Wed, 18 Feb 2009 18:16:00 GMT</pubDate><guid>http://www.cppblog.com/Fox/archive/2009/02/19/63056.html#74230</guid><description><![CDATA[移植性确实会在不支持虚函数的语言中完败。<br>论理解、扩展、维护、简单的话，你现在仍然觉得虚函数比不上表格吗？<br><img src ="http://www.cppblog.com/Fox/aggbug/74230.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Fox/" target="_blank">OwnWaterloo</a> 2009-02-19 02:16 <a href="http://www.cppblog.com/Fox/archive/2009/02/19/63056.html#74230#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 消息映射机制的简单实现</title><link>http://www.cppblog.com/Fox/archive/2009/02/19/63056.html#74228</link><dc:creator>OwnWaterloo</dc:creator><author>OwnWaterloo</author><pubDate>Wed, 18 Feb 2009 17:57:00 GMT</pubDate><guid>http://www.cppblog.com/Fox/archive/2009/02/19/63056.html#74228</guid><description><![CDATA[<span class=Apple-style-span style="WORD-SPACING: 0px; FONT: 16px 新宋体; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0">
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><span class=Apple-style-span style="FONT-SIZE: 13px; FONT-FAMILY: Verdana; webkit-border-horizontal-spacing: 1px; webkit-border-vertical-spacing: 1px">@cppexplore<br></span></div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><span class=Apple-style-span style="FONT-SIZE: 13px; FONT-FAMILY: Verdana; webkit-border-horizontal-spacing: 1px; webkit-border-vertical-spacing: 1px">【怎么不直接去我blog回复呢 呵呵】<br></span><span class=Apple-style-span style="FONT-SIZE: 13px; FONT-FAMILY: Verdana; webkit-border-horizontal-spacing: 1px; webkit-border-vertical-spacing: 1px">好像是cppblog对url的分析有点问题，这个url： <a href="/CppExplore/archive/2008/11/07/66216.html">http://www.cppblog.com/CppExplore/archive/2008/11/07/66216.html</a><br></span><span class=Apple-style-span style="FONT-SIZE: 13px; FONT-FAMILY: Verdana; webkit-border-horizontal-spacing: 1px; webkit-border-vertical-spacing: 1px">会被截取，只将前面一部分（也就是你的主页）制作成链接，点过去没看见什么文章&#8230;&#8230; <br></span><span class=Apple-style-span style="FONT-SIZE: 13px; FONT-FAMILY: Verdana; webkit-border-horizontal-spacing: 1px; webkit-border-vertical-spacing: 1px">后来才发现这个问题，找到那篇文章&#8230;&#8230;<br></span></div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><span class=Apple-style-span style="FONT-SIZE: 13px; FONT-FAMILY: Verdana; webkit-border-horizontal-spacing: 1px; webkit-border-vertical-spacing: 1px">【容易理解，容易扩展，容易维护，容易移植，容易简单化】<br></span><span class=Apple-style-span style="FONT-SIZE: 13px; FONT-FAMILY: Verdana; webkit-border-horizontal-spacing: 1px; webkit-border-vertical-spacing: 1px">嗯，这是重点。同时我也赞同你文章里最后一句话【一句话:重要的是思想，不是平台和语言。】<br>&nbsp;</span></div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><span class=Apple-style-span style="FONT-SIZE: 13px; FONT-FAMILY: Verdana; webkit-border-horizontal-spacing: 1px; webkit-border-vertical-spacing: 1px">"<span class=Apple-style-span style="FONT-WEIGHT: bold">你的实现就是模拟C++虚函数的经典实现</span>"，这个观点你赞同吗？<br></span><span class=Apple-style-span style="FONT-SIZE: 13px; FONT-FAMILY: Verdana; webkit-border-horizontal-spacing: 1px; webkit-border-vertical-spacing: 1px">你的系统需要考虑向C（以及<span class=Apple-style-span style="FONT-WEIGHT: bold">不支持虚函数的语言</span>）移植吗？<br>&nbsp;</span></div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><span class=Apple-style-span style="FONT-SIZE: 13px; FONT-FAMILY: Verdana; webkit-border-horizontal-spacing: 1px; webkit-border-vertical-spacing: 1px">如果<span class=Apple-style-span style="FONT-WEIGHT: bold">赞同且不需要</span>，那么继续讨论<strong>理解</strong>、<strong>扩展</strong>、<strong>维护</strong>、<strong>简单</strong>。</span></div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><span class=Apple-style-span style="FONT-SIZE: 13px; FONT-FAMILY: Verdana; webkit-border-horizontal-spacing: 1px; webkit-border-vertical-spacing: 1px">你的系统具体要做什么不太了解，我用win32作例子可以吗？比如，现在需要关心的消息只有2个：<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: #0000ff">enum</span><span style="COLOR: #000000">&nbsp;MsgType&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;WM__LBUTTONDOWN&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">=&nbsp;0</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;WM__SIZING,<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">};<br></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;Msg&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;MsgType&nbsp;type;<br>&nbsp;&nbsp;&nbsp;&nbsp;HWND&nbsp;&nbsp;&nbsp;&nbsp;hwnd;<br>&nbsp;&nbsp;&nbsp;&nbsp;WPARAM&nbsp;&nbsp;wparam;<br>&nbsp;&nbsp;&nbsp;&nbsp;LPARAM&nbsp;&nbsp;lparam;<br>};</span></div>
<br></span></div>
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><span class=Apple-style-span style="FONT-SIZE: 13px; FONT-FAMILY: Verdana; webkit-border-horizontal-spacing: 1px; webkit-border-vertical-spacing: 1px">如果使用C++虚函数机制：</span>
<div>&nbsp;</div>
<div>
<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"><img id=Codehighlighter1_15_885_Open_Image onclick="this.style.display='none'; Codehighlighter1_15_885_Open_Text.style.display='none'; Codehighlighter1_15_885_Closed_Image.style.display='inline'; Codehighlighter1_15_885_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_15_885_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_15_885_Closed_Text.style.display='none'; Codehighlighter1_15_885_Open_Image.style.display='inline'; Codehighlighter1_15_885_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;IHandler&nbsp;</span><span id=Codehighlighter1_15_885_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif"></span><span id=Codehighlighter1_15_885_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img id=Codehighlighter1_49_50_Open_Image onclick="this.style.display='none'; Codehighlighter1_49_50_Open_Text.style.display='none'; Codehighlighter1_49_50_Closed_Image.style.display='inline'; Codehighlighter1_49_50_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_49_50_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_49_50_Closed_Text.style.display='none'; Codehighlighter1_49_50_Open_Image.style.display='inline'; Codehighlighter1_49_50_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">IHandler()&nbsp;</span><span id=Codehighlighter1_49_50_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif"></span><span id=Codehighlighter1_49_50_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">:<br><img id=Codehighlighter1_152_153_Open_Image onclick="this.style.display='none'; Codehighlighter1_152_153_Open_Text.style.display='none'; Codehighlighter1_152_153_Closed_Image.style.display='inline'; Codehighlighter1_152_153_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_152_153_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_152_153_Closed_Text.style.display='none'; Codehighlighter1_152_153_Open_Image.style.display='inline'; Codehighlighter1_152_153_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;OnLButtonDown(POINTS&nbsp;pt,</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;ctrl,</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;shift,</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;l,</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;m,</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;r)&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_152_153_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif"></span><span id=Codehighlighter1_152_153_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;<br><img id=Codehighlighter1_205_206_Open_Image onclick="this.style.display='none'; Codehighlighter1_205_206_Open_Text.style.display='none'; Codehighlighter1_205_206_Closed_Image.style.display='inline'; Codehighlighter1_205_206_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_205_206_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_205_206_Closed_Text.style.display='none'; Codehighlighter1_205_206_Open_Image.style.display='inline'; Codehighlighter1_205_206_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;OnSizing(RECT</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;rc,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;side)&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_205_206_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif"></span><span id=Codehighlighter1_205_206_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img id=Codehighlighter1_242_883_Open_Image onclick="this.style.display='none'; Codehighlighter1_242_883_Open_Text.style.display='none'; Codehighlighter1_242_883_Closed_Image.style.display='inline'; Codehighlighter1_242_883_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_242_883_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_242_883_Closed_Text.style.display='none'; Codehighlighter1_242_883_Open_Image.style.display='inline'; Codehighlighter1_242_883_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;LRESULT&nbsp;Do(Msg</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;msg)&nbsp;</span><span id=Codehighlighter1_242_883_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif"></span><span id=Codehighlighter1_242_883_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_271_802_Open_Image onclick="this.style.display='none'; Codehighlighter1_271_802_Open_Text.style.display='none'; Codehighlighter1_271_802_Closed_Image.style.display='inline'; Codehighlighter1_271_802_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_271_802_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_271_802_Closed_Text.style.display='none'; Codehighlighter1_271_802_Open_Image.style.display='inline'; Codehighlighter1_271_802_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">switch</span><span style="COLOR: #000000">&nbsp;(msg</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">type)&nbsp;</span><span id=Codehighlighter1_271_802_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif"></span><span id=Codehighlighter1_271_802_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;WM__LBUTTONDOWN:<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnLButtonDown(MAKEPOINTS(msg</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">lparam)<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,msg</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">wparam&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;MK_CONTROL<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,msg</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">wparam&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;MK_SHIFT<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,msg</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">wparam&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;MK_LBUTTON<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,msg</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">wparam&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;MK_MBUTTON<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,msg</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">wparam&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;MK_RBUTTON);<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;WM__SIZING:<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnSizing(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">reinterpret_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">RECT</span><span style="COLOR: #000000">*&gt;</span><span style="COLOR: #000000">(msg</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">lparam),msg</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">wparam);<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;DefWindowProc(msg</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">hwnd,msg</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">type,msg</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">wparam,msg</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">lparam);<br><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;</span></div>
</div>
</div>
</span>
<div>&nbsp;</div>
<div>具体的消息处理类可以这样：</div>
<div>
<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"><img id=Codehighlighter1_33_255_Open_Image onclick="this.style.display='none'; Codehighlighter1_33_255_Open_Text.style.display='none'; Codehighlighter1_33_255_Closed_Image.style.display='inline'; Codehighlighter1_33_255_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_33_255_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_33_255_Closed_Text.style.display='none'; Codehighlighter1_33_255_Open_Image.style.display='inline'; Codehighlighter1_33_255_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Handler1&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;IHandler&nbsp;</span><span id=Codehighlighter1_33_255_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif"></span><span id=Codehighlighter1_33_255_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_111_171_Open_Image onclick="this.style.display='none'; Codehighlighter1_111_171_Open_Text.style.display='none'; Codehighlighter1_111_171_Closed_Image.style.display='inline'; Codehighlighter1_111_171_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_111_171_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_111_171_Closed_Text.style.display='none'; Codehighlighter1_111_171_Open_Image.style.display='inline'; Codehighlighter1_111_171_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;OnLButtonDown(POINTS&nbsp;pt,</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;ctrl,</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;shift,</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;l,</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;m,</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;r)&nbsp;</span><span id=Codehighlighter1_111_171_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif"></span><span id=Codehighlighter1_111_171_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IHandler::OnLButtonDown(pt,ctrl,shift,l,m,r);<br><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_210_253_Open_Image onclick="this.style.display='none'; Codehighlighter1_210_253_Open_Text.style.display='none'; Codehighlighter1_210_253_Closed_Image.style.display='inline'; Codehighlighter1_210_253_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_210_253_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_210_253_Closed_Text.style.display='none'; Codehighlighter1_210_253_Open_Image.style.display='inline'; Codehighlighter1_210_253_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;OnSizing(RECT</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;rc,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;side)&nbsp;</span><span id=Codehighlighter1_210_253_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif"></span><span id=Codehighlighter1_210_253_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IHandler::OnSizing(rc,side);<br><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;</span></div>
</div>
<div>&nbsp;</div>
<div>上面的基类的虚函数带有默认实现，但设置为纯虚函数。</div>
<div>具体类必须实现每个消息处理过程，如果不关心，可以简单使用基类实现。</div>
<div>另一种方式：基类提供默认实现，并且不是纯虚函数；具体类只需覆写关心的消息。</div>
<div>&nbsp;</div>
<div>另一方面，上面的基类没有使用表格，如果觉得switch case 不好维护，也可以使用表格。</div>
<div>&nbsp;</div>
<div>两方面都采用另一种方案的话，基类就如下：</div>
<div>
<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"><img id=Codehighlighter1_15_1113_Open_Image onclick="this.style.display='none'; Codehighlighter1_15_1113_Open_Text.style.display='none'; Codehighlighter1_15_1113_Closed_Image.style.display='inline'; Codehighlighter1_15_1113_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_15_1113_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_15_1113_Closed_Text.style.display='none'; Codehighlighter1_15_1113_Open_Image.style.display='inline'; Codehighlighter1_15_1113_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;IHandler&nbsp;</span><span id=Codehighlighter1_15_1113_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif"></span><span id=Codehighlighter1_15_1113_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img id=Codehighlighter1_49_50_Open_Image onclick="this.style.display='none'; Codehighlighter1_49_50_Open_Text.style.display='none'; Codehighlighter1_49_50_Closed_Image.style.display='inline'; Codehighlighter1_49_50_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_49_50_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_49_50_Closed_Text.style.display='none'; Codehighlighter1_49_50_Open_Image.style.display='inline'; Codehighlighter1_49_50_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">IHandler()&nbsp;</span><span id=Codehighlighter1_49_50_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif"></span><span id=Codehighlighter1_49_50_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br><img id=Codehighlighter1_147_148_Open_Image onclick="this.style.display='none'; Codehighlighter1_147_148_Open_Text.style.display='none'; Codehighlighter1_147_148_Closed_Image.style.display='inline'; Codehighlighter1_147_148_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_147_148_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_147_148_Closed_Text.style.display='none'; Codehighlighter1_147_148_Open_Image.style.display='inline'; Codehighlighter1_147_148_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;OnLButtonDown(POINTS&nbsp;pt,</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;ctrl,</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;shift,</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;l,</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;m,</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;r)&nbsp;&nbsp;</span><span id=Codehighlighter1_147_148_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif"></span><span id=Codehighlighter1_147_148_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;<br><img id=Codehighlighter1_197_198_Open_Image onclick="this.style.display='none'; Codehighlighter1_197_198_Open_Text.style.display='none'; Codehighlighter1_197_198_Closed_Image.style.display='inline'; Codehighlighter1_197_198_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_197_198_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_197_198_Closed_Text.style.display='none'; Codehighlighter1_197_198_Open_Image.style.display='inline'; Codehighlighter1_197_198_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;OnSizing(RECT</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;rc,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;side)&nbsp;&nbsp;</span><span id=Codehighlighter1_197_198_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif"></span><span id=Codehighlighter1_197_198_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img id=Codehighlighter1_234_380_Open_Image onclick="this.style.display='none'; Codehighlighter1_234_380_Open_Text.style.display='none'; Codehighlighter1_234_380_Closed_Image.style.display='inline'; Codehighlighter1_234_380_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_234_380_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_234_380_Closed_Text.style.display='none'; Codehighlighter1_234_380_Open_Image.style.display='inline'; Codehighlighter1_234_380_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;LRESULT&nbsp;Do(Msg</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;msg)&nbsp;</span><span id=Codehighlighter1_234_380_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif"></span><span id=Codehighlighter1_234_380_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert(msg</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">type</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;msg</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">type</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">WM__SIZING);<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;MsgProcs[msg</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">type](msg</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">hwnd,msg</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">type,msg</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">wparam,msg</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">lparam,</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;LRESULT&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">MsgProc)(HWND,MsgType,WPARAM,LPARAM,IHandler</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;handler);<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;MsgProc&nbsp;MsgProcs[];<br><img id=Codehighlighter1_600_929_Open_Image onclick="this.style.display='none'; Codehighlighter1_600_929_Open_Text.style.display='none'; Codehighlighter1_600_929_Closed_Image.style.display='inline'; Codehighlighter1_600_929_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_600_929_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_600_929_Closed_Text.style.display='none'; Codehighlighter1_600_929_Open_Image.style.display='inline'; Codehighlighter1_600_929_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;LRESULT&nbsp;OnLButtonDown(HWND,MsgType,WPARAM&nbsp;wparam,LPARAM&nbsp;lparam,IHandler</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;handler)&nbsp;</span><span id=Codehighlighter1_600_929_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif"></span><span id=Codehighlighter1_600_929_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handler</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">OnLButtonDown(MAKEPOINTS(lparam)<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,wparam&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;MK_CONTROL<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,wparam&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;MK_SHIFT<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,wparam&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;MK_LBUTTON<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,wparam&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;MK_MBUTTON<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,wparam&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;MK_RBUTTON);<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_1019_1111_Open_Image onclick="this.style.display='none'; Codehighlighter1_1019_1111_Open_Text.style.display='none'; Codehighlighter1_1019_1111_Closed_Image.style.display='inline'; Codehighlighter1_1019_1111_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1019_1111_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1019_1111_Closed_Text.style.display='none'; Codehighlighter1_1019_1111_Open_Image.style.display='inline'; Codehighlighter1_1019_1111_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;LRESULT&nbsp;OnSizing(HWND,MsgType,WPARAM&nbsp;wparam,LPARAM&nbsp;lparam,IHandler</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;handler)&nbsp;</span><span id=Codehighlighter1_1019_1111_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif"></span><span id=Codehighlighter1_1019_1111_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handler</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">OnSizing(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">reinterpret_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">RECT</span><span style="COLOR: #000000">*&gt;</span><span style="COLOR: #000000">(lparam),wparam);<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_1164_1219_Open_Image onclick="this.style.display='none'; Codehighlighter1_1164_1219_Open_Text.style.display='none'; Codehighlighter1_1164_1219_Closed_Image.style.display='inline'; Codehighlighter1_1164_1219_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_1164_1219_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1164_1219_Closed_Text.style.display='none'; Codehighlighter1_1164_1219_Open_Image.style.display='inline'; Codehighlighter1_1164_1219_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;IHandler::MsgProc&nbsp;IHandler::MsgProcs[]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_1164_1219_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif"></span><span id=Codehighlighter1_1164_1219_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;IHandler::OnLButtonDown,<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;IHandler::OnSizing,<br><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;</span></div>
</div>
<div><br class=Apple-interchange-newline>具体类的编写就更简单： 假设仅关心OnLButtonDown</div>
<div>
<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">
<div><img id=Codehighlighter1_33_187_Open_Image onclick="this.style.display='none'; Codehighlighter1_33_187_Open_Text.style.display='none'; Codehighlighter1_33_187_Closed_Image.style.display='inline'; Codehighlighter1_33_187_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_33_187_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_33_187_Closed_Text.style.display='none'; Codehighlighter1_33_187_Open_Image.style.display='inline'; Codehighlighter1_33_187_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Handler1&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;IHandler&nbsp;</span><span id=Codehighlighter1_33_187_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif"></span><span id=Codehighlighter1_33_187_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_111_185_Open_Image onclick="this.style.display='none'; Codehighlighter1_111_185_Open_Text.style.display='none'; Codehighlighter1_111_185_Closed_Image.style.display='inline'; Codehighlighter1_111_185_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_111_185_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_111_185_Closed_Text.style.display='none'; Codehighlighter1_111_185_Open_Image.style.display='inline'; Codehighlighter1_111_185_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;OnLButtonDown(POINTS&nbsp;pt,</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;ctrl,</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;shift,</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;l,</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;m,</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;r)&nbsp;</span><span id=Codehighlighter1_111_185_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif"></span><span id=Codehighlighter1_111_185_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">(%d,%d)&nbsp;ctrl=%d,shitf=%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,pt.x,pt.y,ctrl,shift);<br><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;</span></div>
</div>
</div>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/Fox/aggbug/74228.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Fox/" target="_blank">OwnWaterloo</a> 2009-02-19 01:57 <a href="http://www.cppblog.com/Fox/archive/2009/02/19/63056.html#74228#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 消息映射机制的简单实现[未登录]</title><link>http://www.cppblog.com/Fox/archive/2009/02/18/63056.html#74183</link><dc:creator>cppexplore </dc:creator><author>cppexplore </author><pubDate>Wed, 18 Feb 2009 10:55:00 GMT</pubDate><guid>http://www.cppblog.com/Fox/archive/2009/02/18/63056.html#74183</guid><description><![CDATA[@OwnWaterloo <br>呵呵，最后的问题归结为：哪种更容易理解和扩展。<br>超大工程当然是数组方式之上用宏展现最容易理解和扩展了，简洁直接。几十w行的代码，用虚函数，文件数量的迅速膨胀 找个东西都找不到在哪里，所有东西交织错乱在一起，最终维护程序的人都会想：要是有张表就好了，只看表就知道那个函数处理哪个消息，而宏的展现就是如此。  当然如果用宏包裹下虚函数的实现，结果就一样了。<br>并且数组表只是一个思路，不携带任何面向对象的语义，在这个业务系统里可用，在那个业务系统里也可用，虚函数有这么好的移植性吗？有这么简单化吗？<img src ="http://www.cppblog.com/Fox/aggbug/74183.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Fox/" target="_blank">cppexplore </a> 2009-02-18 18:55 <a href="http://www.cppblog.com/Fox/archive/2009/02/18/63056.html#74183#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 消息映射机制的简单实现[未登录]</title><link>http://www.cppblog.com/Fox/archive/2009/02/18/63056.html#74180</link><dc:creator>cppexplore </dc:creator><author>cppexplore </author><pubDate>Wed, 18 Feb 2009 10:21:00 GMT</pubDate><guid>http://www.cppblog.com/Fox/archive/2009/02/18/63056.html#74180</guid><description><![CDATA[@OwnWaterloo <br>怎么不直接去我blog回复呢 呵呵<br>其实 时间消耗 之类并不是我最得意的东西，这种实现的细节 我并不太关注，所以质疑你以前说的 “虚函数占用较多资源而导致不得已采用消息路由”，如何实现并不重要，关键的是容易理解，容易扩展，容易维护，容易移植，容易简单化。<br>win32 你是指win32 的界面设计？ 业务系统里 基本不同的消息有不同的实现，我的本意其实都不在实现，而在于简单的思想，因此是查表实现 还是虚函数实现 也都无所谓，只要最后有统一的扩展方式。<img src ="http://www.cppblog.com/Fox/aggbug/74180.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Fox/" target="_blank">cppexplore </a> 2009-02-18 18:21 <a href="http://www.cppblog.com/Fox/archive/2009/02/18/63056.html#74180#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 消息映射机制的简单实现</title><link>http://www.cppblog.com/Fox/archive/2009/02/18/63056.html#74178</link><dc:creator>OwnWaterloo</dc:creator><author>OwnWaterloo</author><pubDate>Wed, 18 Feb 2009 10:03:00 GMT</pubDate><guid>http://www.cppblog.com/Fox/archive/2009/02/18/63056.html#74178</guid><description><![CDATA[<span  style="font-family: Verdana; font-size: 13px; ">@cppexplore</span>

<div><span  style="font-family: Verdana; font-size: 13px;"><br></span></div><div><span  style="font-family: Verdana; font-size: 13px;">再看了下你的实现，好像我们讨论的着重点不一样。</span></div><div><span  style="font-family: Verdana; font-size: 13px;"><br></span></div><div><span  style="font-family: Verdana; font-size: 13px;">1. 你的系统里，是不是首先有这样一个需求：</span></div><div><span  style="font-family: Verdana; font-size: 13px;">因为某种原因（分布式，进程间，无锁线程），消息的发送者不能直接调用消息处理函数，而是传送一个消息代码来表示需要处理的类型？</span></div><div><br></div><div><span  style="font-family: Verdana; font-size: 13px;">消息代码即是win32中的WM_XX或者你的系统中的&#160;<span  style="line-height: 16px; "><span style="color: rgb(0, 0, 255); line-height: 120%; font-size: 13px; ">enum</span><span style="color: rgb(0, 0, 0); line-height: 120%; font-size: 13px; ">&#160;MsgType {&#160;<span style="color: rgb(0, 0, 0); line-height: 120%; font-size: 13px; ">MSG_TYPE_1＝</span><span style="color: rgb(0, 0, 0); line-height: 120%; font-size: 13px; ">65, ...&#160;&#160;};</span></span></span></span></div><div><span  style="font-family: Verdana; font-size: 13px; line-height: 15px;"><br></span></div><div><span  style="font-family: Verdana; font-size: 13px; line-height: 15px;"><br></span></div><div><span  style="font-family: Verdana; font-size: 13px; line-height: 15px;"><br></span></div><div><span  style="font-family: Verdana; font-size: 13px;">2. 消息的处理者，又需要按照约定（即消息代码的含义），将其映射到某个处理函数中。</span></div><div><span  style="font-family: Verdana; font-size: 13px;"><br></span></div><div><span  style="font-family: Verdana; font-size: 13px;">如 win32 中</span></div><div><span  style="font-family: Verdana; font-size: 13px;">switch (message) {</span></div><div><span  style="font-family: Verdana; font-size: 13px;">case WM_XXX:</span></div><div><span  style="font-family: Verdana; font-size: 13px;">&#160;&#160; return OnXXX(hwnd,message,wparam,lparam);</span></div><div><span  style="font-family: Verdana; font-size: 13px;">...</span></div><div><span  style="font-family: Verdana; font-size: 13px;">}</span></div><div><span  style="font-family: Verdana; font-size: 13px;"><br></span></div><div><span  style="font-family: Verdana; font-size: 13px;">或者你的系统中的</span></div><div><span  style="font-family: Verdana; font-size: 13px;"><span  style="line-height: 16px; "><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"><span style="color: rgb(0, 0, 255); line-height: 120%; font-size: 13px; ">switch</span><span style="color: rgb(0, 0, 0); line-height: 120%; font-size: 13px; ">(msg</span><span style="color: rgb(0, 0, 0); line-height: 120%; font-size: 13px; ">-></span><span style="color: rgb(0, 0, 0); line-height: 120%; font-size: 13px; ">type)<br><img id="Codehighlighter1_18_199_Open_Image" onclick="this.style.display='none'; Codehighlighter1_18_199_Open_Text.style.display='none'; Codehighlighter1_18_199_Closed_Image.style.display='inline'; Codehighlighter1_18_199_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"></span><span id="Codehighlighter1_18_199_Open_Text" style="line-height: 120%; font-size: 13px; "><span style="color: rgb(0, 0, 0); line-height: 120%; font-size: 13px; ">{<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top">&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255); line-height: 120%; font-size: 13px; ">case</span><span style="color: rgb(0, 0, 0); line-height: 120%; font-size: 13px; ">&#160;MSG_TYPE_1:<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;do_msg_type_1_();<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255); line-height: 120%; font-size: 13px; ">break</span><span style="color: rgb(0, 0, 0); line-height: 120%; font-size: 13px; ">;<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top">&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255); line-height: 120%; font-size: 13px; ">case</span><span style="color: rgb(0, 0, 0); line-height: 120%; font-size: 13px; ">&#160;MSG_TYPE_2:<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;do_msg_type_2_();<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255); line-height: 120%; font-size: 13px; ">break</span><span style="color: rgb(0, 0, 0); line-height: 120%; font-size: 13px; ">;<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top">&#160;&#160;&#160;&#160;<img src="http://www.cppblog.com/images/dot.gif">..<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top">&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255); line-height: 120%; font-size: 13px; ">default</span><span style="color: rgb(0, 0, 0); line-height: 120%; font-size: 13px; ">:<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;do_default_msg_();<br><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: rgb(0, 0, 255); line-height: 120%; font-size: 13px; ">break</span><span style="color: rgb(0, 0, 0); line-height: 120%; font-size: 13px; ">;<br><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span></span><br></span></div><div><span  style="font-family: Verdana; font-size: 13px; line-height: 15px;"><br></span></div><div><span  style="font-family: Verdana; font-size: 13px; line-height: 15px;"><br></span></div><div><span  style="font-family: Verdana; font-size: 13px; line-height: 15px;">在这一步，<span  style="font-weight: bold;">确实</span>是你的实现方式时间效率比较高。</span></div><div><span  style="font-family: Verdana; font-size: 13px; line-height: 15px;">但是在win32中， 这样做不太现实 &#8230;&#8230; &#160;1000多个消息，表格就要包含1000多项，而且大多都是DefWndProc。</span></div><div><span  style="font-family: Verdana; font-size: 13px; line-height: 15px;"><br></span></div><div><span  style="font-family: Verdana; font-size: 13px; line-height: 15px;">并且，在这一步中，<span  style="font-weight: bold;">虚函数根本就提供不了任何帮助</span>。</span></div><div><span  style="font-family: Verdana; font-size: 13px; line-height: 15px;">你的着重点在这一步？</span></div><div><span  style="font-family: Verdana; font-size: 13px; line-height: 15px;"><br></span></div><div><br></div><div><span  style="font-family: Verdana; font-size: 13px; line-height: 15px;">3. 你想实现一个消息处理者B，它对大多数消息的处理方式同A一样，这时候如何尽可能的使用A的实现？</span></div><div><span  style="font-family: Verdana; font-size: 13px; line-height: 15px;">（暂不说依赖于某实现是不太恰当的设计，在MFC中多如牛毛&#8230;&#8230;）</span></div><div><span  style="font-family: Verdana; font-size: 13px; line-height: 15px;"><br></span></div><div><span  style="font-family: Verdana; font-size: 13px; line-height: 15px;">我的着重点在这里，我对处理这步的观点是： 『<span  style="line-height: normal; ">消息类型做数组下标了，直接定位取处理函数』与『<span style="COLOR:red"><span  style="font-weight: bold;">覆写</span></span>虚函数』相比，时空效率是相同的，我觉得后者更容易理解和扩展。</span></span></div><div><span  style="font-family: Verdana; font-size: 13px;"><br></span></div><div><span  style="font-family: Verdana; font-size: 13px; line-height: 15px;"><br></span></div><img src ="http://www.cppblog.com/Fox/aggbug/74178.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Fox/" target="_blank">OwnWaterloo</a> 2009-02-18 18:03 <a href="http://www.cppblog.com/Fox/archive/2009/02/18/63056.html#74178#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 消息映射机制的简单实现</title><link>http://www.cppblog.com/Fox/archive/2009/02/18/63056.html#74164</link><dc:creator>OwnWaterloo</dc:creator><author>OwnWaterloo</author><pubDate>Wed, 18 Feb 2009 08:40:00 GMT</pubDate><guid>http://www.cppblog.com/Fox/archive/2009/02/18/63056.html#74164</guid><description><![CDATA[@cppexplore<br><br>【查表是本质】<br>这句你说到重点了，虚函数和你实现的那个还有哪些所谓的用C实现OO的，都是查表。<br><br>【为什么要使用虚函数？更容易理解?MFC的消息映射展现方式很难理解吗？ 虚函数更容易扩展吗？】<br>你这个实现就是在『模拟』虚函数。<br><br>上面的时空分析，可以量化，我有把握你会同意我的观点——两者时空效率完全一样——这个扩展性嘛，不容易量化 ……<br><br>你可以试着把你的实现用虚函数改写一下（再次说明，时空效率完全一样）。看看是否觉得虚函数更容易理解，更容易扩展。<br><br><br><br>btw：推荐你看看这个，MFC会什么会采用消息映射而不是虚函数的理由，《C++多态技术的实现和反思》<br><a target="_new" href="http://dev.yesky.com/189/2385189.shtml">http://dev.yesky.com/189/2385189.shtml</a><br><br><img src ="http://www.cppblog.com/Fox/aggbug/74164.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Fox/" target="_blank">OwnWaterloo</a> 2009-02-18 16:40 <a href="http://www.cppblog.com/Fox/archive/2009/02/18/63056.html#74164#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 消息映射机制的简单实现</title><link>http://www.cppblog.com/Fox/archive/2009/02/18/63056.html#74163</link><dc:creator>OwnWaterloo</dc:creator><author>OwnWaterloo</author><pubDate>Wed, 18 Feb 2009 08:29:00 GMT</pubDate><guid>http://www.cppblog.com/Fox/archive/2009/02/18/63056.html#74163</guid><description><![CDATA[@cppexplore<br><br>1. 时间消耗<br><br>时间消耗自然不用说，是你的实现最得意的部分，o(1)。<br>同样，虚函数也是o(1)。<br><br>2. 空间消耗<br><br>假设你总共有N个消息，你仔细看看你的实现：<br>是不是每个（要处理消息的）类有一个长度会N的函数表，<br>空间大小至少是N&#215;sizeof(void*)；<br>每个对象有一个指向（或间接指向）该表的指针，<br>空间大小至少是sizeof(void*)。<br><br>虚函数的经典实现的空间消耗也是one class one vtbl, one object one vptr，和你的实现还是相同的。<br><br><br>这就回答了你一个问题：<br>【我不能认同，这个因素在整个系统中的开销你有没有量化过？比如 因为采用它导致并发数下降了多少多少之类？】<br>两者的时间空间效率是完全一致的，即使我没有量化过，也可以肯定，不会导致并发数下降。<br><br> <br><br><img src ="http://www.cppblog.com/Fox/aggbug/74163.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Fox/" target="_blank">OwnWaterloo</a> 2009-02-18 16:29 <a href="http://www.cppblog.com/Fox/archive/2009/02/18/63056.html#74163#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>re: 消息映射机制的简单实现[未登录]</title><link>http://www.cppblog.com/Fox/archive/2009/02/18/63056.html#74128</link><dc:creator>cppexplore</dc:creator><author>cppexplore</author><pubDate>Wed, 18 Feb 2009 04:00:00 GMT</pubDate><guid>http://www.cppblog.com/Fox/archive/2009/02/18/63056.html#74128</guid><description><![CDATA[@OwnWaterloo <br>欢迎来我blog讨论：<a target="_new" href="http://www.cppblog.com/CppExplore">http://www.cppblog.com/CppExplore</a>  这篇<a target="_new" href="http://www.cppblog.com/CppExplore">http://www.cppblog.com/CppExplore</a>/archive/2008/11/07/66216.html下。查表是本质，为什么要使用虚函数？更容易理解?MFC的消息映射展现方式很难理解吗？ 虚函数更容易扩展吗？ 说到虚函数占用较多资源而导致不得已采用消息路由，我不能认同，这个因素在整个系统中的开销你有没有量化过？比如 因为采用它导致并发数下降了多少多少之类？欢迎来我blog讨论。<img src ="http://www.cppblog.com/Fox/aggbug/74128.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Fox/" target="_blank">cppexplore</a> 2009-02-18 12:00 <a href="http://www.cppblog.com/Fox/archive/2009/02/18/63056.html#74128#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>