﻿<?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>BlogJava-code loser-随笔分类-C语言</title><link>http://www.blogjava.net/wenhl5656/category/34787.html</link><description>想起和老肖研究中断的日子，倍觉温馨</description><language>zh-cn</language><lastBuildDate>Tue, 22 Dec 2009 11:39:46 GMT</lastBuildDate><pubDate>Tue, 22 Dec 2009 11:39:46 GMT</pubDate><ttl>60</ttl><item><title>两个已排序链表的合并</title><link>http://www.blogjava.net/wenhl5656/archive/2009/06/21/283442.html</link><dc:creator>爱吃鱼头</dc:creator><author>爱吃鱼头</author><pubDate>Sun, 21 Jun 2009 04:02:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2009/06/21/283442.html</guid><wfw:comment>http://www.blogjava.net/wenhl5656/comments/283442.html</wfw:comment><comments>http://www.blogjava.net/wenhl5656/archive/2009/06/21/283442.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wenhl5656/comments/commentRss/283442.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wenhl5656/services/trackbacks/283442.html</trackback:ping><description><![CDATA[<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 0);">typedef&nbsp;</span><span style="color: rgb(0, 0, 255);">struct</span><span style="color: rgb(0, 0, 0);">&nbsp;Node{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;data;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">struct</span><span style="color: rgb(0, 0, 0);">&nbsp;Node</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">&nbsp;next;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">}Node,&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">LinkList;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;Merge(LinkList&nbsp;la,&nbsp;LinkList&nbsp;lb,&nbsp;LinkList </span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">lc)<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;NULL检测</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 0);">la)&nbsp;{lc&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;pb;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">;}<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 0);">lb)&nbsp;{lc&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;pa;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">;}<br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;Node</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">&nbsp;p;<br />
</span><span style="color: rgb(0, 128, 128);">11</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">12</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;确定最大值在la上,&nbsp;还是lb上</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">13</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(la.data&nbsp;</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;lb.data)&nbsp;{&nbsp;lc&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;p&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;la;&nbsp;la&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;la</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">next;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">14</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);">&nbsp;{&nbsp;lc&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;p&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;lb;&nbsp;lb&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;lb</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">next;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">15</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">16</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(la&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);">lb)<br />
</span><span style="color: rgb(0, 128, 128);">17</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">18</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(la.data&nbsp;</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;lb.data)<br />
</span><span style="color: rgb(0, 128, 128);">19</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">20</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">next&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;la;<br />
</span><span style="color: rgb(0, 128, 128);">21</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;la&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;la</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">next;<br />
</span><span style="color: rgb(0, 128, 128);">22</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(la.data&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">&nbsp;lb.data)<br />
</span><span style="color: rgb(0, 128, 128);">23</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">24</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">next&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;lb;<br />
</span><span style="color: rgb(0, 128, 128);">25</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lb&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;lb</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">next;<br />
</span><span style="color: rgb(0, 128, 128);">26</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);">{&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;la&nbsp;与&nbsp;lb中值相等的情况</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">27</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">next&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;la;<br />
</span><span style="color: rgb(0, 128, 128);">28</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;la&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;la</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">next;<br />
</span><span style="color: rgb(0, 128, 128);">29</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">&nbsp;tmp&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;lb;<br />
</span><span style="color: rgb(0, 128, 128);">30</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lb&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;lb</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">next;<br />
</span><span style="color: rgb(0, 128, 128);">31</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(tmp);<br />
</span><span style="color: rgb(0, 128, 128);">32</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">33</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;p</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">next;<br />
</span><span style="color: rgb(0, 128, 128);">34</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">35</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;剩余部分链表的挂接</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">36</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">next&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;(la&nbsp;</span><span style="color: rgb(0, 0, 0);">?</span><span style="color: rgb(0, 0, 0);">&nbsp;la:lb);<br />
</span><span style="color: rgb(0, 128, 128);">37</span>&nbsp;<span style="color: rgb(0, 0, 0);">}</span></div>
<img src ="http://www.blogjava.net/wenhl5656/aggbug/283442.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">爱吃鱼头</a> 2009-06-21 12:02 <a href="http://www.blogjava.net/wenhl5656/archive/2009/06/21/283442.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>带通配符的字符匹配</title><link>http://www.blogjava.net/wenhl5656/archive/2009/06/16/282490.html</link><dc:creator>爱吃鱼头</dc:creator><author>爱吃鱼头</author><pubDate>Mon, 15 Jun 2009 17:02:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2009/06/16/282490.html</guid><wfw:comment>http://www.blogjava.net/wenhl5656/comments/282490.html</wfw:comment><comments>http://www.blogjava.net/wenhl5656/archive/2009/06/16/282490.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wenhl5656/comments/commentRss/282490.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wenhl5656/services/trackbacks/282490.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:     最常见的通配符是?和*。其中，?可以代表一个字符（不能没有），*可以代表任意多个字符（可以为空）。<br>    首先是?，根据?的功能，?表示任意字符，也就是说在匹配过程中，?永远匹配成功。本质上，?并没有修改算法，而仅仅修改了匹配规则——遇到?则一定匹配。<br>    然而*与此不同，*的作用是匹配任意多个字符，显然我们不能简单的修改匹配过程而满足要求。如果我们重新思考*的作用，我们会发现*的另一个作用就是分割P串，即如果P=P1*P2，那么与其说*代表匹配任意多个字符，不如说P的匹配条件是在匹配P1子串后再匹配P2子串。<br>    因此，可以写出带通配符的字符串匹配算法&nbsp;&nbsp;<a href='http://www.blogjava.net/wenhl5656/archive/2009/06/16/282490.html'>阅读全文</a><img src ="http://www.blogjava.net/wenhl5656/aggbug/282490.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">爱吃鱼头</a> 2009-06-16 01:02 <a href="http://www.blogjava.net/wenhl5656/archive/2009/06/16/282490.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在VC中链接动态链接库的方法</title><link>http://www.blogjava.net/wenhl5656/archive/2008/10/04/232325.html</link><dc:creator>爱吃鱼头</dc:creator><author>爱吃鱼头</author><pubDate>Sat, 04 Oct 2008 06:47:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2008/10/04/232325.html</guid><wfw:comment>http://www.blogjava.net/wenhl5656/comments/232325.html</wfw:comment><comments>http://www.blogjava.net/wenhl5656/archive/2008/10/04/232325.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wenhl5656/comments/commentRss/232325.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wenhl5656/services/trackbacks/232325.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在做VC项目时，用到的关于动态链接库的一些知识。<br>链接动态链接库的一些方法&nbsp;&nbsp;<a href='http://www.blogjava.net/wenhl5656/archive/2008/10/04/232325.html'>阅读全文</a><img src ="http://www.blogjava.net/wenhl5656/aggbug/232325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">爱吃鱼头</a> 2008-10-04 14:47 <a href="http://www.blogjava.net/wenhl5656/archive/2008/10/04/232325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC中鼠标绘图的一些收获</title><link>http://www.blogjava.net/wenhl5656/archive/2008/10/03/232270.html</link><dc:creator>爱吃鱼头</dc:creator><author>爱吃鱼头</author><pubDate>Fri, 03 Oct 2008 15:38:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2008/10/03/232270.html</guid><wfw:comment>http://www.blogjava.net/wenhl5656/comments/232270.html</wfw:comment><comments>http://www.blogjava.net/wenhl5656/archive/2008/10/03/232270.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wenhl5656/comments/commentRss/232270.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wenhl5656/services/trackbacks/232270.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今天试学着在MFC中用鼠标绘图，虽然是简单的画一些直线，但也收获不小。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先对按下鼠标的点进行记录，因此在<span><strong>WM_LBUTTONDOWN</strong>消息添加代码：</span>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 9pt; color: blue; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp; </p>
<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: #008080">1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;CDrawView::OnLButtonDown(UINT&nbsp;nFlags,&nbsp;CPoint&nbsp;point)<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img id="Codehighlighter1_57_122_Open_Image" onclick="this.style.display='none'; Codehighlighter1_57_122_Open_Text.style.display='none'; Codehighlighter1_57_122_Closed_Image.style.display='inline'; Codehighlighter1_57_122_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_57_122_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_57_122_Closed_Text.style.display='none'; Codehighlighter1_57_122_Open_Image.style.display='inline'; Codehighlighter1_57_122_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_57_122_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_57_122_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;m_ptOrigin</span><span style="color: #000000">=</span><span style="color: #000000">point;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetCapture();<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;CView::OnLButtonDown(nFlags,&nbsp;point);<br />
</span><span style="color: #008080">5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left">&nbsp;&nbsp;&nbsp;&nbsp;然后，在鼠标弹起时，响应&nbsp;<span><strong>WM_LBUTTONUP</strong>消息，因此添加</p>
<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: #008080">1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;CDrawView::OnLButtonUp(UINT&nbsp;nFlags,&nbsp;CPoint&nbsp;point)<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img id="Codehighlighter1_55_152_Open_Image" onclick="this.style.display='none'; Codehighlighter1_55_152_Open_Text.style.display='none'; Codehighlighter1_55_152_Closed_Image.style.display='inline'; Codehighlighter1_55_152_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_55_152_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_55_152_Closed_Text.style.display='none'; Codehighlighter1_55_152_Open_Image.style.display='inline'; Codehighlighter1_55_152_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_55_152_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_55_152_Open_Text"><span style="color: #000000">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (GetCapture() != this)&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;return; <br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;CDC&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pDC</span><span style="color: #000000">=</span><span style="color: #000000">GetDC();<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;pDC</span><span style="color: #000000">-&gt;</span><span style="color: #000000">MoveTo(m_ptOrigin);<br />
</span><span style="color: #008080">5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;pDC</span><span style="color: #000000">-&gt;</span><span style="color: #000000">LineTo(point);<br />
</span><span style="color: #008080">6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;ReleaseDC(pDC);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReleaseCapture();<br />
</span><span style="color: #008080">7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left">&nbsp;&nbsp;&nbsp;&nbsp; 这样便在客户区绘出了一条直线。但是有个缺陷，就是在鼠标移动的过程中，屏幕上没有任何显示。而我们希望在按下鼠标后，随着鼠标拖动，可以看到一条直线随之移动，在鼠标弹起时，这条直线也确定下来。因此，试着添加<span>WM_MOUSEMOVE消息响应函数<br />
</p>
<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: #008080">1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;CDrawView::OnMouseMove(UNIT&nbsp;nFlags,&nbsp;CPoint&nbsp;point)<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img id="Codehighlighter1_55_152_Open_Image" onclick="this.style.display='none'; Codehighlighter1_55_152_Open_Text.style.display='none'; Codehighlighter1_55_152_Closed_Image.style.display='inline'; Codehighlighter1_55_152_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_55_152_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_55_152_Closed_Text.style.display='none'; Codehighlighter1_55_152_Open_Image.style.display='inline'; Codehighlighter1_55_152_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_55_152_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_55_152_Open_Text"><span style="color: #000000">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (GetCapture() != this)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return; <br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;CDC&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pDC</span><span style="color: #000000">=</span><span style="color: #000000">GetDC();&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;pDC</span><span style="color: #000000">-&gt;</span><span style="color: #000000">MoveTo(m_ptPrev);&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;pDC</span><span style="color: #000000">-&gt;</span><span style="color: #000000">LineTo(point);<br />
</span><span style="color: #008080">6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;ReleaseDC(pDC);<br />
</span><span style="color: #008080">7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 添加之后，在鼠标移动时，确实有直线绘出，但更大的问题出现了，只见屏幕是都是直线。为解决此问题，google良久，终于找到一个解决办法——在鼠标移动时，用异或笔模式绘图，即以与屏幕相反的颜色绘图(Pixel is the inverse of the screen color——MSDN)。具体做法是：记录鼠标移动的上一个点坐标，在鼠标移动时，设置异或绘图模式，绘制原来的直线，再绘制新直线。具体代码如下：<br />
</p>
<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: #008080">&nbsp;1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #008000">//</span><span style="color: #008000">在CDrawView中定义：<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;CPoint&nbsp;&nbsp;&nbsp;&nbsp;m_ptPrev;<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;CPoint&nbsp;&nbsp;&nbsp;&nbsp;m_ptOld;</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;CDrawView::OnLButtonDown(UINT&nbsp;nFlags,&nbsp;CPoint&nbsp;point)&nbsp;<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img id="Codehighlighter1_121_215_Open_Image" onclick="this.style.display='none'; Codehighlighter1_121_215_Open_Text.style.display='none'; Codehighlighter1_121_215_Closed_Image.style.display='inline'; Codehighlighter1_121_215_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_121_215_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_121_215_Closed_Text.style.display='none'; Codehighlighter1_121_215_Open_Image.style.display='inline'; Codehighlighter1_121_215_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_121_215_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.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_121_215_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;m_ptPrev&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;point;<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;m_ptOld&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;point;<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;SetCapture();&nbsp;<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;CView::OnLButtonDown(nFlags,&nbsp;point);<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;CDrawView::OnLButtonUp(UINT&nbsp;nFlags,&nbsp;CPoint&nbsp;point)&nbsp;<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img id="Codehighlighter1_274_416_Open_Image" onclick="this.style.display='none'; Codehighlighter1_274_416_Open_Text.style.display='none'; Codehighlighter1_274_416_Closed_Image.style.display='inline'; Codehighlighter1_274_416_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_274_416_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_274_416_Closed_Text.style.display='none'; Codehighlighter1_274_416_Open_Image.style.display='inline'; Codehighlighter1_274_416_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_274_416_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.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_274_416_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(GetCapture()&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">)<br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;&nbsp;<br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;CDC&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pDC</span><span style="color: #000000">=</span><span style="color: #000000">GetDC();&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;pDC</span><span style="color: #000000">-&gt;</span><span style="color: #000000">MoveTo(m_ptPrev);&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;pDC</span><span style="color: #000000">-&gt;</span><span style="color: #000000">LineTo(point);<br />
</span><span style="color: #008080">20</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;ReleaseDC(pDC);<br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;ReleaseCapture();<br />
</span><span style="color: #008080">22</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;CDrawView::OnMouseMove(UINT&nbsp;nFlags,&nbsp;CPoint&nbsp;point)&nbsp;<br />
</span><span style="color: #008080">25</span><span style="color: #000000"><img id="Codehighlighter1_475_754_Open_Image" onclick="this.style.display='none'; Codehighlighter1_475_754_Open_Text.style.display='none'; Codehighlighter1_475_754_Closed_Image.style.display='inline'; Codehighlighter1_475_754_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_475_754_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_475_754_Closed_Text.style.display='none'; Codehighlighter1_475_754_Open_Image.style.display='inline'; Codehighlighter1_475_754_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_475_754_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.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_475_754_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">26</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(GetCapture()&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">)<br />
</span><span style="color: #008080">27</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;&nbsp;<br />
</span><span style="color: #008080">28</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;oldMode;<br />
</span><span style="color: #008080">29</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;CDC&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pDC</span><span style="color: #000000">=</span><span style="color: #000000">GetDC();<br />
</span><span style="color: #008080">30</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;oldMode&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pDC</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetROP2();<br />
</span><span style="color: #008080">31</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;pDC</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetROP2(R2_NOT);&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">32</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;pDC</span><span style="color: #000000">-&gt;</span><span style="color: #000000">MoveTo(m_ptPrev);<br />
</span><span style="color: #008080">33</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;pDC</span><span style="color: #000000">-&gt;</span><span style="color: #000000">LineTo(m_ptOld);<br />
</span><span style="color: #008080">34</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">35</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;pDC</span><span style="color: #000000">-&gt;</span><span style="color: #000000">MoveTo(m_ptPrev);<br />
</span><span style="color: #008080">36</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;pDC</span><span style="color: #000000">-&gt;</span><span style="color: #000000">LineTo(point);<br />
</span><span style="color: #008080">37</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;pDC</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetROP2(oldMode);&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">38</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;m_ptOld&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;point;<br />
</span><span style="color: #008080">39</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;ReleaseDC(pDC);<br />
</span><span style="color: #008080">40</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这样，绘制直线的效果就和windows自带的绘图程序效果差不多了。<br />
</span>&nbsp;</p>
</span>
<img src ="http://www.blogjava.net/wenhl5656/aggbug/232270.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">爱吃鱼头</a> 2008-10-03 23:38 <a href="http://www.blogjava.net/wenhl5656/archive/2008/10/03/232270.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>/subsystem:windows 与 /subsystem:console(转载)</title><link>http://www.blogjava.net/wenhl5656/archive/2008/10/02/232136.html</link><dc:creator>爱吃鱼头</dc:creator><author>爱吃鱼头</author><pubDate>Thu, 02 Oct 2008 15:15:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2008/10/02/232136.html</guid><wfw:comment>http://www.blogjava.net/wenhl5656/comments/232136.html</wfw:comment><comments>http://www.blogjava.net/wenhl5656/archive/2008/10/02/232136.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wenhl5656/comments/commentRss/232136.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wenhl5656/services/trackbacks/232136.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;原文地址<span style="font-size: 12pt">：<a href="http://blog.csdn.net/lostangels/archive/2008/01/06/2027642.aspx">/subsystem:windows 与 /subsystem:console</a></span>&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 操作系统装载应用程序后，做完初始化工作就转到程序的入口点执行。程序的默认入口点实际上是由连接程序设置的，不同的连接器选择的入口函数也不尽相同。在VC++下，连接器对控制台程序设置的入口函数是 mainCRTStartup，mainCRTStartup 再调用你自己编写的 main 函数；对图形用户界面（GUI）程序设置的入口函数是 WinMainCRTStartup，WinMainCRTStartup 调用你自己写的 WinMain 函数。而具体设置哪个入口点是由连接器的&#8220;/subsystem:&#8221;选项参数确定的，它告诉操作系统如何运行编译生成的.EXE文件。可以指定四种方式：&#8220;CONSOLE|WINDOWS|NATIVE|POSIX&#8221;如果这个选项参数的值为&#8220;WINDOWS&#8221;，则表示该应用程序运行时不需要控制台，有关连接器参数选项的详细说明请参考 MSDN 库。&nbsp;
<p>以下四种组合，可以实现console和windows模式的混合，可以达到不弹出DOS窗口的效果，也可以达到在Windows程序中向控制台输出printf信息了。<br />
#pragma&nbsp;comment(&nbsp;linker,&nbsp;"/subsystem:windows /entry:WinMainCRTStartup"&nbsp;)<br />
#pragma&nbsp;comment(&nbsp;linker,&nbsp;"/subsystem:windows&nbsp;/entry:mainCRTStartup"&nbsp;)</p>
<p>#pragma&nbsp;comment(&nbsp;linker,&nbsp;"/subsystem:console&nbsp;/entry:mainCRTStartup"&nbsp;)<br />
#pragma&nbsp;comment(&nbsp;linker,&nbsp;"/subsystem:console /entry:WinMainCRTStartup"&nbsp;)</p>
<p><br />
int&nbsp;APIENTRY&nbsp;WinMain(HINSTANCE&nbsp;hInstance,<br />
HINSTANCE&nbsp;hPrevInstance,<br />
LPSTR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpCmdLine,<br />
int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nCmdShow)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp; // ... ...<br />
}<br />
<br />
int&nbsp;main(void)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp; // ... ...<br />
}<br />
<br />
<br />
</p>
<img src ="http://www.blogjava.net/wenhl5656/aggbug/232136.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">爱吃鱼头</a> 2008-10-02 23:15 <a href="http://www.blogjava.net/wenhl5656/archive/2008/10/02/232136.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>#pragma comment的一些体会</title><link>http://www.blogjava.net/wenhl5656/archive/2008/10/02/232106.html</link><dc:creator>爱吃鱼头</dc:creator><author>爱吃鱼头</author><pubDate>Thu, 02 Oct 2008 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2008/10/02/232106.html</guid><wfw:comment>http://www.blogjava.net/wenhl5656/comments/232106.html</wfw:comment><comments>http://www.blogjava.net/wenhl5656/archive/2008/10/02/232106.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wenhl5656/comments/commentRss/232106.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wenhl5656/services/trackbacks/232106.html</trackback:ping><description><![CDATA[<p style="font-size: 12pt">(转载)<br />
<strong>#pragma comment(</strong> <span class="parameter">comment-type</span> [<strong>,"</strong><span class="parameter">commentstring</span><strong>"</strong>] <strong>)<br />
</strong>该宏放置一个注释到对象文件或者可执行文件。<br />
<br />
<em>comment-type</em>是一个预定义的标识符，指定注释的类型，应该是<strong>compiler，</strong><strong>exestr，lib，linker</strong>之一。<br />
<span class="parameter">commentstring是一个提供为</span><em>comment-type</em>提供附加信息的字符串，<br />
Remarks：<br />
1、compiler：放置编译器的版本或者名字到一个对象文件，该选项是被linker忽略的。<br />
2、exestr：在以后的版本将被取消。<br />
3、lib：放置一个库搜索记录到对象文件中，这个类型应该是和<span class="parameter">commentstring（指定你要Liner搜索的lib的名称和路径）<br />
这个库的名字放在Object文件的默认库搜索记录的后面，linker搜索这个这个库就像你在命令行输入这个命令一样。你可以<br />
在一个源文件中设置多个库记录，它们在object文件中的顺序和在源文件中的顺序一样。如果默认库和附加库的次序是需要<br />
区别的，使用Z编译开关是防止默认库放到object模块。<br />
4、linker：指定一个连接选项，这样就不用在命令行输入或者在开发环境中设置了。<br />
只有下面的linker选项能被传给Linker.<br />
</span></p>
<ul>
    <li>
    <p><MSHELP:LINK tabindex="0" keywords="6AF7FF49-C170-4A13-97E2-2B9AE2DE20C9">/DEFAULTLIB</MSHELP:LINK></p>
    <li>
    <p><MSHELP:LINK tabindex="0" keywords="0920FB44-A472-4091-A8E6-73051F494CA0">/EXPORT</MSHELP:LINK></p>
    <li>
    <p><MSHELP:LINK tabindex="0" keywords="4A039677-360A-480F-BD0B-448E239B449C">/INCLUDE</MSHELP:LINK></p>
    <li>
    <p><MSHELP:LINK tabindex="0" keywords="e4b68313-33a2-4c3e-908e-ac2b9f7d6a73">/MANIFESTDEPENDENCY</MSHELP:LINK> </p>
    <li>
    <p><MSHELP:LINK tabindex="0" keywords="10FB20C2-0B3F-4C8D-98A8-F69AEDF03D52">/MERGE</MSHELP:LINK></p>
    <li>
    <p><MSHELP:LINK tabindex="0" keywords="92B69D81-E421-462E-B46F-7D0DFF9B9D16">/SECTION</MSHELP:LINK></p>
    </li>
</ul>
<pre>(1)/DEFAULTLIB:<em>library<br />
<br />
</em>/DEFAULTLIB 选项将一个 <em>library</em> 添加到 LINK 在解析引用时搜索的库列表。用 /DEFAULTLIB
指定的库在命令行上指定的库之后和 .obj 文件中指定的默认库之前被搜索。<br />
</pre>
<p style="text-align: left">忽略所有默认库 (/NODEFAULTLIB) 选项重写 /DEFAULTLIB:library。如果在两者中指定了相同的 library 名称，<span style="color: #080000">忽略库</span> (/NODEFAULTLIB:<em>library</em>) 选项将重写 /DEFAULTLIB:<em>library</em>。</p>
<p style="text-align: left">(2)/EXPORT:<em>entryname</em>[,@<em>ordinal</em>[,NONAME]][,DATA]<br />
</p>
<p>使用该选项，可以从程序导出函数，以便其他程序可以调用该函数。也可以导出数据。通常在 DLL 中定义导出。<em>entryname</em> 是调用程序要使用的函数或数据项的名称。<span class="parameter">ordinal</span> 在导出表中指定范围在 1 至 65,535 的索引；如果没有指定 <span class="parameter">ordinal</span>，则 LINK 将分配一个。<strong>NONAME</strong> 关键字只将函数导出为序号，没有 <em>entryname</em>。</p>
<p><strong>DATA </strong>关键字指定导出项为数据项。客户程序中的数据项必须用 <strong>extern __declspec(dllimport)</strong> 来声明。<br />
有三种导出定义的方法，按照建议的使用顺序依次为： </p>
<ol>
    <li>
    <p>源代码中的 <MSHELP:LINK tabindex="0" keywords="FF95B645-EF55-4E72-B848-DF44657B3208">__declspec(dllexport)</MSHELP:LINK></p>
    <li>
    <p>.def 文件中的 EXPORTS 语句</p>
    <li>
    <p>LINK 命令中的 /EXPORT 规范</p>
    </li>
</ol>
<p>所有这三种方法可以用在同一个程序中。LINK 在生成包含导出的程序时还创建导入库，除非生成中使用了 .exp 文件。<br />
LINK 使用标识符的修饰形式。编译器在创建 .obj 文件时修饰标识符。如果 <em>entryname</em> 以其未修饰的形式指定给链接器（与其在源代码中一样），则 LINK 将试图匹配该名称。如果无法找到唯一的匹配名称，则 LINK 发出错误信息。当需要将标识符指定给链接器时，请使用 Dumpbin 工具获取该标识符的修饰名形式。</p>
<pre>(3)/INCLUDE:<em>symbol<br />
</em></pre>
<p>/INCLUDE 选项通知链接器将指定的符号添加到符号表。</p>
<p>若要指定多个符号，请在符号名称之间键入逗号 (,)、分号 (;) 或空格。在命令行上，对每个符号指定一次 /INCLUDE:<span class="parameter">symbol</span>。<br />
链接器通过将包含符号定义的对象添加到程序来解析 <span class="parameter">symbol</span>。该功能对于添包含不会链接到程序的库对象非常有用。用该选项指定符号将通过 /OPT:REF 重写该符号的移除。</p>
<pre><br />
<em><br />
</em>我们经常用到的是#pragma &nbsp; comment（lib，"*.lib"）这类的。<br />
#pragma &nbsp; comment(lib,"Ws2_32.lib")表示链接Ws2_32.lib这个库。 &nbsp; <br />
和在工程设置里写上链入Ws2_32.lib的效果一样，不过这种方法写的 &nbsp; <br />
程序别人在使用你的代码的时候就不用再设置工程settings了</pre>
<pre>#pragma comment(linker,"/SECTION:flag_data,RWS")</pre>
<pre>可以共享数据在动态链接库中的数据，或者可以用来是应用程序只启动一次，注意，flag_data与RWS之间不能有空格！！</pre>
<img src ="http://www.blogjava.net/wenhl5656/aggbug/232106.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">爱吃鱼头</a> 2008-10-02 16:36 <a href="http://www.blogjava.net/wenhl5656/archive/2008/10/02/232106.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ucgui progress</title><link>http://www.blogjava.net/wenhl5656/archive/2008/09/27/231392.html</link><dc:creator>爱吃鱼头</dc:creator><author>爱吃鱼头</author><pubDate>Fri, 26 Sep 2008 16:12:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2008/09/27/231392.html</guid><wfw:comment>http://www.blogjava.net/wenhl5656/comments/231392.html</wfw:comment><comments>http://www.blogjava.net/wenhl5656/archive/2008/09/27/231392.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wenhl5656/comments/commentRss/231392.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wenhl5656/services/trackbacks/231392.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在VMware中第一次使用linux发了这篇随笔，因为当时没有装中文输入法，所以展现了一下拙劣的E文....<br>是关于UCGUI的窗口界面编程，借用了windows中的事件机制&nbsp;&nbsp;<a href='http://www.blogjava.net/wenhl5656/archive/2008/09/27/231392.html'>阅读全文</a><img src ="http://www.blogjava.net/wenhl5656/aggbug/231392.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">爱吃鱼头</a> 2008-09-27 00:12 <a href="http://www.blogjava.net/wenhl5656/archive/2008/09/27/231392.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言运算优先级</title><link>http://www.blogjava.net/wenhl5656/archive/2008/09/23/230693.html</link><dc:creator>爱吃鱼头</dc:creator><author>爱吃鱼头</author><pubDate>Tue, 23 Sep 2008 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2008/09/23/230693.html</guid><wfw:comment>http://www.blogjava.net/wenhl5656/comments/230693.html</wfw:comment><comments>http://www.blogjava.net/wenhl5656/archive/2008/09/23/230693.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wenhl5656/comments/commentRss/230693.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wenhl5656/services/trackbacks/230693.html</trackback:ping><description><![CDATA[<img height="441" alt="" src="http://www.blogjava.net/images/blogjava_net/wenhl5656/1.JPG" width="339" border="0" />
 <img src ="http://www.blogjava.net/wenhl5656/aggbug/230693.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">爱吃鱼头</a> 2008-09-23 16:04 <a href="http://www.blogjava.net/wenhl5656/archive/2008/09/23/230693.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言宏定义技巧</title><link>http://www.blogjava.net/wenhl5656/archive/2008/09/23/230554.html</link><dc:creator>爱吃鱼头</dc:creator><author>爱吃鱼头</author><pubDate>Tue, 23 Sep 2008 01:11:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2008/09/23/230554.html</guid><wfw:comment>http://www.blogjava.net/wenhl5656/comments/230554.html</wfw:comment><comments>http://www.blogjava.net/wenhl5656/archive/2008/09/23/230554.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wenhl5656/comments/commentRss/230554.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wenhl5656/services/trackbacks/230554.html</trackback:ping><description><![CDATA[C语言宏定义技巧（常用宏定义）&nbsp; <br />
&nbsp; <br />
写好C语言，漂亮的宏定义很重要，使用宏定义可以防止出错，提高可移植性，可读性，方便性&nbsp;等等。下面列举一些成熟软件中常用得宏定义。。。。。。 <br />
<br />
&nbsp; <br />
<br />
1，防止一个头文件被重复包含 <br />
<br />
#ifndef&nbsp;COMDEF_H <br />
<br />
#define&nbsp;COMDEF_H <br />
<br />
&nbsp;&nbsp;//头文件内容 <br />
<br />
#endif <br />
<br />
2，重新定义一些类型，防止由于各种平台和编译器的不同，而产生的类型字节数差异，方便移植。 <br />
<br />
typedef&nbsp;&nbsp;unsigned&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Boolean&nbsp;value&nbsp;type.&nbsp;*/ <br />
<br />
&nbsp; <br />
<br />
typedef&nbsp;&nbsp;unsigned&nbsp;long&nbsp;int&nbsp;&nbsp;uint32;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Unsigned&nbsp;32&nbsp;bit&nbsp;value&nbsp;*/ <br />
<br />
typedef&nbsp;&nbsp;unsigned&nbsp;short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint16;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Unsigned&nbsp;16&nbsp;bit&nbsp;value&nbsp;*/ <br />
<br />
typedef&nbsp;&nbsp;unsigned&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint8;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Unsigned&nbsp;8&nbsp;&nbsp;bit&nbsp;value&nbsp;*/ <br />
<br />
&nbsp; <br />
<br />
typedef&nbsp;&nbsp;signed&nbsp;long&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;int32;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Signed&nbsp;32&nbsp;bit&nbsp;value&nbsp;*/ <br />
<br />
typedef&nbsp;&nbsp;signed&nbsp;short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int16;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Signed&nbsp;16&nbsp;bit&nbsp;value&nbsp;*/ <br />
<br />
typedef&nbsp;&nbsp;signed&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int8;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Signed&nbsp;8&nbsp;&nbsp;bit&nbsp;value&nbsp;*/ <br />
<br />
&nbsp; <br />
<br />
&nbsp; <br />
<br />
//下面的不建议使用 <br />
<br />
typedef&nbsp;&nbsp;unsigned&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Unsigned&nbsp;8&nbsp;&nbsp;bit&nbsp;value&nbsp;type.&nbsp;*/ <br />
<br />
typedef&nbsp;&nbsp;unsigned&nbsp;short&nbsp;&nbsp;&nbsp;&nbsp;word;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Unsinged&nbsp;16&nbsp;bit&nbsp;value&nbsp;type.&nbsp;*/ <br />
<br />
typedef&nbsp;&nbsp;unsigned&nbsp;long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Unsigned&nbsp;32&nbsp;bit&nbsp;value&nbsp;type.&nbsp;*/ <br />
<br />
&nbsp; <br />
<br />
typedef&nbsp;&nbsp;unsigned&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Unsigned&nbsp;8&nbsp;&nbsp;bit&nbsp;value&nbsp;type.&nbsp;*/ <br />
<br />
typedef&nbsp;&nbsp;unsigned&nbsp;short&nbsp;&nbsp;&nbsp;&nbsp;uint2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Unsigned&nbsp;16&nbsp;bit&nbsp;value&nbsp;type.&nbsp;*/ <br />
<br />
typedef&nbsp;&nbsp;unsigned&nbsp;long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Unsigned&nbsp;32&nbsp;bit&nbsp;value&nbsp;type.&nbsp;*/ <br />
<br />
&nbsp; <br />
<br />
typedef&nbsp;&nbsp;signed&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Signed&nbsp;8&nbsp;&nbsp;bit&nbsp;value&nbsp;type.&nbsp;*/ <br />
<br />
typedef&nbsp;&nbsp;signed&nbsp;short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Signed&nbsp;16&nbsp;bit&nbsp;value&nbsp;type.&nbsp;*/ <br />
<br />
typedef&nbsp;&nbsp;long&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Signed&nbsp;32&nbsp;bit&nbsp;value&nbsp;type.&nbsp;*/ <br />
<br />
&nbsp; <br />
<br />
typedef&nbsp;&nbsp;signed&nbsp;long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sint31;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Signed&nbsp;32&nbsp;bit&nbsp;value&nbsp;*/ <br />
<br />
typedef&nbsp;&nbsp;signed&nbsp;short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sint15;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Signed&nbsp;16&nbsp;bit&nbsp;value&nbsp;*/ <br />
<br />
typedef&nbsp;&nbsp;signed&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sint7;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Signed&nbsp;8&nbsp;&nbsp;bit&nbsp;value&nbsp;*/ <br />
<br />
&nbsp; <br />
<br />
3，得到指定地址上的一个字节或字 <br />
<br />
#define&nbsp;&nbsp;MEM_B(&nbsp;x&nbsp;)&nbsp;&nbsp;(&nbsp;*(&nbsp;(byte&nbsp;*)&nbsp;(x)&nbsp;)&nbsp;) <br />
<br />
#define&nbsp;&nbsp;MEM_W(&nbsp;x&nbsp;)&nbsp;&nbsp;(&nbsp;*(&nbsp;(word&nbsp;*)&nbsp;(x)&nbsp;)&nbsp;) <br />
<br />
4，求最大值和最小值 <br />
<br />
&nbsp;&nbsp;&nbsp;#define&nbsp;&nbsp;MAX(&nbsp;x,&nbsp;y&nbsp;)&nbsp;(&nbsp;((x)&nbsp;&gt;&nbsp;(y))&nbsp;?&nbsp;(x)&nbsp;:&nbsp;(y)&nbsp;) <br />
<br />
&nbsp;&nbsp;&nbsp;#define&nbsp;&nbsp;MIN(&nbsp;x,&nbsp;y&nbsp;)&nbsp;(&nbsp;((x)&nbsp;&lt;&nbsp;(y))&nbsp;?&nbsp;(x)&nbsp;:&nbsp;(y)&nbsp;) <br />
<br />
5，得到一个field在结构体(struct)中的偏移量 <br />
<br />
#define&nbsp;FPOS(&nbsp;type,&nbsp;field&nbsp;)&nbsp;\ <br />
<br />
/*lint&nbsp;-e545&nbsp;*/&nbsp;(&nbsp;(dword)&nbsp;&amp;((&nbsp;type&nbsp;*)&nbsp;0)-&gt;&nbsp;field&nbsp;)&nbsp;/*lint&nbsp;+e545&nbsp;*/ <br />
<br />
6,得到一个结构体中field所占用的字节数 <br />
<br />
#define&nbsp;FSIZ(&nbsp;type,&nbsp;field&nbsp;)&nbsp;sizeof(&nbsp;((type&nbsp;*)&nbsp;0)-&gt;field&nbsp;) <br />
<br />
7，按照LSB格式把两个字节转化为一个Word <br />
<br />
#define&nbsp;&nbsp;FLIPW(&nbsp;ray&nbsp;)&nbsp;(&nbsp;(((word)&nbsp;(ray)[0])&nbsp;*&nbsp;256)&nbsp;+&nbsp;(ray)[1]&nbsp;) <br />
<br />
8，按照LSB格式把一个Word转化为两个字节 <br />
<br />
#define&nbsp;&nbsp;FLOPW(&nbsp;ray,&nbsp;val&nbsp;)&nbsp;\ <br />
<br />
&nbsp;&nbsp;(ray)[0]&nbsp;=&nbsp;((val)&nbsp;/&nbsp;256);&nbsp;\ <br />
<br />
&nbsp;&nbsp;(ray)[1]&nbsp;=&nbsp;((val)&nbsp;&amp;&nbsp;0xFF) <br />
<br />
9，得到一个变量的地址（word宽度） <br />
<br />
#define&nbsp;&nbsp;B_PTR(&nbsp;var&nbsp;)&nbsp;&nbsp;(&nbsp;(byte&nbsp;*)&nbsp;(void&nbsp;*)&nbsp;&amp;(var)&nbsp;) <br />
<br />
#define&nbsp;&nbsp;W_PTR(&nbsp;var&nbsp;)&nbsp;&nbsp;(&nbsp;(word&nbsp;*)&nbsp;(void&nbsp;*)&nbsp;&amp;(var)&nbsp;) <br />
<br />
10，得到一个字的高位和低位字节 <br />
<br />
#define&nbsp;&nbsp;WORD_LO(xxx)&nbsp;&nbsp;((byte)&nbsp;((word)(xxx)&nbsp;&amp;&nbsp;255)) <br />
<br />
#define&nbsp;&nbsp;WORD_HI(xxx)&nbsp;&nbsp;((byte)&nbsp;((word)(xxx)&nbsp;&gt;&gt;&nbsp;8)) <br />
<br />
11，返回一个比X大的最接近的8的倍数 <br />
<br />
#define&nbsp;RND8(&nbsp;x&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((((x)&nbsp;+&nbsp;7)&nbsp;/&nbsp;8&nbsp;)&nbsp;*&nbsp;8&nbsp;) <br />
<br />
12，将一个字母转换为大写 <br />
<br />
#define&nbsp;&nbsp;UPCASE(&nbsp;c&nbsp;)&nbsp;(&nbsp;((c)&nbsp;&gt;=&nbsp;'a'&nbsp;&amp;&amp;&nbsp;(c)&nbsp;&lt;=&nbsp;'z')&nbsp;?&nbsp;((c)&nbsp;-&nbsp;0x20)&nbsp;:&nbsp;(c)&nbsp;) <br />
<br />
13，判断字符是不是10进值的数字 <br />
<br />
#define&nbsp;&nbsp;DECCHK(&nbsp;c&nbsp;)&nbsp;((c)&nbsp;&gt;=&nbsp;'0'&nbsp;&amp;&amp;&nbsp;(c)&nbsp;&lt;=&nbsp;'9') <br />
<br />
14，判断字符是不是16进值的数字 <br />
<br />
#define&nbsp;&nbsp;HEXCHK(&nbsp;c&nbsp;)&nbsp;(&nbsp;((c)&nbsp;&gt;=&nbsp;'0'&nbsp;&amp;&amp;&nbsp;(c)&nbsp;&lt;=&nbsp;'9')&nbsp;||\ <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((c)&nbsp;&gt;=&nbsp;'A'&nbsp;&amp;&amp;&nbsp;(c)&nbsp;&lt;=&nbsp;'F')&nbsp;||\ <br />
<br />
((c)&nbsp;&gt;=&nbsp;'a'&nbsp;&amp;&amp;&nbsp;(c)&nbsp;&lt;=&nbsp;'f')&nbsp;) <br />
<br />
15，防止溢出的一个方法 <br />
<br />
#define&nbsp;&nbsp;INC_SAT(&nbsp;val&nbsp;)&nbsp;&nbsp;(val&nbsp;=&nbsp;((val)+1&nbsp;&gt;&nbsp;(val))&nbsp;?&nbsp;(val)+1&nbsp;:&nbsp;(val)) <br />
<br />
16，返回数组元素的个数 <br />
<br />
#define&nbsp;&nbsp;ARR_SIZE(&nbsp;a&nbsp;)&nbsp;&nbsp;(&nbsp;sizeof(&nbsp;(a)&nbsp;)&nbsp;/&nbsp;sizeof(&nbsp;(a[0])&nbsp;)&nbsp;) <br />
<br />
17，返回一个无符号数n尾的值MOD_BY_POWER_OF_TWO(X,n)=X%(2^n) <br />
<br />
#define&nbsp;MOD_BY_POWER_OF_TWO(&nbsp;val,&nbsp;mod_by&nbsp;)&nbsp;\ <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;(dword)(val)&nbsp;&amp;&nbsp;(dword)((mod_by)-1)&nbsp;) <br />
<br />
18，对于IO空间映射在存储空间的结构，输入输出处理 <br />
<br />
&nbsp;&nbsp;#define&nbsp;inp(port)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*((volatile&nbsp;byte&nbsp;*)&nbsp;(port))) <br />
<br />
&nbsp;&nbsp;#define&nbsp;inpw(port)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*((volatile&nbsp;word&nbsp;*)&nbsp;(port))) <br />
<br />
&nbsp;&nbsp;#define&nbsp;inpdw(port)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*((volatile&nbsp;dword&nbsp;*)(port))) <br />
<br />
&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;#define&nbsp;outp(port,&nbsp;val)&nbsp;&nbsp;&nbsp;(*((volatile&nbsp;byte&nbsp;*)&nbsp;(port))&nbsp;=&nbsp;((byte)&nbsp;(val))) <br />
<br />
&nbsp;&nbsp;#define&nbsp;outpw(port,&nbsp;val)&nbsp;&nbsp;(*((volatile&nbsp;word&nbsp;*)&nbsp;(port))&nbsp;=&nbsp;((word)&nbsp;(val))) <br />
<br />
&nbsp;&nbsp;#define&nbsp;outpdw(port,&nbsp;val)&nbsp;(*((volatile&nbsp;dword&nbsp;*)&nbsp;(port))&nbsp;=&nbsp;((dword)&nbsp;(val))) <br />
<br />
[2005-9-9添加]&nbsp; <br />
<br />
19,使用一些宏跟踪调试 <br />
<br />
A&nbsp;N&nbsp;S&nbsp;I标准说明了五个预定义的宏名。它们是： <br />
<br />
_&nbsp;L&nbsp;I&nbsp;N&nbsp;E&nbsp;_ <br />
<br />
_&nbsp;F&nbsp;I&nbsp;L&nbsp;E&nbsp;_ <br />
<br />
_&nbsp;D&nbsp;A&nbsp;T&nbsp;E&nbsp;_ <br />
<br />
_&nbsp;T&nbsp;I&nbsp;M&nbsp;E&nbsp;_ <br />
<br />
_&nbsp;S&nbsp;T&nbsp;D&nbsp;C&nbsp;_ <br />
<br />
如果编译不是标准的，则可能仅支持以上宏名中的几个，或根本不支持。记住编译程序 <br />
<br />
也许还提供其它预定义的宏名。 <br />
<br />
_&nbsp;L&nbsp;I&nbsp;N&nbsp;E&nbsp;_及_&nbsp;F&nbsp;I&nbsp;L&nbsp;E&nbsp;_宏指令在有关#&nbsp;l&nbsp;i&nbsp;n&nbsp;e的部分中已讨论，这里讨论其余的宏名。 <br />
<br />
_&nbsp;D&nbsp;AT&nbsp;E&nbsp;_宏指令含有形式为月/日/年的串，表示源文件被翻译到代码时的日期。 <br />
<br />
源代码翻译到目标代码的时间作为串包含在_&nbsp;T&nbsp;I&nbsp;M&nbsp;E&nbsp;_中。串形式为时：分：秒。 <br />
<br />
如果实现是标准的，则宏_&nbsp;S&nbsp;T&nbsp;D&nbsp;C&nbsp;_含有十进制常量1。如果它含有任何其它数，则实现是 <br />
<br />
非标准的。 <br />
<br />
可以定义宏，例如: <br />
<br />
当定义了_DEBUG，输出数据信息和所在文件所在行 <br />
<br />
#ifdef&nbsp;_DEBUG <br />
<br />
#define&nbsp;DEBUGMSG(msg,date)&nbsp;printf(msg);printf(&#8220;%d%d%d&#8221;,date,_LINE_,_FILE_) <br />
<br />
#else <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#define&nbsp;DEBUGMSG(msg,date)&nbsp; <br />
<br />
#endif <br />
<br />
&nbsp; <br />
<br />
20，宏定义防止使用是错误 <br />
<br />
用小括号包含。 <br />
<br />
例如：#define&nbsp;ADD(a,b)&nbsp;（a+b） <br />
<br />
用do{}while(0)语句包含多语句防止错误 <br />
<br />
例如：#difne&nbsp;DO(a,b)&nbsp;a+b;\ <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a++; <br />
<br />
应用时：if(&#8230;.) <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DO(a,b);&nbsp;//产生错误 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
解决方法:&nbsp;#difne&nbsp;DO(a,b)&nbsp;do{a+b;\ <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a++;}while(0)&nbsp;<br />
<br />
&nbsp; <br />
宏中"#"和"##"的用法 <br />
一、一般用法 <br />
我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起. <br />
用法: <br />
＃i nclude&lt;cstdio&gt; <br />
＃i nclude&lt;climits&gt; <br />
using&nbsp;namespace&nbsp;std; <br />
<br />
#define&nbsp;STR(s)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#s <br />
#define&nbsp;CONS(a,b)&nbsp;&nbsp;int(a##e##b) <br />
<br />
int&nbsp;main() <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;printf(STR(vck));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;输出字符串"vck" <br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;CONS(2,3));&nbsp;&nbsp;//&nbsp;2e3&nbsp;输出:2000 <br />
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0; <br />
} <br />
<br />
二、当宏参数是另一个宏的时候 <br />
需要注意的是凡宏定义里有用'#'或'##'的地方宏参数是不会再展开. <br />
<br />
1,&nbsp;非'#'和'##'的情况 <br />
#define&nbsp;TOW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2) <br />
#define&nbsp;MUL(a,b)&nbsp;(a*b) <br />
<br />
printf("%d*%d=%d\n",&nbsp;TOW,&nbsp;TOW,&nbsp;MUL(TOW,TOW)); <br />
这行的宏会被展开为： <br />
printf("%d*%d=%d\n",&nbsp;(2),&nbsp;(2),&nbsp;((2)*(2))); <br />
MUL里的参数TOW会被展开为(2). <br />
<br />
2,&nbsp;当有'#'或'##'的时候 <br />
#define&nbsp;A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2) <br />
#define&nbsp;STR(s)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#s <br />
#define&nbsp;CONS(a,b)&nbsp;&nbsp;int(a##e##b) <br />
<br />
printf("int&nbsp;max:&nbsp;%s\n",&nbsp;&nbsp;STR(INT_MAX));&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;INT_MAX&nbsp;＃i nclude&lt;climits&gt; <br />
这行会被展开为： <br />
printf("int&nbsp;max:&nbsp;%s\n",&nbsp;"INT_MAX"); <br />
<br />
printf("%s\n",&nbsp;CONS(A,&nbsp;A));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;compile&nbsp;error&nbsp; <br />
这一行则是： <br />
printf("%s\n",&nbsp;int(AeA)); <br />
<br />
INT_MAX和A都不会再被展开,&nbsp;然而解决这个问题的方法很简单.&nbsp;加多一层中间转换宏. <br />
加这层宏的用意是把所有宏的参数在这层里全部展开,&nbsp;那么在转换宏里的那一个宏(_STR)就能得到正确的宏参数. <br />
<br />
#define&nbsp;A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2) <br />
#define&nbsp;_STR(s)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#s <br />
#define&nbsp;STR(s)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_STR(s)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;转换宏 <br />
#define&nbsp;_CONS(a,b)&nbsp;&nbsp;int(a##e##b) <br />
#define&nbsp;CONS(a,b)&nbsp;&nbsp;&nbsp;_CONS(a,b)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;转换宏 <br />
<br />
printf("int&nbsp;max:&nbsp;%s\n",&nbsp;STR(INT_MAX));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;INT_MAX,int型的最大值，为一个变量&nbsp;＃i nclude&lt;climits&gt; <br />
输出为:&nbsp;int&nbsp;max:&nbsp;0x7fffffff <br />
STR(INT_MAX)&nbsp;--&gt;&nbsp;&nbsp;_STR(0x7fffffff)&nbsp;然后再转换成字符串； <br />
<br />
printf("%d\n",&nbsp;CONS(A,&nbsp;A)); <br />
输出为：200 <br />
CONS(A,&nbsp;A)&nbsp;&nbsp;--&gt;&nbsp;&nbsp;_CONS((2),&nbsp;(2))&nbsp;&nbsp;--&gt;&nbsp;int((2)e(2)) <br />
<br />
三、'#'和'##'的一些应用特例 <br />
1、合并匿名变量名 <br />
#define&nbsp;&nbsp;___ANONYMOUS1(type,&nbsp;var,&nbsp;line)&nbsp;&nbsp;type&nbsp;&nbsp;var##line <br />
#define&nbsp;&nbsp;__ANONYMOUS0(type,&nbsp;line)&nbsp;&nbsp;___ANONYMOUS1(type,&nbsp;_anonymous,&nbsp;line) <br />
#define&nbsp;&nbsp;ANONYMOUS(type)&nbsp;&nbsp;__ANONYMOUS0(type,&nbsp;__LINE__) <br />
例：ANONYMOUS(static&nbsp;int);&nbsp;&nbsp;即:&nbsp;static&nbsp;int&nbsp;_anonymous70;&nbsp;&nbsp;70表示该行行号； <br />
第一层：ANONYMOUS(static&nbsp;int);&nbsp;&nbsp;--&gt;&nbsp;&nbsp;__ANONYMOUS0(static&nbsp;int,&nbsp;__LINE__); <br />
第二层：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&gt;&nbsp;&nbsp;___ANONYMOUS1(static&nbsp;int,&nbsp;_anonymous,&nbsp;70); <br />
第三层：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&gt;&nbsp;&nbsp;static&nbsp;int&nbsp;&nbsp;_anonymous70; <br />
即每次只能解开当前层的宏，所以__LINE__在第二层才能被解开； <br />
<br />
2、填充结构 <br />
#define&nbsp;&nbsp;FILL(a)&nbsp;&nbsp;&nbsp;{a,&nbsp;#a} <br />
<br />
enum&nbsp;IDD{OPEN,&nbsp;CLOSE}; <br />
typedef&nbsp;struct&nbsp;MSG{ <br />
&nbsp;&nbsp;IDD&nbsp;id; <br />
&nbsp;&nbsp;const&nbsp;char&nbsp;*&nbsp;msg; <br />
}MSG; <br />
<br />
MSG&nbsp;_msg[]&nbsp;=&nbsp;{FILL(OPEN),&nbsp;FILL(CLOSE)}; <br />
相当于： <br />
MSG&nbsp;_msg[]&nbsp;=&nbsp;{{OPEN,&nbsp;"OPEN"}, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{CLOSE,&nbsp;"CLOSE"}}; <br />
<br />
3、记录文件名 <br />
#define&nbsp;&nbsp;_GET_FILE_NAME(f)&nbsp;&nbsp;&nbsp;#f <br />
#define&nbsp;&nbsp;GET_FILE_NAME(f)&nbsp;&nbsp;&nbsp;&nbsp;_GET_FILE_NAME(f) <br />
static&nbsp;char&nbsp;&nbsp;FILE_NAME[]&nbsp;=&nbsp;GET_FILE_NAME(__FILE__); <br />
<br />
4、得到一个数值类型所对应的字符串缓冲大小 <br />
#define&nbsp;&nbsp;_TYPE_BUF_SIZE(type)&nbsp;&nbsp;sizeof&nbsp;#type <br />
#define&nbsp;&nbsp;TYPE_BUF_SIZE(type)&nbsp;&nbsp;&nbsp;_TYPE_BUF_SIZE(type) <br />
char&nbsp;&nbsp;buf[TYPE_BUF_SIZE(INT_MAX)]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&gt;&nbsp;&nbsp;char&nbsp;&nbsp;buf[_TYPE_BUF_SIZE(0x7fffffff)]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&gt;&nbsp;&nbsp;char&nbsp;&nbsp;buf[sizeof&nbsp;"0x7fffffff"]; <br />
这里相当于： <br />
 <img src ="http://www.blogjava.net/wenhl5656/aggbug/230554.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">爱吃鱼头</a> 2008-09-23 09:11 <a href="http://www.blogjava.net/wenhl5656/archive/2008/09/23/230554.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>facedetect心得</title><link>http://www.blogjava.net/wenhl5656/archive/2008/09/10/228216.html</link><dc:creator>爱吃鱼头</dc:creator><author>爱吃鱼头</author><pubDate>Wed, 10 Sep 2008 13:23:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2008/09/10/228216.html</guid><wfw:comment>http://www.blogjava.net/wenhl5656/comments/228216.html</wfw:comment><comments>http://www.blogjava.net/wenhl5656/archive/2008/09/10/228216.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wenhl5656/comments/commentRss/228216.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wenhl5656/services/trackbacks/228216.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这两天写了一些读取jpg和bmp文件的代码。调试的非常痛苦。不过也学到这两种图片格式的许多知识。而且发现自己在做完一个程序之后，总喜欢话时间写一点批处理文件来测试和运行程序。因此现在对bat文件也熟悉了不少，同时还解决了许多难题。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在写这些代码时，参考了网上很多例子。但程序要在嵌入式系统上运行，因此可用的库就受到很大限制，很多功能都需要自己编码实现，比如jpg的解码，文件的读入和写出。从中我学到了如何将jpg解码成24位的bmp图，如何将24位的bmp转换为灰度图，也学到了bmp图数据布局是从底左方向开始的。一开始没有发现这一点，导致保存的图片全是颠倒的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外，lineBytes或widthStep(openCV)这个参数很重要，是指每一行数据的字节数。刚开始没有处理好，导致保存的图片是歪的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 还有其他的，比如Gray&nbsp; = (BYTE)(Red*0.299+Green*0.587+(Blue&nbsp; + 0.5)*0.114); 这是真彩图转换为灰度图的一个公式，效果挺好的，在网上查了很久才找到(没学图像处理就是亏啊)。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 人脸检测的算法是基于AdaBoost的，不过检测大图片稍稍有些慢，还需要试试优化一下。而且代码修改过后，检测结果有点问题，很多像人脸的景物也会被误认为人脸了 :-(。<br />
 <img src ="http://www.blogjava.net/wenhl5656/aggbug/228216.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">爱吃鱼头</a> 2008-09-10 21:23 <a href="http://www.blogjava.net/wenhl5656/archive/2008/09/10/228216.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>