﻿<?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++博客-编程之道-随笔分类-C/C++</title><link>http://www.cppblog.com/ispfcn/category/1304.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 25 May 2008 00:05:20 GMT</lastBuildDate><pubDate>Sun, 25 May 2008 00:05:20 GMT</pubDate><ttl>60</ttl><item><title>Apache模块 开发实例(转)</title><link>http://www.cppblog.com/ispfcn/archive/2008/01/30/42234.html</link><dc:creator>编程之道</dc:creator><author>编程之道</author><pubDate>Wed, 30 Jan 2008 08:35:00 GMT</pubDate><guid>http://www.cppblog.com/ispfcn/archive/2008/01/30/42234.html</guid><wfw:comment>http://www.cppblog.com/ispfcn/comments/42234.html</wfw:comment><comments>http://www.cppblog.com/ispfcn/archive/2008/01/30/42234.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ispfcn/comments/commentRss/42234.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ispfcn/services/trackbacks/42234.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;1/**//**&nbsp;&nbsp;2*&nbsp;Copyright&nbsp;2003&nbsp;Tom,&nbsp;Inc.&nbsp;All&nbsp;rights&nbsp;reserved.&nbsp;&nbsp;3*&nbsp;&nbsp;4*&nbsp;Description:&nbsp;Apache模块&nbsp;取用户图片&nbsp;...&nbsp;&nbsp;<a href='http://www.cppblog.com/ispfcn/archive/2008/01/30/42234.html'>阅读全文</a><img src ="http://www.cppblog.com/ispfcn/aggbug/42234.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ispfcn/" target="_blank">编程之道</a> 2008-01-30 16:35 <a href="http://www.cppblog.com/ispfcn/archive/2008/01/30/42234.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于linux上的线程资源</title><link>http://www.cppblog.com/ispfcn/archive/2006/12/29/16991.html</link><dc:creator>编程之道</dc:creator><author>编程之道</author><pubDate>Fri, 29 Dec 2006 09:57:00 GMT</pubDate><guid>http://www.cppblog.com/ispfcn/archive/2006/12/29/16991.html</guid><wfw:comment>http://www.cppblog.com/ispfcn/comments/16991.html</wfw:comment><comments>http://www.cppblog.com/ispfcn/archive/2006/12/29/16991.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ispfcn/comments/commentRss/16991.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ispfcn/services/trackbacks/16991.html</trackback:ping><description><![CDATA[
		<p>前几天写个多线程的程序，主要是从文件读数据，然后分线程发送，本来想在线程里用pthread_detach()分离线程，但是我想要线程执行结果，所以不得不放弃pthread_detach()。在线程结束的时候用pthread_exit()，发完文件用ptrehad_join()取返回值。结果竟然发现：起到300多个线程的时候就出现can't allocate memory，这可郁闷死我了，找了半天资料，后来看到一篇文章，是说linux上的pthread_exit()不回收线程资源，只能用pthread_join()来回收，郁闷啊……最后只得在起到一定数量的线程后回收一遍资源。又学了一招了……</p>
<img src ="http://www.cppblog.com/ispfcn/aggbug/16991.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ispfcn/" target="_blank">编程之道</a> 2006-12-29 17:57 <a href="http://www.cppblog.com/ispfcn/archive/2006/12/29/16991.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC++开发BHO插件——定制你的浏览器</title><link>http://www.cppblog.com/ispfcn/archive/2006/12/11/16274.html</link><dc:creator>编程之道</dc:creator><author>编程之道</author><pubDate>Mon, 11 Dec 2006 07:49:00 GMT</pubDate><guid>http://www.cppblog.com/ispfcn/archive/2006/12/11/16274.html</guid><wfw:comment>http://www.cppblog.com/ispfcn/comments/16274.html</wfw:comment><comments>http://www.cppblog.com/ispfcn/archive/2006/12/11/16274.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ispfcn/comments/commentRss/16274.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ispfcn/services/trackbacks/16274.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在Windows操作系统上，我们最常见的浏览器有两种：文件浏览器（exploer.exe，应用于文件系统）和Internet浏览器（iexplore.exe，应用于互联网资源）。由于这两个浏览器功能强大，而且又与Windows操作系统捆绑销售，最终也就成为了浏览器的标准。但有时候，为了给浏览器加入一些新的特性，我们往往会重新设计一个自己的浏览器。新的浏览器模仿标准浏览器的大部分功能，同时加入新特性...&nbsp;&nbsp;<a href='http://www.cppblog.com/ispfcn/archive/2006/12/11/16274.html'>阅读全文</a><img src ="http://www.cppblog.com/ispfcn/aggbug/16274.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ispfcn/" target="_blank">编程之道</a> 2006-12-11 15:49 <a href="http://www.cppblog.com/ispfcn/archive/2006/12/11/16274.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言高级测试：为C程序员准备的0x10个最佳问题 </title><link>http://www.cppblog.com/ispfcn/archive/2006/11/01/14469.html</link><dc:creator>编程之道</dc:creator><author>编程之道</author><pubDate>Wed, 01 Nov 2006 04:02:00 GMT</pubDate><guid>http://www.cppblog.com/ispfcn/archive/2006/11/01/14469.html</guid><wfw:comment>http://www.cppblog.com/ispfcn/comments/14469.html</wfw:comment><comments>http://www.cppblog.com/ispfcn/archive/2006/11/01/14469.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ispfcn/comments/commentRss/14469.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ispfcn/services/trackbacks/14469.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 整个测试遵循以下的约定：																										u								       																				假定在所有的程序中必须的头文件都已经被正确包含。																		考虑如下的数据类型：																										u	...&nbsp;&nbsp;<a href='http://www.cppblog.com/ispfcn/archive/2006/11/01/14469.html'>阅读全文</a><img src ="http://www.cppblog.com/ispfcn/aggbug/14469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ispfcn/" target="_blank">编程之道</a> 2006-11-01 12:02 <a href="http://www.cppblog.com/ispfcn/archive/2006/11/01/14469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何计算一个数的二进制形式中1的个数</title><link>http://www.cppblog.com/ispfcn/archive/2006/11/01/14459.html</link><dc:creator>编程之道</dc:creator><author>编程之道</author><pubDate>Wed, 01 Nov 2006 01:51:00 GMT</pubDate><guid>http://www.cppblog.com/ispfcn/archive/2006/11/01/14459.html</guid><wfw:comment>http://www.cppblog.com/ispfcn/comments/14459.html</wfw:comment><comments>http://www.cppblog.com/ispfcn/archive/2006/11/01/14459.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ispfcn/comments/commentRss/14459.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ispfcn/services/trackbacks/14459.html</trackback:ping><description><![CDATA[
		<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 src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">#include </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">stdio.h</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">stdlib.h</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 3</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 4</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> main(</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> argc,</span>
				<span style="COLOR: #0000ff">char</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">argv[])<br /></span>
				<span style="COLOR: #008080"> 5</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_72_259_Open_Image" onclick="this.style.display='none'; Codehighlighter1_72_259_Open_Text.style.display='none'; Codehighlighter1_72_259_Closed_Image.style.display='inline'; Codehighlighter1_72_259_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_72_259_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_72_259_Closed_Text.style.display='none'; Codehighlighter1_72_259_Open_Image.style.display='inline'; Codehighlighter1_72_259_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_72_259_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_72_259_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080"> 6</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">(argc </span>
						<span style="COLOR: #000000">!=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">2</span>
						<span style="COLOR: #000000">)<br /></span>
						<span style="COLOR: #008080"> 7</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_90_141_Open_Image" onclick="this.style.display='none'; Codehighlighter1_90_141_Open_Text.style.display='none'; Codehighlighter1_90_141_Closed_Image.style.display='inline'; Codehighlighter1_90_141_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_90_141_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_90_141_Closed_Text.style.display='none'; Codehighlighter1_90_141_Open_Image.style.display='inline'; Codehighlighter1_90_141_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_90_141_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_90_141_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080"> 8</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        printf(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">%s &lt;number&gt;\n</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">,argv[</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">]);<br /></span>
								<span style="COLOR: #008080"> 9</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        exit(</span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #000000">1</span>
								<span style="COLOR: #000000">);<br /></span>
								<span style="COLOR: #008080">10</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">11</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    unsigned </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> i,j;<br /></span>
						<span style="COLOR: #008080">12</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    i </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> j </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> atoi(argv[</span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">]);<br /></span>
						<span style="COLOR: #008080">13</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> k</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">14</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">for</span>
						<span style="COLOR: #000000">(;i;i </span>
						<span style="COLOR: #000000">&amp;=</span>
						<span style="COLOR: #000000"> i</span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">)<br /></span>
						<span style="COLOR: #008080">15</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        k</span>
						<span style="COLOR: #000000">++</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">16</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    printf(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">%d : %d\n</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">,j,k);<br /></span>
						<span style="COLOR: #008080">17</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">18</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
<img src ="http://www.cppblog.com/ispfcn/aggbug/14459.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ispfcn/" target="_blank">编程之道</a> 2006-11-01 09:51 <a href="http://www.cppblog.com/ispfcn/archive/2006/11/01/14459.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在C语言中巧用正则表达式</title><link>http://www.cppblog.com/ispfcn/archive/2006/09/22/12832.html</link><dc:creator>编程之道</dc:creator><author>编程之道</author><pubDate>Fri, 22 Sep 2006 08:05:00 GMT</pubDate><guid>http://www.cppblog.com/ispfcn/archive/2006/09/22/12832.html</guid><wfw:comment>http://www.cppblog.com/ispfcn/comments/12832.html</wfw:comment><comments>http://www.cppblog.com/ispfcn/archive/2006/09/22/12832.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ispfcn/comments/commentRss/12832.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ispfcn/services/trackbacks/12832.html</trackback:ping><description><![CDATA[如果用户熟悉Linux下的sed、awk、grep或vi，那么对正则表达式这一概念肯定不会陌生。由于它可以极大地简化处理字符串时的复杂度，因此现在已经在许多Linux实用工具中得到了应用。千万不要以为正则表达式只是Perl、Python、Bash等脚本语言的专利，作为C语言程序员，用户同样可以在自己的程序中运用正则表达式。  <br /><br />标准的C和C++都不支持正则表达式，但有一些函数库可以辅助C/C++程序员完成这一功能，其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库，许多Linux发行版本都带有这个函数库。  <br /><br />编译正则表达式  <br /><br />为了提高效率，在将一个字符串与正则表达式进行比较之前，首先要用regcomp()函数对它进行编译，将其转化为regex_t结构：  <br /><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"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> regcomp(regex_t </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">preg, </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">regex, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> cflags); </span></div><br />参数regex是一个字符串，它代表将要被编译的正则表达式；参数preg指向一个声明为regex_t的数据结构，用来保存编译结果；参数cflags决定了正则表达式该如何被处理的细节。  <br /><br />如果函数regcomp()执行成功，并且编译结果被正确填充到preg中后，函数将返回0，任何其它的返回结果都代表有某种错误产生。  <br /><br />匹配正则表达式  <br /><br />一旦用regcomp()函数成功地编译了正则表达式，接下来就可以调用regexec()函数完成模式匹配： <br /><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"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> regexec(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">  regex_t  </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">preg,  </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">, size_t nmatch,regmatch_t pmatch[], </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> eflags); <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_122_163_Open_Image" onclick="this.style.display='none'; Codehighlighter1_122_163_Open_Text.style.display='none'; Codehighlighter1_122_163_Closed_Image.style.display='inline'; Codehighlighter1_122_163_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_122_163_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_122_163_Closed_Text.style.display='none'; Codehighlighter1_122_163_Open_Image.style.display='inline'; Codehighlighter1_122_163_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />typedef </span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_122_163_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_122_163_Open_Text"><span style="COLOR: #000000">{ <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  regoff_t rm_so; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  regoff_t rm_eo; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"> regmatch_t; </span></div>参数preg指向编译后的正则表达式，参数string是将要进行匹配的字符串，而参数nmatch和pmatch则用于把匹配结果返回给调用程序，最后一个参数eflags决定了匹配的细节。  <br /><br />在调用函数regexec()进行模式匹配的过程中，可能在字符串string中会有多处与给定的正则表达式相匹配，参数pmatch就是用来保存这些匹配位置的，而参数nmatch则告诉函数regexec()最多可以把多少个匹配结果填充到pmatch数组中。当regexec()函数成功返回时，从string+pmatch[0].rm_so到string+pmatch[0].rm_eo是第一个匹配的字符串，而从string+pmatch[1].rm_so到string+pmatch[1].rm_eo，则是第二个匹配的字符串，依此类推。  <br /><br />释放正则表达式  <br /><br />无论什么时候，当不再需要已经编译过的正则表达式时，都应该调用函数regfree()将其释放，以免产生内存泄漏。  <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"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> regfree(regex_t </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">preg); </span></div><br />函数regfree()不会返回任何结果，它仅接收一个指向regex_t数据类型的指针，这是之前调用regcomp()函数所得到的编译结果。  <br /><br />如果在程序中针对同一个regex_t结构调用了多次regcomp()函数，POSIX标准并没有规定是否每次都必须调用regfree()函数进行释放，但建议每次调用regcomp()函数对正则表达式进行编译后都调用一次regfree()函数，以尽早释放占用的存储空间。  <br /><br />报告错误信息  <br /><br />如果调用函数regcomp()或regexec()得到的是一个非0的返回值，则表明在对正则表达式的处理过程中出现了某种错误，此时可以通过调用函数regerror()得到详细的错误信息。  <br /><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"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">size_t regerror(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> errcode, </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> regex_t </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">preg, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">errbuf, size_t errbuf_size); </span></div><br />参数errcode是来自函数regcomp()或regexec()的错误代码，而参数preg则是由函数regcomp()得到的编译结果，其目的是把格式化消息所必须的上下文提供给regerror()函数。在执行函数regerror()时，将按照参数errbuf_size指明的最大字节数，在errbuf缓冲区中填入格式化后的错误信息，同时返回错误信息的长度。  <br /><br />应用正则表达式  <br /><br />最后给出一个具体的实例，介绍如何在C语言程序中处理正则表达式。 <br /><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"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">sys</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">types.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">regex.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_68_79_Open_Image" onclick="this.style.display='none'; Codehighlighter1_68_79_Open_Text.style.display='none'; Codehighlighter1_68_79_Closed_Image.style.display='inline'; Codehighlighter1_68_79_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_68_79_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_68_79_Closed_Text.style.display='none'; Codehighlighter1_68_79_Open_Image.style.display='inline'; Codehighlighter1_68_79_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_68_79_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">/**/</span><span id="Codehighlighter1_68_79_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> 取子串的函数 </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"> <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> substr(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">str, unsigned start, unsigned end) <br /><img id="Codehighlighter1_149_277_Open_Image" onclick="this.style.display='none'; Codehighlighter1_149_277_Open_Text.style.display='none'; Codehighlighter1_149_277_Closed_Image.style.display='inline'; Codehighlighter1_149_277_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_149_277_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_149_277_Closed_Text.style.display='none'; Codehighlighter1_149_277_Open_Image.style.display='inline'; Codehighlighter1_149_277_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_149_277_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_149_277_Open_Text"><span style="COLOR: #000000">{ <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  unsigned n </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> end </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> start; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> stbuf[</span><span style="COLOR: #000000">256</span><span style="COLOR: #000000">]; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  strncpy(stbuf, str </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> start, n); <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  stbuf[n] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> stbuf; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"> <br /><img id="Codehighlighter1_280_288_Open_Image" onclick="this.style.display='none'; Codehighlighter1_280_288_Open_Text.style.display='none'; Codehighlighter1_280_288_Closed_Image.style.display='inline'; Codehighlighter1_280_288_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_280_288_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_280_288_Closed_Text.style.display='none'; Codehighlighter1_280_288_Open_Image.style.display='inline'; Codehighlighter1_280_288_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_280_288_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">/**/</span><span id="Codehighlighter1_280_288_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> 主程序 </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"> <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> argc, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">**</span><span style="COLOR: #000000"> argv) <br /><img id="Codehighlighter1_324_1375_Open_Image" onclick="this.style.display='none'; Codehighlighter1_324_1375_Open_Text.style.display='none'; Codehighlighter1_324_1375_Closed_Image.style.display='inline'; Codehighlighter1_324_1375_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_324_1375_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_324_1375_Closed_Text.style.display='none'; Codehighlighter1_324_1375_Open_Image.style.display='inline'; Codehighlighter1_324_1375_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_324_1375_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_324_1375_Open_Text"><span style="COLOR: #000000">{ <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> pattern; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> x, z, lno </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, cflags </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> ebuf[</span><span style="COLOR: #000000">128</span><span style="COLOR: #000000">], lbuf[</span><span style="COLOR: #000000">256</span><span style="COLOR: #000000">]; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  regex_t reg; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  regmatch_t pm[</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">]; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> size_t nmatch </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">; <br /><img id="Codehighlighter1_479_490_Open_Image" onclick="this.style.display='none'; Codehighlighter1_479_490_Open_Text.style.display='none'; Codehighlighter1_479_490_Closed_Image.style.display='inline'; Codehighlighter1_479_490_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_479_490_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_479_490_Closed_Text.style.display='none'; Codehighlighter1_479_490_Open_Image.style.display='inline'; Codehighlighter1_479_490_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span><span id="Codehighlighter1_479_490_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">/**/</span><span id="Codehighlighter1_479_490_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> 编译正则表达式</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"> <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  pattern </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> argv[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  z </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> regcomp(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">reg, pattern, cflags); <br /><img id="Codehighlighter1_567_692_Open_Image" onclick="this.style.display='none'; Codehighlighter1_567_692_Open_Text.style.display='none'; Codehighlighter1_567_692_Closed_Image.style.display='inline'; Codehighlighter1_567_692_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_567_692_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_567_692_Closed_Text.style.display='none'; Codehighlighter1_567_692_Open_Image.style.display='inline'; Codehighlighter1_567_692_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (z </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)</span><span id="Codehighlighter1_567_692_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_567_692_Open_Text"><span style="COLOR: #000000">{ <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    regerror(z, </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">reg, ebuf, </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(ebuf)); <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    fprintf(stderr, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s: pattern '%s' \n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, ebuf, pattern); <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span></span><span style="COLOR: #000000"> <br /><img id="Codehighlighter1_697_712_Open_Image" onclick="this.style.display='none'; Codehighlighter1_697_712_Open_Text.style.display='none'; Codehighlighter1_697_712_Closed_Image.style.display='inline'; Codehighlighter1_697_712_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_697_712_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_697_712_Closed_Text.style.display='none'; Codehighlighter1_697_712_Open_Image.style.display='inline'; Codehighlighter1_697_712_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span><span id="Codehighlighter1_697_712_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">/**/</span><span id="Codehighlighter1_697_712_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">  逐行处理输入的数据 </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"> <br /><img id="Codehighlighter1_757_1323_Open_Image" onclick="this.style.display='none'; Codehighlighter1_757_1323_Open_Text.style.display='none'; Codehighlighter1_757_1323_Closed_Image.style.display='inline'; Codehighlighter1_757_1323_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_757_1323_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_757_1323_Closed_Text.style.display='none'; Codehighlighter1_757_1323_Open_Image.style.display='inline'; Codehighlighter1_757_1323_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(fgets(lbuf, </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(lbuf), stdin)) </span><span id="Codehighlighter1_757_1323_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_757_1323_Open_Text"><span style="COLOR: #000000">{ <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">lno; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ((z </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> strlen(lbuf)) </span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">; </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000"> lbuf[z</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">) <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      lbuf[z </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; <br /><img id="Codehighlighter1_856_876_Open_Image" onclick="this.style.display='none'; Codehighlighter1_856_876_Open_Text.style.display='none'; Codehighlighter1_856_876_Closed_Image.style.display='inline'; Codehighlighter1_856_876_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_856_876_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_856_876_Closed_Text.style.display='none'; Codehighlighter1_856_876_Open_Image.style.display='inline'; Codehighlighter1_856_876_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_856_876_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">/**/</span><span id="Codehighlighter1_856_876_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> 对每一行应用正则表达式进行匹配 </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"> <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    z </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> regexec(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">reg, lbuf, nmatch, pm, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">); <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (z </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> REG_NOMATCH) </span><span style="COLOR: #0000ff">continue</span><span style="COLOR: #000000">; <br /><img id="Codehighlighter1_982_1111_Open_Image" onclick="this.style.display='none'; Codehighlighter1_982_1111_Open_Text.style.display='none'; Codehighlighter1_982_1111_Closed_Image.style.display='inline'; Codehighlighter1_982_1111_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_982_1111_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_982_1111_Closed_Text.style.display='none'; Codehighlighter1_982_1111_Open_Image.style.display='inline'; Codehighlighter1_982_1111_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (z </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">) </span><span id="Codehighlighter1_982_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_982_1111_Open_Text"><span style="COLOR: #000000">{ <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      regerror(z, </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">reg, ebuf, </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(ebuf)); <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      fprintf(stderr, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s: regcom('%s')\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, ebuf, lbuf); <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"> <br /><img id="Codehighlighter1_1118_1129_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1118_1129_Open_Text.style.display='none'; Codehighlighter1_1118_1129_Closed_Image.style.display='inline'; Codehighlighter1_1118_1129_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1118_1129_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1118_1129_Closed_Text.style.display='none'; Codehighlighter1_1118_1129_Open_Image.style.display='inline'; Codehighlighter1_1118_1129_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_1118_1129_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">/**/</span><span id="Codehighlighter1_1118_1129_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> 输出处理结果 </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"> <br /><img id="Codehighlighter1_1187_1318_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1187_1318_Open_Text.style.display='none'; Codehighlighter1_1187_1318_Closed_Image.style.display='inline'; Codehighlighter1_1187_1318_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1187_1318_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1187_1318_Closed_Text.style.display='none'; Codehighlighter1_1187_1318_Open_Image.style.display='inline'; Codehighlighter1_1187_1318_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (x </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; x </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> nmatch </span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000"> pm[x].rm_so </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">; </span><span style="COLOR: #000000">++</span><span style="COLOR: #000000"> x) </span><span id="Codehighlighter1_1187_1318_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_1187_1318_Open_Text"><span style="COLOR: #000000">{ <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">x) printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%04d: %s\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, lno, lbuf); <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">  $%d='%s'\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, x, substr(lbuf, pm[x].rm_so, pm[x].rm_eo)); <br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"> <br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span></span><span style="COLOR: #000000"> <br /><img id="Codehighlighter1_1328_1341_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1328_1341_Open_Text.style.display='none'; Codehighlighter1_1328_1341_Closed_Image.style.display='inline'; Codehighlighter1_1328_1341_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1328_1341_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1328_1341_Closed_Text.style.display='none'; Codehighlighter1_1328_1341_Open_Image.style.display='inline'; Codehighlighter1_1328_1341_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span><span id="Codehighlighter1_1328_1341_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">/**/</span><span id="Codehighlighter1_1328_1341_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> 释放正则表达式  </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"> <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  regfree(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">reg); <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</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" /></span></div><br />上述程序负责从命令行获取正则表达式，然后将其运用于从标准输入得到的每行数据，并打印出匹配结果。执行下面的命令可以编译并执行该程序：  <br /><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"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">#</span><span style="COLOR: #008000">  gcc regexp.c -o regexp <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#  ./regexp  'regex[a-z]*' &lt; regexp.c </span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #800000">0003</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000"> </span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">include &lt;regex.h&gt;; </span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  $</span><span style="COLOR: #800000">0</span><span style="COLOR: #000000">=</span><span style="FONT-WEIGHT: bold; COLOR: #000000">'</span><span style="FONT-WEIGHT: bold; COLOR: #000000">regex</span><span style="FONT-WEIGHT: bold; COLOR: #000000">'</span><span style="COLOR: #000000"> <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #800000">0027</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">   regex_t reg; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  $</span><span style="COLOR: #800000">0</span><span style="COLOR: #000000">=</span><span style="FONT-WEIGHT: bold; COLOR: #000000">'</span><span style="FONT-WEIGHT: bold; COLOR: #000000">regex</span><span style="FONT-WEIGHT: bold; COLOR: #000000">'</span><span style="COLOR: #000000"> <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #800000">0054</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">     z </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> regexec(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">reg</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> lbuf</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> nmatch</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> pm</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">0</span><span style="COLOR: #000000">); <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  $</span><span style="COLOR: #800000">0</span><span style="COLOR: #000000">=</span><span style="FONT-WEIGHT: bold; COLOR: #000000">'</span><span style="FONT-WEIGHT: bold; COLOR: #000000">regexec</span><span style="FONT-WEIGHT: bold; COLOR: #000000">'</span><span style="COLOR: #000000"> </span></div><br />小结  <br /><br />对那些需要进行复杂数据处理的程序来说，正则表达式无疑是一个非常有用的工具。本文重点在于阐述如何在C语言中利用正则表达式来简化字符串处理，以便在数据处理方面能够获得与Perl语言类似的灵活性。<br /><img src ="http://www.cppblog.com/ispfcn/aggbug/12832.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ispfcn/" target="_blank">编程之道</a> 2006-09-22 16:05 <a href="http://www.cppblog.com/ispfcn/archive/2006/09/22/12832.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习Linux上C编程练习</title><link>http://www.cppblog.com/ispfcn/archive/2006/09/21/12795.html</link><dc:creator>编程之道</dc:creator><author>编程之道</author><pubDate>Thu, 21 Sep 2006 07:22:00 GMT</pubDate><guid>http://www.cppblog.com/ispfcn/archive/2006/09/21/12795.html</guid><wfw:comment>http://www.cppblog.com/ispfcn/comments/12795.html</wfw:comment><comments>http://www.cppblog.com/ispfcn/archive/2006/09/21/12795.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ispfcn/comments/commentRss/12795.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ispfcn/services/trackbacks/12795.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 程序没什么东西，比较简单，就是想把看的一些东西都用上。客户端程序还要修改，连接超时没设置。服务器：  1/**//**  2* sock编程测试，多线程，server端  3**/  4#include &lt;stdio.h&gt;  5#include &lt;stdlib.h&gt;  6#include &lt;unistd.h&gt;  7#include &lt;string.h&gt...&nbsp;&nbsp;<a href='http://www.cppblog.com/ispfcn/archive/2006/09/21/12795.html'>阅读全文</a><img src ="http://www.cppblog.com/ispfcn/aggbug/12795.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ispfcn/" target="_blank">编程之道</a> 2006-09-21 15:22 <a href="http://www.cppblog.com/ispfcn/archive/2006/09/21/12795.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>getenv的线程安全版本</title><link>http://www.cppblog.com/ispfcn/archive/2006/09/14/12468.html</link><dc:creator>编程之道</dc:creator><author>编程之道</author><pubDate>Thu, 14 Sep 2006 08:24:00 GMT</pubDate><guid>http://www.cppblog.com/ispfcn/archive/2006/09/14/12468.html</guid><wfw:comment>http://www.cppblog.com/ispfcn/comments/12468.html</wfw:comment><comments>http://www.cppblog.com/ispfcn/archive/2006/09/14/12468.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ispfcn/comments/commentRss/12468.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ispfcn/services/trackbacks/12468.html</trackback:ping><description><![CDATA[
		<p>《unix环境高级编程》上的<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 src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">#include </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #0000ff">string</span>
				<span style="COLOR: #000000">.h</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">errno.h</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 3</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">pthread.h</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 4</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">stdlib.h</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 5</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 6</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">extern</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">char</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">**</span>
				<span style="COLOR: #000000">environ;<br /></span>
				<span style="COLOR: #008080"> 7</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 8</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />pthread_mutex_t env_mutex;<br /></span>
				<span style="COLOR: #008080"> 9</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">static</span>
				<span style="COLOR: #000000"> pthread_once_t init_donw </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> PTHREAD_ONCE_INIT;<br /></span>
				<span style="COLOR: #008080">10</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">11</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">static</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> thread_init(</span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080">12</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_216_423_Open_Image" onclick="this.style.display='none'; Codehighlighter1_216_423_Open_Text.style.display='none'; Codehighlighter1_216_423_Closed_Image.style.display='inline'; Codehighlighter1_216_423_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_216_423_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_216_423_Closed_Text.style.display='none'; Codehighlighter1_216_423_Open_Image.style.display='inline'; Codehighlighter1_216_423_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_216_423_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_216_423_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080">13</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    pthread_mutexattr_t attr;<br /></span>
						<span style="COLOR: #008080">14</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    pthread_mutexattr_init(</span>
						<span style="COLOR: #000000">&amp;</span>
						<span style="COLOR: #000000">attr);<br /></span>
						<span style="COLOR: #008080">15</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    pthread_mutexattr_settype(</span>
						<span style="COLOR: #000000">&amp;</span>
						<span style="COLOR: #000000">attr,PTHREAD_MUTEX_RECURSIVE); </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000"> 设置可递归的互斥量</span>
						<span style="COLOR: #008000">
								<br />
						</span>
						<span style="COLOR: #008080">16</span>
						<span style="COLOR: #008000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">    pthread_mutex_init(</span>
						<span style="COLOR: #000000">&amp;</span>
						<span style="COLOR: #000000">env_mutex,</span>
						<span style="COLOR: #000000">&amp;</span>
						<span style="COLOR: #000000">attr);<br /></span>
						<span style="COLOR: #008080">17</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    pthread_mutexattr_destroy(</span>
						<span style="COLOR: #000000">&amp;</span>
						<span style="COLOR: #000000">attr);<br /></span>
						<span style="COLOR: #008080">18</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">19</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">20</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> getevn_r(</span>
				<span style="COLOR: #0000ff">const</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">char</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">name, </span>
				<span style="COLOR: #0000ff">char</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">buf, </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> buflen)<br /></span>
				<span style="COLOR: #008080">21</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_480_1021_Open_Image" onclick="this.style.display='none'; Codehighlighter1_480_1021_Open_Text.style.display='none'; Codehighlighter1_480_1021_Closed_Image.style.display='inline'; Codehighlighter1_480_1021_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_480_1021_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_480_1021_Closed_Text.style.display='none'; Codehighlighter1_480_1021_Open_Image.style.display='inline'; Codehighlighter1_480_1021_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_480_1021_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_480_1021_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080">22</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> i, len, olen;<br /></span>
						<span style="COLOR: #008080">23</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    <br /></span>
						<span style="COLOR: #008080">24</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    pthread_once(</span>
						<span style="COLOR: #000000">&amp;</span>
						<span style="COLOR: #000000">init_done,thread_init); </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000"> 确保每个进程只调用一次threaad_init()</span>
						<span style="COLOR: #008000">
								<br />
						</span>
						<span style="COLOR: #008080">25</span>
						<span style="COLOR: #008000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">    len </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> strlen(name);<br /></span>
						<span style="COLOR: #008080">26</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    pthread_mutex_lock(</span>
						<span style="COLOR: #000000">&amp;</span>
						<span style="COLOR: #000000">env_mutex);<br /></span>
						<span style="COLOR: #008080">27</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">for</span>
						<span style="COLOR: #000000">(i</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">;environ[i]</span>
						<span style="COLOR: #000000">!=</span>
						<span style="COLOR: #000000">NULL;i</span>
						<span style="COLOR: #000000">++</span>
						<span style="COLOR: #000000">)<br /></span>
						<span style="COLOR: #008080">28</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_657_967_Open_Image" onclick="this.style.display='none'; Codehighlighter1_657_967_Open_Text.style.display='none'; Codehighlighter1_657_967_Closed_Image.style.display='inline'; Codehighlighter1_657_967_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_657_967_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_657_967_Closed_Text.style.display='none'; Codehighlighter1_657_967_Open_Image.style.display='inline'; Codehighlighter1_657_967_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_657_967_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_657_967_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080">29</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000">( (strncmp(name,environ[i],len)</span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">&amp;&amp;</span>
								<span style="COLOR: #000000"> (environ[i][len] </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">) )<br /></span>
								<span style="COLOR: #008080">30</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_730_964_Open_Image" onclick="this.style.display='none'; Codehighlighter1_730_964_Open_Text.style.display='none'; Codehighlighter1_730_964_Closed_Image.style.display='inline'; Codehighlighter1_730_964_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_730_964_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_730_964_Closed_Text.style.display='none'; Codehighlighter1_730_964_Open_Image.style.display='inline'; Codehighlighter1_730_964_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span id="Codehighlighter1_730_964_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_730_964_Open_Text">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080">31</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            olen </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> strlen(</span>
										<span style="COLOR: #000000">&amp;</span>
										<span style="COLOR: #000000">environ[i][len</span>
										<span style="COLOR: #000000">+</span>
										<span style="COLOR: #000000">1</span>
										<span style="COLOR: #000000">]);<br /></span>
										<span style="COLOR: #008080">32</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
										<span style="COLOR: #0000ff">if</span>
										<span style="COLOR: #000000">( olen </span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000"> buflen ) </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000"> 检查缓冲区长度是否足够</span>
										<span style="COLOR: #008000">
												<br />
										</span>
										<span style="COLOR: #008080">33</span>
										<span style="COLOR: #008000">
												<img id="Codehighlighter1_811_874_Open_Image" onclick="this.style.display='none'; Codehighlighter1_811_874_Open_Text.style.display='none'; Codehighlighter1_811_874_Closed_Image.style.display='inline'; Codehighlighter1_811_874_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
												<img id="Codehighlighter1_811_874_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_811_874_Closed_Text.style.display='none'; Codehighlighter1_811_874_Open_Image.style.display='inline'; Codehighlighter1_811_874_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">            </span>
										<span id="Codehighlighter1_811_874_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_811_874_Open_Text">
												<span style="COLOR: #000000">{<br /></span>
												<span style="COLOR: #008080">34</span>
												<span style="COLOR: #000000">
														<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />                pthread_mutex_unlock(</span>
												<span style="COLOR: #000000">&amp;</span>
												<span style="COLOR: #000000">env_mutex);<br /></span>
												<span style="COLOR: #008080">35</span>
												<span style="COLOR: #000000">
														<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />                </span>
												<span style="COLOR: #0000ff">return</span>
												<span style="COLOR: #000000">(ENOSPC);<br /></span>
												<span style="COLOR: #008080">36</span>
												<span style="COLOR: #000000">
														<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span>
										</span>
										<span style="COLOR: #000000">
												<br />
										</span>
										<span style="COLOR: #008080">37</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            strcpy(buf,</span>
										<span style="COLOR: #000000">&amp;</span>
										<span style="COLOR: #000000">environ[i][len</span>
										<span style="COLOR: #000000">+</span>
										<span style="COLOR: #000000">1</span>
										<span style="COLOR: #000000">]);<br /></span>
										<span style="COLOR: #008080">38</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            pthread_mutex_unlock(</span>
										<span style="COLOR: #000000">&amp;</span>
										<span style="COLOR: #000000">env_mutex);<br /></span>
										<span style="COLOR: #008080">39</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
										<span style="COLOR: #0000ff">return</span>
										<span style="COLOR: #000000">(</span>
										<span style="COLOR: #000000">0</span>
										<span style="COLOR: #000000">);<br /></span>
										<span style="COLOR: #008080">40</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
								</span>
								<span style="COLOR: #008080">41</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">42</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    pthread_mutex_unlock(</span>
						<span style="COLOR: #000000">&amp;</span>
						<span style="COLOR: #000000">env_mutex);<br /></span>
						<span style="COLOR: #008080">43</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000">(ENOENT);<br /></span>
						<span style="COLOR: #008080">44</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">45</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
<img src ="http://www.cppblog.com/ispfcn/aggbug/12468.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ispfcn/" target="_blank">编程之道</a> 2006-09-14 16:24 <a href="http://www.cppblog.com/ispfcn/archive/2006/09/14/12468.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 C 语言操作 MySQL</title><link>http://www.cppblog.com/ispfcn/archive/2006/04/06/5110.html</link><dc:creator>编程之道</dc:creator><author>编程之道</author><pubDate>Thu, 06 Apr 2006 06:29:00 GMT</pubDate><guid>http://www.cppblog.com/ispfcn/archive/2006/04/06/5110.html</guid><wfw:comment>http://www.cppblog.com/ispfcn/comments/5110.html</wfw:comment><comments>http://www.cppblog.com/ispfcn/archive/2006/04/06/5110.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ispfcn/comments/commentRss/5110.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ispfcn/services/trackbacks/5110.html</trackback:ping><description><![CDATA[发现了一篇文章，感觉还不错，不过没测试，是不是在linux下能用<br /><a href="http://www.unix-cd.com/unixcd12/article_view.asp?id=4138">http://www.unix-cd.com/unixcd12/article_view.asp?id=4138</a><br />贴一段以前在windows上使用mysql的代码。<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: #008080"> 1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">winsock2.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">mysql.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#pragma comment(lib,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">libmySQL.lib</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img id="Codehighlighter1_129_1183_Open_Image" onclick="this.style.display='none'; Codehighlighter1_129_1183_Open_Text.style.display='none'; Codehighlighter1_129_1183_Closed_Image.style.display='inline'; Codehighlighter1_129_1183_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_129_1183_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_129_1183_Closed_Text.style.display='none'; Codehighlighter1_129_1183_Open_Image.style.display='inline'; Codehighlighter1_129_1183_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> main()</span><span id="Codehighlighter1_129_1183_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_129_1183_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   MYSQL </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">mysql;<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   MYSQL_RES </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">res;<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   MYSQL_ROW row;<br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">query;<br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> t,r;<br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   <br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   mysql</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">mysql_init(mysql);<br /></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">mysql_real_connect(mysql,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">localhost</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">root</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ceshi</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,NULL,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">))<br /></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img id="Codehighlighter1_323_402_Open_Image" onclick="this.style.display='none'; Codehighlighter1_323_402_Open_Text.style.display='none'; Codehighlighter1_323_402_Closed_Image.style.display='inline'; Codehighlighter1_323_402_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_323_402_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_323_402_Closed_Text.style.display='none'; Codehighlighter1_323_402_Open_Image.style.display='inline'; Codehighlighter1_323_402_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   </span><span id="Codehighlighter1_323_402_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_323_402_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />       printf( </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Error connecting to database: %s\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,mysql_error(mysql));<br /></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />   }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />       printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Connected<img src="http://www.cppblog.com/images/dot.gif" />\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   query</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Insert Into admin(username,password) values('whoami','iampf')</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   t</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">mysql_real_query(mysql,query,(unsigned </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)strlen(query));<br /></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(t)<br /></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img id="Codehighlighter1_594_652_Open_Image" onclick="this.style.display='none'; Codehighlighter1_594_652_Open_Text.style.display='none'; Codehighlighter1_594_652_Closed_Image.style.display='inline'; Codehighlighter1_594_652_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_594_652_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_594_652_Closed_Text.style.display='none'; Codehighlighter1_594_652_Open_Image.style.display='inline'; Codehighlighter1_594_652_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   </span><span id="Codehighlighter1_594_652_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_594_652_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />       printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Insert Error:%s\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,mysql_error(mysql));<br /></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />   }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   query</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">select * from admin</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">32</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   t</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">mysql_real_query(mysql,query,(unsigned </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">) strlen(query));<br /></span><span style="COLOR: #008080">33</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (t)<br /></span><span style="COLOR: #008080">34</span><span style="COLOR: #000000"><img id="Codehighlighter1_765_847_Open_Image" onclick="this.style.display='none'; Codehighlighter1_765_847_Open_Text.style.display='none'; Codehighlighter1_765_847_Closed_Image.style.display='inline'; Codehighlighter1_765_847_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_765_847_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_765_847_Closed_Text.style.display='none'; Codehighlighter1_765_847_Open_Image.style.display='inline'; Codehighlighter1_765_847_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   </span><span id="Codehighlighter1_765_847_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_765_847_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">35</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Error making query: %s\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,<br /></span><span style="COLOR: #008080">36</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />              mysql_error(mysql));<br /></span><span style="COLOR: #008080">37</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />   }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">38</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Query made<img src="http://www.cppblog.com/images/dot.gif" />\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">39</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   res</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">mysql_use_result(mysql);<br /></span><span style="COLOR: #008080">40</span><span style="COLOR: #000000"><img id="Codehighlighter1_959_1158_Open_Image" onclick="this.style.display='none'; Codehighlighter1_959_1158_Open_Text.style.display='none'; Codehighlighter1_959_1158_Closed_Image.style.display='inline'; Codehighlighter1_959_1158_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_959_1158_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_959_1158_Closed_Text.style.display='none'; Codehighlighter1_959_1158_Open_Image.style.display='inline'; Codehighlighter1_959_1158_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(r</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;r</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">mysql_field_count(mysql);r</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)</span><span id="Codehighlighter1_959_1158_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_959_1158_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">41</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />           row</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">mysql_fetch_row(res);<br /></span><span style="COLOR: #008080">42</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />           </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(row</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">) </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">43</span><span style="COLOR: #000000"><img id="Codehighlighter1_1073_1127_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1073_1127_Open_Text.style.display='none'; Codehighlighter1_1073_1127_Closed_Image.style.display='inline'; Codehighlighter1_1073_1127_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1073_1127_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1073_1127_Closed_Text.style.display='none'; Codehighlighter1_1073_1127_Open_Image.style.display='inline'; Codehighlighter1_1073_1127_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />           </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(t</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;t</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">mysql_num_fields(res);t</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)</span><span id="Codehighlighter1_1073_1127_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_1073_1127_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">44</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />                   printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,row[t]);<br /></span><span style="COLOR: #008080">45</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />           }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">46</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />           printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">47</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />   }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">48</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   mysql_close(mysql);<br /></span><span style="COLOR: #008080">49</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">50</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">51</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><img src ="http://www.cppblog.com/ispfcn/aggbug/5110.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ispfcn/" target="_blank">编程之道</a> 2006-04-06 14:29 <a href="http://www.cppblog.com/ispfcn/archive/2006/04/06/5110.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows上的MySQL UDF开发</title><link>http://www.cppblog.com/ispfcn/archive/2006/04/06/5075.html</link><dc:creator>编程之道</dc:creator><author>编程之道</author><pubDate>Thu, 06 Apr 2006 04:02:00 GMT</pubDate><guid>http://www.cppblog.com/ispfcn/archive/2006/04/06/5075.html</guid><wfw:comment>http://www.cppblog.com/ispfcn/comments/5075.html</wfw:comment><comments>http://www.cppblog.com/ispfcn/archive/2006/04/06/5075.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ispfcn/comments/commentRss/5075.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ispfcn/services/trackbacks/5075.html</trackback:ping><description><![CDATA[
		<p>终于发现了篇不错的Mysql开发的文章<br />曾以为Windows版本的MySQL存在不能使用UDF的BUG诸提交了一个bug报告。不过<br />似乎发现是我搞错了，MySQL的技术支持人员给了非常完美的解答，同大家分享<br />一下。下边是原文回复 :)<br /><br />Sorry this isn't a bug.<br />Below I pasted a sample I did sometime ago for another user:<br /><br />Ok. Assuming you have VC++ and the source distribution and a server<br />running,<br />I will create a UDF that returns a name:<br /><br />Note: the sample is ugly, but the purpose here is to show you how<br />to handle the UDF.<br /><br />- Open the mysqld.dsw workspace.<br />- Add New project to the workspace<br />- Project name: my_udf<br />- Select Win32 Dynamic-Link Library<br />- Click OK<br />- Select An Empty DLL project<br />- Click Finish<br />- Click OK<br />- Add a new file called my_udf.cpp to the project:<br /><br />#include &lt;stdlib.h&gt;<br />#include &lt;winsock.h&gt;<br />#include &lt;mysql.h&gt;<br /><br />extern "C" {<br />char *my_name(UDF_INIT *initid, UDF_ARGS *args, char *is_null,<br />char *error);<br />}<br /><br />char *my_name(UDF_INIT *initid, UDF_ARGS *args, char *is_null,<br />char *error)<br />{<br />char * me = "my name";<br /><br />return me;<br />}<br /><br />- Type Ctrl+N for to create a new file.<br />- Select text type<br />- File name: my_udf.def<br />- Edit the above file with the below contents:<br />LIBRARY UDF_EXAMPLE<br />DESCRIPTION 'Example Using UDF with VC++'<br />VERSION 1.0<br />EXPORTS<br />my_name<br /><br />- Right Click the my_udf project and select Settings<br />- Click the C/C++ tab<br />- Select General in the Category Combo<br />- Add the macro HAVE_DLOPEN to the PreProcessor definition<br />- Select Preprocessor in the Category Combo<br />- Add the include path to the text box: Additional Include directories<br />e.g: ../include<br />- Press F7 for to build the DLL.<br /><br />- Copy the my_udf.dll to the environment path directory:<br />\winnt\system32 for example.<br /><br />- Start the mysql client and issue:<br /><br />C:\mysql-udf\bin&gt;mysql -uroot -p<br />Enter password:<br />Welcome to the MySQL monitor. Commands end with ; or \g.<br />Your MySQL connection id is 2 to server version: 3.23.52-max-nt<br /><br />Type 'help;' or '\h' for help. Type '\c' to clear the buffer.<br /><br />mysql&gt; CREATE FUNCTION my_name RETURNS STRING SONAME "my_udf.dll";<br />Query OK, 0 rows affected (0.08 sec)<br /><br />mysql&gt; select my_name();<br /><br />mysql&gt; drop function my_name;<br />Query OK, 0 rows affected (0.00 sec)<br /><br />画蛇添足的作下简要中文说明。<br /><br />抱歉，这并不是一个bug。下面我粘贴一个以前为某个客户做的简例，假设你有了<br />VC++,源码分发，并且有一个正常运行的MySQL服务器。<br /><br />我将创建一个UDF它将一个名字：<br />注意：例子非常简陋，目的是让你了解该如何处理手头的UDF。<br /><br />- 打开 mysqld.dsw 工作区。<br />- 添加新项目到这个工作区<br />- Project name: my_udf // 项目名称:my_udf<br />- 选择 Win32 Dynamic-Link Library // Win32动态连接库<br />- 点击 OK<br />- 选择 An Empty DLL project // 一个空DLL项目<br />- 点击 Finish<br />- 点击 OK<br />- 添加新文件 my_udf.cpp 到项目中:<br />#include &lt;stdlib.h&gt;<br />#include &lt;winsock.h&gt;<br />#include &lt;mysql.h&gt;<br /><br />extern "C" {<br />char *my_name(UDF_INIT *initid, UDF_ARGS *args, char *is_null,<br />char *error);<br />// 兼容C<br />}<br /><br />char *my_name(UDF_INIT *initid, UDF_ARGS *args, char *is_null,<br />char *error)<br />{<br />char * me = "my name";<br /><br />return me;<br />// 调用此UDF将返回 my name<br />}<br />- 按 Ctrl+N 来创建一个新文件。<br />- 选择 text 类型<br />- File name: my_udf.def file://文件名：my_udf.def<br />- 按照下边的内容编辑文件。<br />LIBRARY UDF_EXAMPLE<br />DESCRIPTION 'Example Using UDF with VC++'<br />VERSION 1.0<br />EXPORTS<br />my_name<br /><br />- 右击my_udf项目并选择Settings<br />- 点 C/C++ 选项卡<br />- 选择 General<br />- 添加宏 HAVE_DLOPE 到预处理器定义<br />- 选择 Preprocessor<br />- 添加头文件路径: Additional Include directories<br />例如: ../include<br />- 按 F7 去编译成 DLL.<br /><br />- 复制 my_udf.dll 到环境变量path定义过的目录<br />比如 \winnt\system32 。<br /><br />- 打开mysql客户端<br /><br />C:\mysql-udf\bin&gt;mysql -uroot -p<br />Enter password:<br />Welcome to the MySQL monitor. Commands end with ; or \g.<br />Your MySQL connection id is 2 to server version: 3.23.52-max-nt<br /><br />Type 'help;' or '\h' for help. Type '\c' to clear the buffer.<br /><br />mysql&gt; CREATE FUNCTION my_name RETURNS STRING SONAME "my_udf.dll";<br />Query OK, 0 rows affected (0.08 sec)<br /><br />mysql&gt; select my_name();<br /><br />mysql&gt; drop function my_name;<br />Query OK, 0 rows affected (0.00 sec)<br /><br /><br />ok!欢迎大家来MySQL板交流UDF设计经验！我的电子邮件是HeartIcy@163.com，<br />手机13706410308。同时，我们MySQL板准备开始系统化持续性翻译MySQL文档，<br />希望大家多多支持共同完成这一项目。<br /><br />HeartIcy<br />2003年5月17日于中国济南<br /></p>
<img src ="http://www.cppblog.com/ispfcn/aggbug/5075.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ispfcn/" target="_blank">编程之道</a> 2006-04-06 12:02 <a href="http://www.cppblog.com/ispfcn/archive/2006/04/06/5075.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>刚看到了一道小题，练习了一下</title><link>http://www.cppblog.com/ispfcn/archive/2006/04/05/5037.html</link><dc:creator>编程之道</dc:creator><author>编程之道</author><pubDate>Wed, 05 Apr 2006 08:47:00 GMT</pubDate><guid>http://www.cppblog.com/ispfcn/archive/2006/04/05/5037.html</guid><wfw:comment>http://www.cppblog.com/ispfcn/comments/5037.html</wfw:comment><comments>http://www.cppblog.com/ispfcn/archive/2006/04/05/5037.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/ispfcn/comments/commentRss/5037.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ispfcn/services/trackbacks/5037.html</trackback:ping><description><![CDATA[
		<p>Lucy上了初中,她很喜欢数学,经常做数学奥林匹克的题目,可是今天她遇到了难题,于是就向她在南开大学上学的哥哥Feagle请教,聪明的哥哥不一会功夫就编程解决了妹妹的问题(^_^,南开大学的学生就是优秀)! 妹妹的题目是这样的:对给定的f(n) 当 n&gt;=50025002 的时候,f(n)=n-5;当 n&lt;50025002 的时候,f(n)=f(f(n+2005))。现在请您试试编程解决Lucy的难题! </p>
		<p>
				<br />输入 <br />输入只有一个整数n,-2147483647&lt;n&lt;2147483647 。  <br />  输出 <br />输出只有一个整数,f(n) 的值。 <br />  样例输入 样例输出 <br />50025002 50024997 <br />   <br />  时间限制 <br />   <br />对每个输入数据,程序应在5秒内给出结果。<br /><br />我分别用递归和非递归做了一下，本来想把没个函数的运行时间算一下，我用的是clock()，结果是开始时间和结束时间是一样的，我也就没放上了，谁帮忙计算出这两个函数时间上的差异</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 src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">#include </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">iostream</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">time.h</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 3</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">long</span>
				<span style="COLOR: #000000"> count_1(</span>
				<span style="COLOR: #0000ff">long</span>
				<span style="COLOR: #000000"> n);<br /></span>
				<span style="COLOR: #008080"> 4</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">long</span>
				<span style="COLOR: #000000"> count_2(</span>
				<span style="COLOR: #0000ff">long</span>
				<span style="COLOR: #000000"> n);<br /></span>
				<span style="COLOR: #008080"> 5</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> main(</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> argc,</span>
				<span style="COLOR: #0000ff">char</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">argv[])<br /></span>
				<span style="COLOR: #008080"> 6</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_114_325_Open_Image" onclick="this.style.display='none'; Codehighlighter1_114_325_Open_Text.style.display='none'; Codehighlighter1_114_325_Closed_Image.style.display='inline'; Codehighlighter1_114_325_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_114_325_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_114_325_Closed_Text.style.display='none'; Codehighlighter1_114_325_Open_Image.style.display='inline'; Codehighlighter1_114_325_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_114_325_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_114_325_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080"> 7</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">long</span>
						<span style="COLOR: #000000"> n,result_1</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">,result_2</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080"> 8</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">while</span>
						<span style="COLOR: #000000">(</span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">)<br /></span>
						<span style="COLOR: #008080"> 9</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_158_323_Open_Image" onclick="this.style.display='none'; Codehighlighter1_158_323_Open_Text.style.display='none'; Codehighlighter1_158_323_Closed_Image.style.display='inline'; Codehighlighter1_158_323_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_158_323_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_158_323_Closed_Text.style.display='none'; Codehighlighter1_158_323_Open_Image.style.display='inline'; Codehighlighter1_158_323_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_158_323_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_158_323_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080">10</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    printf(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">\nPlease Input A Number:</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">);<br /></span>
								<span style="COLOR: #008080">11</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    scanf(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">%ld</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">,</span>
								<span style="COLOR: #000000">&amp;</span>
								<span style="COLOR: #000000">n);<br /></span>
								<span style="COLOR: #008080">12</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    result_1</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">count_1(n);<br /></span>
								<span style="COLOR: #008080">13</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    result_2</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">count_2(n);<br /></span>
								<span style="COLOR: #008080">14</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    printf(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">\ncount_1:%ld\ncount_2:%ld\n</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">,result_1,result_2);<br /></span>
								<span style="COLOR: #008080">15</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">16</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">17</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">18</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">long</span>
				<span style="COLOR: #000000"> count_1(</span>
				<span style="COLOR: #0000ff">long</span>
				<span style="COLOR: #000000"> n)<br /></span>
				<span style="COLOR: #008080">19</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_349_467_Open_Image" onclick="this.style.display='none'; Codehighlighter1_349_467_Open_Text.style.display='none'; Codehighlighter1_349_467_Closed_Image.style.display='inline'; Codehighlighter1_349_467_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_349_467_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_349_467_Closed_Text.style.display='none'; Codehighlighter1_349_467_Open_Image.style.display='inline'; Codehighlighter1_349_467_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_349_467_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_349_467_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080">20</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">long</span>
						<span style="COLOR: #000000"> i</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">21</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">while</span>
						<span style="COLOR: #000000">(i)<br /></span>
						<span style="COLOR: #008080">22</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_373_454_Open_Image" onclick="this.style.display='none'; Codehighlighter1_373_454_Open_Text.style.display='none'; Codehighlighter1_373_454_Closed_Image.style.display='inline'; Codehighlighter1_373_454_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_373_454_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_373_454_Closed_Text.style.display='none'; Codehighlighter1_373_454_Open_Image.style.display='inline'; Codehighlighter1_373_454_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_373_454_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_373_454_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080">23</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000">(n</span>
								<span style="COLOR: #000000">&gt;=</span>
								<span style="COLOR: #000000">50025002</span>
								<span style="COLOR: #000000">)<br /></span>
								<span style="COLOR: #008080">24</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_395_416_Open_Image" onclick="this.style.display='none'; Codehighlighter1_395_416_Open_Text.style.display='none'; Codehighlighter1_395_416_Closed_Image.style.display='inline'; Codehighlighter1_395_416_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_395_416_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_395_416_Closed_Text.style.display='none'; Codehighlighter1_395_416_Open_Image.style.display='inline'; Codehighlighter1_395_416_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span id="Codehighlighter1_395_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.cppblog.com/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_395_416_Open_Text">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080">25</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            n</span>
										<span style="COLOR: #000000">-=</span>
										<span style="COLOR: #000000">5</span>
										<span style="COLOR: #000000">;<br /></span>
										<span style="COLOR: #008080">26</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            i</span>
										<span style="COLOR: #000000">--</span>
										<span style="COLOR: #000000">;<br /></span>
										<span style="COLOR: #008080">27</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
								</span>
								<span style="COLOR: #008080">28</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">else</span>
								<span style="COLOR: #000000">
										<br />
								</span>
								<span style="COLOR: #008080">29</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_427_451_Open_Image" onclick="this.style.display='none'; Codehighlighter1_427_451_Open_Text.style.display='none'; Codehighlighter1_427_451_Closed_Image.style.display='inline'; Codehighlighter1_427_451_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_427_451_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_427_451_Closed_Text.style.display='none'; Codehighlighter1_427_451_Open_Image.style.display='inline'; Codehighlighter1_427_451_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span id="Codehighlighter1_427_451_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_427_451_Open_Text">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080">30</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            n</span>
										<span style="COLOR: #000000">+=</span>
										<span style="COLOR: #000000">2005</span>
										<span style="COLOR: #000000">;<br /></span>
										<span style="COLOR: #008080">31</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            i</span>
										<span style="COLOR: #000000">++</span>
										<span style="COLOR: #000000">;<br /></span>
										<span style="COLOR: #008080">32</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
								</span>
								<span style="COLOR: #008080">33</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">34</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> n;<br /></span>
						<span style="COLOR: #008080">35</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">36</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">37</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">long</span>
				<span style="COLOR: #000000"> count_2(</span>
				<span style="COLOR: #0000ff">long</span>
				<span style="COLOR: #000000"> n)<br /></span>
				<span style="COLOR: #008080">38</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_491_596_Open_Image" onclick="this.style.display='none'; Codehighlighter1_491_596_Open_Text.style.display='none'; Codehighlighter1_491_596_Closed_Image.style.display='inline'; Codehighlighter1_491_596_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_491_596_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_491_596_Closed_Text.style.display='none'; Codehighlighter1_491_596_Open_Image.style.display='inline'; Codehighlighter1_491_596_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_491_596_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_491_596_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080">39</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">long</span>
						<span style="COLOR: #000000"> m,tmp;<br /></span>
						<span style="COLOR: #008080">40</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">(n</span>
						<span style="COLOR: #000000">&gt;=</span>
						<span style="COLOR: #000000">50025002</span>
						<span style="COLOR: #000000">)<br /></span>
						<span style="COLOR: #008080">41</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        m</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">n</span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000">5</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">42</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">else</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">43</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_539_583_Open_Image" onclick="this.style.display='none'; Codehighlighter1_539_583_Open_Text.style.display='none'; Codehighlighter1_539_583_Closed_Image.style.display='inline'; Codehighlighter1_539_583_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_539_583_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_539_583_Closed_Text.style.display='none'; Codehighlighter1_539_583_Open_Image.style.display='inline'; Codehighlighter1_539_583_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_539_583_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_539_583_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080">44</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        tmp</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">count_2(n</span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000">2005</span>
								<span style="COLOR: #000000">);<br /></span>
								<span style="COLOR: #008080">45</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        m</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">count_2(tmp);<br /></span>
								<span style="COLOR: #008080">46</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">47</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> m;<br /></span>
						<span style="COLOR: #008080">48</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">49</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p>说一下那个非递归调用的算法吧。<br />把x做为+2005的次数，y作为-5的次数<br />如果n&gt;=50025002，那么不需要做+的操作，所以<br />y-x=1<br />否则n&lt;50025002，就需要先+2005，再-5，x和y同时+1<br />因此，最终y-x=1。<br />所以先将i设为1</p>
		<p>说的有点乱，看一下就明白了。</p>
<img src ="http://www.cppblog.com/ispfcn/aggbug/5037.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ispfcn/" target="_blank">编程之道</a> 2006-04-05 16:47 <a href="http://www.cppblog.com/ispfcn/archive/2006/04/05/5037.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如果简单的实现字符的大小写转换</title><link>http://www.cppblog.com/ispfcn/archive/2006/04/04/4985.html</link><dc:creator>编程之道</dc:creator><author>编程之道</author><pubDate>Tue, 04 Apr 2006 03:16:00 GMT</pubDate><guid>http://www.cppblog.com/ispfcn/archive/2006/04/04/4985.html</guid><wfw:comment>http://www.cppblog.com/ispfcn/comments/4985.html</wfw:comment><comments>http://www.cppblog.com/ispfcn/archive/2006/04/04/4985.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ispfcn/comments/commentRss/4985.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ispfcn/services/trackbacks/4985.html</trackback:ping><description><![CDATA[
		<p>看一下大小写的acsii码的二进制数据</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 src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">a  </span>
				<span style="COLOR: #000000">0110</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">0001</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />A </span>
				<span style="COLOR: #000000">0100</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">0001</span>
		</div>唯一不同的只有第6位，所以如果转换成大写，将第6位改为0；如果转换成小写，将第6位改为1。<br />所以直接对该位异或就可以了<br />也就是与0x20异或，即0010 0000<br />转换方法<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: #008080"> 1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">ctype.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> argc,</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">argv[])<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img id="Codehighlighter1_70_169_Open_Image" onclick="this.style.display='none'; Codehighlighter1_70_169_Open_Text.style.display='none'; Codehighlighter1_70_169_Closed_Image.style.display='inline'; Codehighlighter1_70_169_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_70_169_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_70_169_Closed_Text.style.display='none'; Codehighlighter1_70_169_Open_Image.style.display='inline'; Codehighlighter1_70_169_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_70_169_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_70_169_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> c;<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(;(c</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">getchar())</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">EOF;)<br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img id="Codehighlighter1_108_156_Open_Image" onclick="this.style.display='none'; Codehighlighter1_108_156_Open_Text.style.display='none'; Codehighlighter1_108_156_Closed_Image.style.display='inline'; Codehighlighter1_108_156_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_108_156_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_108_156_Closed_Text.style.display='none'; Codehighlighter1_108_156_Open_Image.style.display='inline'; Codehighlighter1_108_156_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_108_156_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_108_156_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(isalpha(c))<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            c </span><span style="COLOR: #000000">^=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0x20</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        putchar(c);<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><img src ="http://www.cppblog.com/ispfcn/aggbug/4985.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ispfcn/" target="_blank">编程之道</a> 2006-04-04 11:16 <a href="http://www.cppblog.com/ispfcn/archive/2006/04/04/4985.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>孙鑫VC++讲座笔记-(5)文本编程 </title><link>http://www.cppblog.com/ispfcn/archive/2006/04/04/4983.html</link><dc:creator>编程之道</dc:creator><author>编程之道</author><pubDate>Tue, 04 Apr 2006 03:09:00 GMT</pubDate><guid>http://www.cppblog.com/ispfcn/archive/2006/04/04/4983.html</guid><wfw:comment>http://www.cppblog.com/ispfcn/comments/4983.html</wfw:comment><comments>http://www.cppblog.com/ispfcn/archive/2006/04/04/4983.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ispfcn/comments/commentRss/4983.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ispfcn/services/trackbacks/4983.html</trackback:ping><description><![CDATA[1,创建插入符：<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: #008080">1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> CreateSolidCaret( </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> nWidth, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> nHeight );</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">创建插入符</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> CreateCaret( CBitmap</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> pBitmap );</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">创建位图插入符</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> ShowCaret( );</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">显示插入符</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> HideCaret( );</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">隐藏插入符</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> PASCAL SetCaretPos( POINT point );</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">移动插入符号</span></div>说明：<br />1）创建插入符要在窗口创建完成之后，CreateSolidCaret函数创建的插入符被初始化为隐藏，所以需要调用ShowCaret()将其显示。<br />2）使用CreateCaret函数创建位图插入符的时候，不能使用局部的位图对象关联位图资源。（与资源相关联的C++对象，当它析构的时候会同时把与它相关联的资源销毁。） 
<p>2，获取当前字体信息的度量：CDC::GetTextMetrics</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 src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">BOOL GetTextMetrics( LPTEXTMETRIC lpMetrics ) </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">;</span></div><p>说明：<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 id="Codehighlighter1_29_594_Open_Image" onclick="this.style.display='none'; Codehighlighter1_29_594_Open_Text.style.display='none'; Codehighlighter1_29_594_Closed_Image.style.display='inline'; Codehighlighter1_29_594_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_29_594_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_29_594_Closed_Text.style.display='none'; Codehighlighter1_29_594_Open_Image.style.display='inline'; Codehighlighter1_29_594_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #000000">typedef </span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000"> tagTEXTMETRIC </span><span id="Codehighlighter1_29_594_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_29_594_Open_Text"><span style="COLOR: #000000">{  </span><span id="Codehighlighter1_32_39_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">/**/</span><span id="Codehighlighter1_32_39_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> tm </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">  tmHeight;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">字体高度。Specifies the height (ascent + descent) of characters.</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">  tmAscent;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">基线以上的字体高度</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">  tmDescent;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">基线以下的字体高度</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">  tmInternalLeading;<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">  tmExternalLeading;<br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">  tmAveCharWidth;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">字符平均宽度</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">  tmMaxCharWidth;<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">  tmWeight;<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    BYTE tmItalic;<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    BYTE tmUnderlined;<br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    BYTE tmStruckOut;<br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    BYTE tmFirstChar;<br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    BYTE tmLastChar;<br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    BYTE tmDefaultChar;<br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    BYTE tmBreakChar;<br /></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    BYTE tmPitchAndFamily;<br /></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    BYTE tmCharSet;<br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">  tmOverhang;<br /></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">  tmDigitizedAspectX;<br /></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">  tmDigitizedAspectY;<br /></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"> TEXTMETRIC;<br /></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><br /><p>3，OnDraw函数:<br />virtual void OnDraw( CDC* pDC )<br />当窗口（从无到有或尺寸大小改变等）要求重绘的时候，会发送WM_PAIN消息，调用OnDraw函数进行重绘。</p><p>4,获取字符串的高度和宽度（区别字符串的长度）：<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 src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">CDC::GetTextExtent<br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />CSize GetTextExtent( LPCTSTR lpszString, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> nCount ) </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />CSize GetTextExtent( </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> CString</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000"> str ) </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">说明：</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">The CSize </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">is</span><span style="COLOR: #000000"> similar to the Windows SIZE structure。<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img id="Codehighlighter1_216_272_Open_Image" onclick="this.style.display='none'; Codehighlighter1_216_272_Open_Text.style.display='none'; Codehighlighter1_216_272_Closed_Image.style.display='inline'; Codehighlighter1_216_272_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_216_272_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_216_272_Closed_Text.style.display='none'; Codehighlighter1_216_272_Open_Image.style.display='inline'; Codehighlighter1_216_272_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />typedef </span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000"> tagSIZE </span><span id="Codehighlighter1_216_272_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_216_272_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> cx;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">the x-extent </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> cy;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">the y-extent </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000"> SIZE;<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div>5，路径层：<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: #008080">1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">BOOL BeginPath( );<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">在这作图定义路径层剪切区域</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">BOOL EndPath( );<br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />BOOL SelectClipPath( </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> nMode );</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">调用这个函数来使当前路径层剪切区域与新剪切区域进行互操作。   <br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">在这覆盖作图（包含前定义的路径层区域）定义新的剪切区域<br /></span><span style="COLOR: #008080">6</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><p>说明：<br />1）SelectClipPath Selects the current path as a clipping region for the device context, combining the new region with any existing clipping region by using the specified mode. The device context identified must contain a closed path.<br />////<br />nMode：RGN_AND，RGN_COPY，RGN_DIFF，RGN_OR，RGN_XOR<br />RGN_AND   The new clipping region includes the intersection (overlapping areas) of the current clipping region and the current path.<br />RGN_COPY   The new clipping region is the current path.<br />RGN_DIFF   The new clipping region includes the areas of the current clipping region, and those of the current path are excluded.<br />RGN_OR   The new clipping region includes the union (combined areas) of the current clipping region and the current path.<br />RGN_XOR   The new clipping region includes the union of the current clipping region and the current path, but without the overlapping areas.<br />2）应用：当作图的时候，如果想要在整幅图形其中的某个部分和其它部分有所区别，我们可以把这部分图形放到路径层当中，然后指定调用指定互操作模式调用SelectClipPath( int nMode )函数来使路径层和覆盖在其上新绘图剪切区域进行互操作，达到特殊效果。</p><p>6，关于文本字符串一些函数：<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 src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">COLORREF GetBkColor( ) </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">得到背景颜色</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> COLORREF SetBkColor( COLORREF crColor );</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置背景颜色</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">BOOL SetTextBkColor( COLORREF cr );</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置文本背景颜色</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> COLORREF SetTextColor( COLORREF crColor );</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置文本颜色</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> BOOL TextOut( </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> x, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> y, LPCTSTR lpszString, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> nCount );</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">输出文本</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">6</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">BOOL TextOut( </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> x, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> y, </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> CString</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000"> str );<br /></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />CString Left( </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> nCount ) </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">得到字符串左边nCount个字符</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">8</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> GetLength( ) </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">得到字符串长度<br /></span><span style="COLOR: #008080">9</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><br />7,字体CFont::CFont <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: #008080"> 1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">CFont( );</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">构造函数<br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Constructs a CFont object. The resulting object must be initialized with CreateFont, CreateFontIndirect, CreatePointFont, or CreatePointFontIndirect before it can be used.</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">选用字体事例代码组：<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />CClientDC dc(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />CFont font;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">构造字体对象</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">font.CreatePointFont(</span><span style="COLOR: #000000">300</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">华文行楷</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,NULL);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">初始化字体对象，与字体资源相关联</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">CFont </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pOldFont</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">dc.SelectObject(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">font);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">将新字体选入DC</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/dot.gif" /><br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />dc.SelectObject(pOldFont);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">恢复原字体<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div>说明：<br />1）构造字体对象时候，必须初始化。（初始化是将字体对象与字体资源相关联）。<br />2）初始化对象时候，选用的字体也可以是系统字体，但不一定都有效，据测试选用。 
<p>8，在MFC中CEditView 和 cRichEditView类已经完成了初步的文字处理。可以让应用程序的View类以CEditView 和 cRichEditView类为基类。</p><p>9，平滑变色<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 src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">CDC::TextOut()是一个字母一个字母的输出，达不到平滑效果。<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />CDC::DrawText()：将文字的输出局限于一个矩形区域，超出矩形区域的文字都被截断。利用这一特点，可每隔些时间增加矩形大小，从而可实现人眼中的平滑效果。<br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />CWnd::SetTimer()：设置定时器。按设定的时间定时发送WM_TIMER消息。</span></div><br /><p>说明：<br />UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) );<br />//nIDEvent定时器标示，nElapse消息发送间隔时间，void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD)设置回调函数，如果设置则由设置的回调函数处理WM_TIMER消息，如果没有设置回调函数设为NULL，这发送的WM_TIMER消息压入消息队列，交由相关联的窗口处理（添加WM_TIMER消息处理函数OnTimer()）。</p><p>afx_msg void OnTimer( UINT nIDEvent );<br />//响应WM_TIMER消息，nIDEvent为消息对应定时器标示（可以设置不同的定时器发送WM_TIMER消息）</p><p></p><p><br />问题：<br />1，在CCareView类中添加WM_CREATE消息响应函数OnCreate(),WM_CREATE消息是在什么时候被检查到而被响应的呢？<br />（猜测：添加WM_CREATE消息后，消息被压入消息队列，然后经过消息循环进行分发到具体窗口，从而进行响应）</p><p>2,现有一文本文件内容已经读入串STR中，要求在视图客户区按原先文本文件中的格式输出。<br />问题是，利用CDC的TextOut()来在CView类派生类窗口中输出串时，忽略了串中的TAB、回车换行等格式，无论串有多长均在一行上输出。<br />这其中是CDC类成员函数TextOut()忽略串中格式的，还是CView类派生类窗口设置从中做怪呢？怎么解决？</p><img src ="http://www.cppblog.com/ispfcn/aggbug/4983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ispfcn/" target="_blank">编程之道</a> 2006-04-04 11:09 <a href="http://www.cppblog.com/ispfcn/archive/2006/04/04/4983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>孙鑫VC++讲座笔记-(6)菜单编程 </title><link>http://www.cppblog.com/ispfcn/archive/2006/04/04/4984.html</link><dc:creator>编程之道</dc:creator><author>编程之道</author><pubDate>Tue, 04 Apr 2006 03:09:00 GMT</pubDate><guid>http://www.cppblog.com/ispfcn/archive/2006/04/04/4984.html</guid><wfw:comment>http://www.cppblog.com/ispfcn/comments/4984.html</wfw:comment><comments>http://www.cppblog.com/ispfcn/archive/2006/04/04/4984.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ispfcn/comments/commentRss/4984.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ispfcn/services/trackbacks/4984.html</trackback:ping><description><![CDATA[
		<p>1,弹出菜单（Pop-up)是不能用来作命令响应的。</p>
		<p>2，MFC中菜单项消息如果利用ClassWizard来对菜单项消息分别在上述四个类中进行响应，则菜单消息传递顺序：View类--Doc类--CMainFrame类--App类。菜单消息一旦在其中一个类中响应则不再在其它类中查找响应函数。<br />具体：<br />当点击一个菜单项的时候，最先接受到菜单项消息的是CMainFrame框架类，CMainFrame框架类将会把菜单项消息交给它的子窗口View类，由View类首先进行处理；如果View类检测到没对该菜单项消息做响应，则View类把菜单项消息交由文档类Doc类进行处理；如果Doc类检测到Doc类中也没对该菜单项消息做响应，则Doc类又把该菜单项消息交还给View类，由View类再交还给CMainFrame类处理。如果CMainFrame类查看到CMainFrame类中也没对该消息做响应，则最终交给App类进行处理。</p>
		<p>3，消息的分类：标准消息，命令消息，通告消息。<br />[标准消息]：除WM_COMMAND之外，所有以WM_开头的消息。<br />[命令消息]：来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。<br />在MFC中，通过菜单项的标识（ID）来区分不同的命令消息；在SDK中，通过消息的wParam参数识别。<br />[通告消息]：由控件产生的消息，例如，按钮的单击，列表框的选择等均产生此类消息，为的是向其父窗口（通常是对话框）通知事件的发生。这类消息也是以WM_COMMAND形式呈现。<br />说明：<br />1）从CWnd派生的类，都可以接收到[标准消息]。<br />2）从CCmdTarget派生的类，都可以接收到[命令消息]和[通告消息]。</p>
		<p>4，一个菜单拦可以有若干个子菜单，一个子菜单又可以有若干个菜单项等。对菜单栏的子菜单由左至右建立从0开始的索引。对特定子菜单的菜单项由上至下建立了从0开始的索引。访问子菜单和菜单项均可以通过其索引或标识（如果有标识的话）进行。<br />相关重要函数：<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 src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">CMenu</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000"> GetMenu( ) ;</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">CWnd::GetMenu得到窗口菜单栏对象指针。</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #008000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">CMenu</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000"> GetSubMenu(  ) ;</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">CMenu::GetSubMenu获得指向弹出菜单对象指针</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">3</span>
				<span style="COLOR: #008000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">UINT CheckMenuItem( );</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">CMenu::CheckMenuItem Adds check marks to or removes check marks from menu items in the pop-up menu. </span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">4</span>
				<span style="COLOR: #008000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">BOOL SetDefaultItem();</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">CMenu::SetDefaultItem Sets the default menu item for the specified menu.</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">5</span>
				<span style="COLOR: #008000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">BOOL SetMenuItemBitmaps( );</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">CMenu::SetMenuItemBitmaps 设置位图标题菜单。</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">6</span>
				<span style="COLOR: #008000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">UINT EnableMenuItem();</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">CMenu::EnableMenuItem使菜单项有效，无效，或变灰。</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">7</span>
				<span style="COLOR: #008000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">BOOL SetMenu( CMenu</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000"> pMenu );</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">CWnd::SetMenu在当前窗口上设置新菜单或移除菜单。</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">8</span>
				<span style="COLOR: #008000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">HMENU Detach( );</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">CMenu::Detach Detaches a Windows menu from a CMenu object and returns the handle. <br /></span>
				<span style="COLOR: #008080">9</span>
				<span style="COLOR: #008000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<br />说明：<br />1）在计算子菜单菜单项的索引的时候，分隔栏符也算索引的。<br />2）int GetSystemMetrics()获取系统信息度量。可以用它来获取菜单标题的尺寸从而设置位图标题菜单中位图的大小。<br />3）在MFC中MFC为我们提供了一套命令更新机制，所有菜单项的更新都是由这套机制来完成的。所以要想利用CMenu::EnableMenuItem来自己控制菜单使用或不使用变灰等，必须要在CMainFrame的构造函数中将变量m_bAutoMenuEnable设置为FALSE。<br />4）Create a CMenu object on the stack frame as a local, then call CMenu’s member functions to manipulate the new menu as needed. Next, call CWnd::SetMenu to set the menu to a window, followed immediately by a call to the CMenu object’s Detach member function. The CWnd::SetMenu member function sets the window’s menu to the new menu, causes the window to be redrawn to reflect the menu change, and also passes ownership of the menu to the window. The call to Detach detaches the HMENU from the CMenu object, so that when the local CMenu variable passes out of scope, the CMenu object destructor does not attempt to destroy a menu it no longer owns. The menu itself is automatically destroyed when the window is destroyed.<br />5）You can use the LoadMenuIndirect member function to create a menu from a template in memory, but a menu created from a resource by a call to LoadMenu is more easily maintained, and the menu resource itself can be created and modified by the menu editor.<br />6）EXAMPLE：<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: #008080">1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">CMenu menu;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">定义为局部对象</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">menu.LoadMenu(IDR_MAINFRAME);<br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />SetMenu(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">menu);<br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />menu.Detach();</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 这里menu对象作为一个局部对象。使用Detach()从menu对象中分离窗口菜单句柄，从而当menu对象析构的时候窗口菜单资源不随之销毁。<br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><p>5，命令更新机制：<br />菜单项状态的维护是依赖于CN_UPDATE_COMMAND_UI消息，谁捕获CN_UPDATE_COMMAND_UI消息，MFC就在其中创建一个CCmdUI对象。<br />在后台操作系统发出WM_INITMENUPOPUP消息，然后由MFC的基类如CFrameWnd接管并创建一个CCmdUI对象和第一个菜单项相关联，调用对象成员函数DoUpdate()（注：这个函数在MSDN中没有找到说明）发出CN_UPDATE_COMMAND_UI消息，这条消息带有指向CCmdUI对象的指针。此后同一个CCmdUI对象又设置为与第二个菜单项相关联，这样顺序进行，直到完成所有菜单项。<br />更新命令UI处理程序仅应用于弹出式菜单项上的项目，不能应用于永久显示的顶级菜单项目。<br />说明：<br />1）可以手工或用ClassWizard来给菜单项添加UPDATE_COMMAND_UI消息响应，利用响应函数中传进来的CCmdUI对象指针可完成设置菜单项可使用，不可使用，变灰，设置标记菜单等操作。</p><p>6，如果要想让工具栏上的某个图标与菜单项的某个菜单相关联，只需要将图标的ID设置为该菜单项的ID。<br />工具栏图标的索引记数顺序是：从做至右从0开始，分隔符也算索引号。</p><p>7,利用向项目中添加VC的POPMENU控件：Project-&gt;Add to Project-&gt;Components and Controls..<br />系统增加的内容：A，一个菜单资源；B，在派生View类中增加了OnContextMenu()函数<br />说明：<br />1）CWnd::OnContextMenu Called by the framework when the user has clicked the right mouse button (right clicked) in the window. You can process this message by displaying a context menu using the TrackPopupMenu.<br />2）BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL );<br />//CMenu::TrackPopupMenu Displays a floating pop-up menu at the specified location and tracks the selection of items on the pop-up menu. A floating pop-up menu can appear anywhere on the screen.</p><p>8，利用调用TrackPopupMenu函数，手工添加弹出菜单：<br />1）用资源管理器添加一个菜单资源<br />2）在鼠标右键消息响应函数中，加载菜单资源，并获得要显示的子菜单指针，并用该指针调用TrackPopupMenu函数便完成任务（但要注意：鼠标响应函数传进来的坐标是客户区坐标，而TrackPopupMenu函数中使用的是屏幕坐标，在调用TrackPopupMenu前要调用ClientToScreen客户区坐标到屏幕坐标的转换）<br />事例代码：<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 src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">CMenu menu;<br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />menu.LoadMenu(IDR_MENU1);<br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />CMenu </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pPopup</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">menu.GetSubMenu(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />ClientToScreen(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">point);<br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />pPopup</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">TrackPopupMenu(TPM_LEFTALIGN </span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> TPM_RIGHTBUTTON, point.x, point.y,</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">说明：</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">CWnd::ClientToScreen(..);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">将一个坐标点或一个矩形区域坐标转换成屏幕坐标。</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">CMenu::TrackPopupMenu(..);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">在指定位置以指定的方式显示弹出菜单。</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">CWnd::ScreenToClient(..);<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Converts the screen coordinates of a given point or rectangle on the display to client coordinates. <br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><br /><p>9,当弹出菜单属于框架窗口的时候（可在TrackPopupMenu函数参数中设置），弹出菜单上的消息，在路由的时候，仍然遵循View-DOC-MainFrame-APP的响应顺序。</p><p>10，动态菜单编程：<br />所有的资源对象都有一个数据成员保存了资源的句柄。<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 src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">CMenu::AppendMenu </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Appends a new item to the end of a menu.</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">CMenu::CreatePopupMenu </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Creates an empty pop-up menu and attaches it to a CMenu object.</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">CMenu::InsertMenu <br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Inserts a new menu item at the position specified by nPosition and moves other items down the menu. </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">CMenu::GetSubMenu </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Retrieves a pointer to a pop-up menu.</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">6</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">CWnd::GetMenu </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Retrieves a pointer to the menu for this window.</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">7</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">CMenu::DeleteMenu </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Deletes an item from the menu. <br /></span><span style="COLOR: #008080">8</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><br /><p>11，手动给动态菜单项添加响应函数：<br />在Resource.h中可以添加资源的ID<br />在头文件中写消息函数原型<br />在代码文件中添加消息映射和添加消息响应函数<br />说明：<br />可以先创建一个临时的菜单项，设置它的ID和动态菜单项的一致，然后对它用向导进行消息响应，然后删除临时菜单。<br />再在代码文件中把消息映射放到宏外（注意一定要放到宏外面，因为CLASSWIZARD发现菜单删除了，同时要把其宏对里的消息映射也删除掉的）</p><p>12，CWnd::DrawMenuBar <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 src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Redraws the menu bar. If a menu bar is changed after Windows has created the window, call this function to draw the changed menu bar</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />CWnd::GetParent </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">get a pointer to a child window’s parent window (if any). </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">CWnd::Invalidate </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">注意其参数的作用<br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><p>13，集合类：<br />CStringArray，CStringArray，CDWordArray，CPtrArray，CStringArray，CUIntArray，CWordArray<br />其中成员函数：<br />CArray::GetAt <br />CArray::Add</p><p>14,命令消息是到OnCommand函数的时候完成路由的。<br />由于CWnd::OnCommand 是个虚函数，可以在框架类中重写OnCommand函数，从而可以截获菜单消息使它不再往下（VIEW类）路由。<br />例：<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 src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam) <br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img id="Codehighlighter1_58_604_Open_Image" onclick="this.style.display='none'; Codehighlighter1_58_604_Open_Text.style.display='none'; Codehighlighter1_58_604_Closed_Image.style.display='inline'; Codehighlighter1_58_604_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_58_604_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_58_604_Closed_Text.style.display='none'; Codehighlighter1_58_604_Open_Image.style.display='inline'; Codehighlighter1_58_604_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_58_604_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_58_604_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> TODO: Add your specialized code here and/or call the base class</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> MenuCmdId</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">LOWORD(wParam);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">取命令ID</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000"> CMenu2View </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pView</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(CMenu2View</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)GetActiveView();</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">获取当前VIEW类指针</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(MenuCmdId</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">IDM_PHONE1 </span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000"> MenuCmdId</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">IDM_PHONE1</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">pView</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_strArray.GetSize())</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">消息范围判断</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #008000"><img id="Codehighlighter1_316_498_Open_Image" onclick="this.style.display='none'; Codehighlighter1_316_498_Open_Text.style.display='none'; Codehighlighter1_316_498_Closed_Image.style.display='inline'; Codehighlighter1_316_498_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_316_498_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_316_498_Closed_Text.style.display='none'; Codehighlighter1_316_498_Open_Image.style.display='inline'; Codehighlighter1_316_498_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_316_498_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_316_498_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  CClientDC dc(pView);<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  dc.TextOut(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,pView</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_strArray.GetAt(MenuCmdId</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">IDM_PHONE1));<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> TRUE; <br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">函数返回，避免调用CFrameWnd::OnCommand函数，在CFrameWnd::OnCommand中截获的消息会交由VIEW类处理</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="COLOR: #000000"> }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> CFrameWnd::OnCommand(wParam, lParam);<br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">调用基类OnCommand函数，在CFrameWnd::OnCommand中截获的消息会交由VIEW类处理</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><br />MSDN说明：<br />virtual BOOL OnCommand( WPARAM wParam, LPARAM lParam );<br />//The framework calls this member function when the user selects an item from a menu, when a child control sends a notification message, or when an accelerator keystroke is translated. <br />OnCommand processes the message map for control notification and ON_COMMAND entries, and calls the appropriate member function. <br />Override this member function in your derived class to handle the WM_COMMAND message. An override will not process the message map unless the base class OnCommand is called. 
<p>15，LOWORD与HIWORD宏<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 src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">WORD LOWORD(<br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  DWORD dwValue  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> value from which low-order word is retrieved</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />WORD HIWORD(<br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  DWORD dwValue  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> value from which high-order word is retrieved</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">The LOWORD macro retrieves the low-order word from the given 32-bit value. <br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">The HIWORD macro retrieves the high-order word from the given 32-bit value. </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div>16，CFrameWnd::GetActiveView <br />CView* GetActiveView( ) const;//获取当前视窗口指针（单文档框架中） 
<p>17，源文件是单独参与编译的。</p><img src ="http://www.cppblog.com/ispfcn/aggbug/4984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ispfcn/" target="_blank">编程之道</a> 2006-04-04 11:09 <a href="http://www.cppblog.com/ispfcn/archive/2006/04/04/4984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>孙鑫VC++讲座笔记-(4)MFC消息映射机制的剖析 </title><link>http://www.cppblog.com/ispfcn/archive/2006/04/04/4982.html</link><dc:creator>编程之道</dc:creator><author>编程之道</author><pubDate>Tue, 04 Apr 2006 03:08:00 GMT</pubDate><guid>http://www.cppblog.com/ispfcn/archive/2006/04/04/4982.html</guid><wfw:comment>http://www.cppblog.com/ispfcn/comments/4982.html</wfw:comment><comments>http://www.cppblog.com/ispfcn/archive/2006/04/04/4982.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ispfcn/comments/commentRss/4982.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ispfcn/services/trackbacks/4982.html</trackback:ping><description><![CDATA[1，消息响应函数：（例：在CDrawView类响应鼠标左键按下消息）<br /> 1）在头文件(DrawView.h)中声明消息响应函数原型。<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: #008080">1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000">{{AFX_MSG(CDrawView)   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">注释宏</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">afx_msg </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> OnLButtonDown(UINT nFlags, CPoint point);<br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">}}AFX_MSG   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">注释宏</span></div>说明：<br />在注释宏之间的声明在VC中灰色显示。afx_msg宏表示声明的是一个消息响应函数。<br /> 2）在源文件（DrawView.cpp)中进行消息映射。<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: #008080">1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">BEGIN_MESSAGE_MAP(CDrawView, CView)<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">{{AFX_MSG_MAP(CDrawView)</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000"> ON_WM_LBUTTONDOWN()<br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">}}AFX_MSG_MAP<br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Standard printing commands</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">6</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000"> ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)<br /></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /> ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)<br /></span><span style="COLOR: #008080">8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /> ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)<br /></span><span style="COLOR: #008080">9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />END_MESSAGE_MAP()</span></div>说明：<br />在宏BEGIN_MESSAGE_MAP()与END_MESSAGE_MAP()之间进行消息映射。<br />宏ON_WM_LBUTTONDOWN()把消息WM_LBUTTONDOWN与它的响应函数OnLButtonDown（）相关联。这样一旦有消息的产生，就会自动调用相关联的消息响应函数去处理。<br />宏ON_WM_LBUTTONDOWN()定义如下：<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: #008080">1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000"> ON_WM_LBUTTONDOWN() \</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img id="Codehighlighter1_32_155_Open_Image" onclick="this.style.display='none'; Codehighlighter1_32_155_Open_Text.style.display='none'; Codehighlighter1_32_155_Closed_Image.style.display='inline'; Codehighlighter1_32_155_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_32_155_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_32_155_Closed_Text.style.display='none'; Codehighlighter1_32_155_Open_Image.style.display='inline'; Codehighlighter1_32_155_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /> </span><span id="Codehighlighter1_32_155_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_32_155_Open_Text"><span style="COLOR: #000000">{ WM_LBUTTONDOWN, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, AfxSig_vwp, \<br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />  (AFX_PMSG)(AFX_PMSGW)(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> (AFX_MSG_CALL CWnd::</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)(UINT, CPoint))</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">OnLButtonDown }</span></span><span style="COLOR: #000000">,<br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">）源文件中进行消息响应函数处理。（DrawView.cpp中自动生成OnLButtonDown函数轮廓，如下）<br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> CDrawView::OnLButtonDown(UINT nFlags, CPoint point) <br /></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img id="Codehighlighter1_274_379_Open_Image" onclick="this.style.display='none'; Codehighlighter1_274_379_Open_Text.style.display='none'; Codehighlighter1_274_379_Closed_Image.style.display='inline'; Codehighlighter1_274_379_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_274_379_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_274_379_Closed_Text.style.display='none'; Codehighlighter1_274_379_Open_Image.style.display='inline'; Codehighlighter1_274_379_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_274_379_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_274_379_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> TODO: Add your message handler code here and/or call default</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">8</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000"> CView::OnLButtonDown(nFlags, point);<br /></span><span style="COLOR: #008080">9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>说明：<br />可见当增加一个消息响应处理，在以上三处进行了修改。可在消息响应函数里添加消息处理代码完成对消息的响应、处理。 
<p>2，消息响应的方式：<br />1）在基类中针对每种消息做一个虚函数，当子类对消息响应时候，只要在子类中重写这个虚函数即可。缺点：MFC类派生层次很多，如果在基类对每个消息进行虚函数处理，那么从基类派生的每个子类都将背负一个庞大的虚表，这样浪费内存，故MFC没有采取这中方式而采取消息映射方式。<br />2）消息映射方式：MFC在后台维护了一个句柄和C++对象指针对照表，当收到一个消息后，通过消息结构里资源句柄（查对照表）就可找到与它对应的一个C++对象指针，然后把这个指针传给基类，基类利用这个指针调用WindowProc()函数对消息进行处理，WindowProc()函数中调用OnWndMsg()函数，真正的消息路由及处理是由OnWndMsg()函数完成的。由于WindowProc()和OnWndMsg()都是虚函数，而且是用派生类对象指针调用的，由多态性知最总终调用子类的。在OnWndMsg()函数处理的时候，根据消息种类去查找消息映射，判断所发的消息有没有响应函数，具体方式是到相关的头文件和源文件中寻找消息响应函数声明（从注释宏//{{AFX_MSG(CDrawView)...//}}AFX_MSG之间寻找），消息映射（从宏BEGIN_MESSAGE_MAP(...)....END_MESSAGE_MAP()之间寻找），最终找到对应的消息处理函数。当然，如果子类中没有对消息进行处理，则消息交由基类处理。<br />说明：<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 src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> BOOL OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> pResult);</span></div><p>二，有关绘图</p><p>1，使用SDK获取DC句柄：<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 src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">HDC hdc;<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />hdc</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">::GetDc(m_hWnd);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">获取DC句柄</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);<br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />LineTo(hdc,point.x,point.y);<br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />::ReleaseDC(m_hWnd,hdc);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">释放DC</span></div><br />2，利用CDC类指针和CWin类成员函数获取DC。<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: #008080">1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">CDC </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">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />pDC</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">MoveTo(m_ptOrigin);<br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />pDC</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">LineTo(point);<br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />ReleaseDC(pDC);</span></div>3，利用CClientDC对象。（CClientDC类从CDC类派生来的）<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: #008080">1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">CClientDC dc(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />dc.MoveTo(m_ptOrigin);<br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />dc.LineTo(point);</span></div>说明：<br />The CClientDC class is derived from CDC and takes care of calling the Windows functions GetDC at construction time and ReleaseDC at destruction time. This means that the device context associated with a CClientDC object is the client area of a window.<br />4，利用CWindowDC对象。（CWindowDC类从CDC类派生来的）<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: #008080">1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">CWindowDC dc(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">);</span><span style="COLOR: #008000">//<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">dc.MoveTo(m_ptOrigin);<br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />dc.LineTo(point);</span></div>说明：<br />The CWindowDC class is derived from CDC. It calls the Windows functionsGetWindowDC at construction time andReleaseDC at destruction time. This means that a CWindowDC object accesses the entire screen area of a CWnd (both client and nonclient areas).<br /><p>5，GetParent()得到父窗口指针；GetDesktopWindow()得到屏幕窗口指针。</p><p>6，利用画笔改变线条颜色和类型：<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 src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">CPen pen(PS_DOT,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,RGB(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">255</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">));</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">构造画笔对象</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">CClientDC dc(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">);CPen </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pOldPen</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">dc.SelectObject(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">pen);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">将画笔选入DC</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">dc.MoveTo(m_ptOrigin);<br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />dc.LineTo(point);<br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />dc.SelectObject(pOldPen);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">恢复先前的画笔</span></div><br />7，使用画刷（通常利用画刷去填充矩形区域）：<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: #008080"> 1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000">使用单色画刷</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">CBrush brush(RGB(</span><span style="COLOR: #000000">255</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">));</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">构造画刷对象</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">CClientDC dc(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />dc.FillRect(CRect(m_ptOrigin,point),</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">brush);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">用指定的画刷去填充矩形区域<br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">使用位图画刷</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">CBitmap bitmap;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">构造位图对象（使用前需要初试化）</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">bitmap.LoadBitmap(IDB_BITMAP1);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">初试化位图对象</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">CBrush brush(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">bitmap);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">构造位图画刷</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">CClientDC dc(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />dc.FillRect(CRect(m_ptOrigin,point),</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">brush);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">用指定的位图画刷去填充矩形区域<br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">使用透明画刷</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">CBrush </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pBrush</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">获取透明画刷对象指针</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">CClientDC dc(</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.cppblog.com/images/OutliningIndicators/None.gif" align="top" />CBrush </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pOldBrush</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">dc.SelectObject(pBrush);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">将透明画刷选入DC</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">17</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">dc.Rectangle(CRect(m_ptOrigin,point));<br /></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />dc.SelectObject(pOldBrush);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">释放透明画刷</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><br />说明：<br />The GetStockObject function retrieves a handle to one of the predefined stock pens, brushes, fonts, or palettes. <br />HGDIOBJ GetStockObject(<br />  int fnObject   // type of stock object<br />); 
<p>Returns a pointer to a CBrush object when given a handle to a Windows HBRUSH object. <br />static CBrush* PASCAL FromHandle( HBRUSH hBrush );//FromHandle是一个静态方法，故可用CBrush::FromHandle()形式调用。<br />注意点：<br />1）静态方法不属于某一个具体对象，而属于类本身，在类加载的时候就已经为类静态方法分配了代码去，故可用CBrush::FromHandle()形式调用。<br />2）静态方法中，不能引用非静态的数据成员和方法。<br />3）静态数据成员需要在类外单独做初始化，形式如： 变量类型 类名::变量名=初始值;</p><p>8，CDC::SetROP2方法：<br />int SetROP2( int nDrawMode );<br />Sets the current drawing mode. </p><img src ="http://www.cppblog.com/ispfcn/aggbug/4982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ispfcn/" target="_blank">编程之道</a> 2006-04-04 11:08 <a href="http://www.cppblog.com/ispfcn/archive/2006/04/04/4982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>孙鑫VC++讲座笔记-(1)Windows程序内部运行机制</title><link>http://www.cppblog.com/ispfcn/archive/2006/04/04/4979.html</link><dc:creator>编程之道</dc:creator><author>编程之道</author><pubDate>Tue, 04 Apr 2006 03:07:00 GMT</pubDate><guid>http://www.cppblog.com/ispfcn/archive/2006/04/04/4979.html</guid><wfw:comment>http://www.cppblog.com/ispfcn/comments/4979.html</wfw:comment><comments>http://www.cppblog.com/ispfcn/archive/2006/04/04/4979.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ispfcn/comments/commentRss/4979.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ispfcn/services/trackbacks/4979.html</trackback:ping><description><![CDATA[1,windows程序设计是种事件驱动方式的程序设计，主要基于消息的。当用户需要完成某种功能时，需要调用OS某种支持，然后OS将用户的需要包装成消息，并投入到消息队列中，最后应用程序从消息队列中取走消息并进行响应。<br />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: #008080">1</span><img id="Codehighlighter1_22_253_Open_Image" onclick="this.style.display='none'; Codehighlighter1_22_253_Open_Text.style.display='none'; Codehighlighter1_22_253_Closed_Image.style.display='inline'; Codehighlighter1_22_253_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_22_253_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_22_253_Closed_Text.style.display='none'; Codehighlighter1_22_253_Open_Image.style.display='inline'; Codehighlighter1_22_253_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #000000">typedef </span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000"> tagMSG </span><span id="Codehighlighter1_22_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_22_253_Open_Text"><span style="COLOR: #000000">{     </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> msg </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    HWND   hwnd;     </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">接收消息的窗口句柄。和哪个窗口相关联。</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    UINT   message;  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">消息标识。消息本身是什么。</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    WPARAM wParam;   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">消息的附加信息。具体取决于消息本身。  </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    LPARAM lParam; <br /></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    DWORD  time;     </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">消息投递时间。 </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">7</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    POINT  pt;       </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">消息投递时，光标在屏幕上的位置。 </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">8</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000"> MSG; </span></div><p>3，消息队列：<br />每个应用程序OS都为它建立一个消息队列，消息队列是个先进先出的缓冲区，其中每个元素都是一个消息，OS将生成的每个消息按先后顺序放进消息队列中，应用程序总是取走当前消息队列中的第一条消息，应用程序取走消息后便知道用户的操作和程序的状态，然后对其处理即消息响应，消息响应通过编码实现。</p><p>4，使用VC编程除了良好的C基础外还需要掌握两方面：<br />一，消息本身。不同消息所代表的用户操作和应用程序的状态。<br />二，对于某个特定的消息来说，要让OS执行某个特定的功能去响应消息。</p><p>5，Window程序入口：<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 src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> WINAPI WinMain(<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  HINSTANCE hInstance,  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 当前事例句柄。</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  HINSTANCE hPrevInstance,  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 先前事例句柄。</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  LPSTR lpCmdLine,      </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 命令行指针</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> nCmdShow          </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> （窗口）显示的状态</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">6</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div>说明：WinMain函数是Windows程序入口点函数，由OS调用，当OS启动应用程序的时候，winmain函数的参数由OS传递的。 
<p>6，创建一个完整的窗口需要经过下面四个操作步骤：<br />一，设计一个窗口类；如：WNDCLASS wndcls;<br />二，注册窗口类；    如：RegisterClass(&amp;wndcls);<br />三，创建窗口；      如：CreateWindow(),CreateWindowEX();<br />四，显示及更新窗口。如：ShowWindow(),UpdateWindow();</p><p>说明：创建窗口的时候一定要基于已经注册的窗口类.<br />7，Windows提供的窗口类：<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 id="Codehighlighter1_25_448_Open_Image" onclick="this.style.display='none'; Codehighlighter1_25_448_Open_Text.style.display='none'; Codehighlighter1_25_448_Closed_Image.style.display='inline'; Codehighlighter1_25_448_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_25_448_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_25_448_Closed_Text.style.display='none'; Codehighlighter1_25_448_Open_Image.style.display='inline'; Codehighlighter1_25_448_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #000000">typedef </span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000"> _WNDCLASS </span><span id="Codehighlighter1_25_448_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_25_448_Open_Text"><span style="COLOR: #000000">{ <br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    UINT    style;        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">窗口的类型</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    WNDPROC lpfnWndProc;  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">窗口过程函数指针（回调函数）</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">     cbClsExtra; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">窗口类附加字节，为该类窗口所共享。通常0。</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">     cbWndExtra; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">窗口附加字节。通常设为0。</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    HANDLE  hInstance;  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">当前应用程序事例句柄。</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    HICON   hIcon;      </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">图标句柄 LoadIcon();</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    HCURSOR hCursor;    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">光标句柄 LoadCursor();</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    HBRUSH  hbrBackground; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">画刷句柄 (HBRUSH)GetStockObject();</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    LPCTSTR lpszMenuName;  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">菜单名字</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    LPCTSTR lpszClassName; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">类的名字 </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000"> WNDCLASS; <br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><br />8,窗口类注册：<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: #008080">1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">ATOM RegisterClass(<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  CONST WNDCLASS </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">lpWndClass   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> address of structure with class <br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />                               </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> data</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">);</span></div><br />9，创建窗口：<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: #008080"> 1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">HWND CreateWindow(<br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  LPCTSTR lpClassName,  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> pointer to registered class name</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  LPCTSTR lpWindowName, </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> pointer to window name</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  DWORD dwStyle,        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> window style</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> x,                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> horizontal position of window</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> y,                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> vertical position of window</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> nWidth,           </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> window width</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> nHeight,          </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> window height</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  HWND hWndParent,      </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> handle to parent or owner window</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  HMENU hMenu,          </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> handle to menu or child-window identifier</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  HANDLE hInstance,     </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> handle to application instance</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  LPVOID lpParam        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> pointer to window-creation data</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">);</span></div><br />10,显示和更新窗口窗口：<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: #008080">1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">BOOL ShowWindow(<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  HWND hWnd,     </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> handle to window</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> nCmdShow   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> show state of window</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />BOOL UpdateWindow(<br /></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  HWND hWnd   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> handle of window</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">7</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">);</span></div><br />11,消息循环：<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: #008080">1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">MSG msg;<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(GetMessage(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">msg,<img src="http://www.cppblog.com/images/dot.gif" />))    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从消息队列中取出一条消息</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #008000"><img id="Codehighlighter1_55_157_Open_Image" onclick="this.style.display='none'; Codehighlighter1_55_157_Open_Text.style.display='none'; Codehighlighter1_55_157_Closed_Image.style.display='inline'; Codehighlighter1_55_157_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_55_157_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_55_157_Closed_Text.style.display='none'; Codehighlighter1_55_157_Open_Image.style.display='inline'; Codehighlighter1_55_157_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_55_157_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_55_157_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> TranslateMessage(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">msg); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">进行消息（如键盘消息）转换</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000"> DispatchMessage(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">msg); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">分派消息到窗口的回调函数处理,（OS调用窗口回调函数进行处理）。</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">6</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">}</span></span></div>其中：<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: #008080"> 1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000">**The GetMessage function retrieves a message from the calling thread's message queue and places it in the specified structure. <br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">**If the function retrieves a message other than WM_QUIT, the return value is nonzero.If the function retrieves the WM_QUIT message, the return value is zero. If there is an error, the return value is -1. </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />BOOL GetMessage(<br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  LPMSG lpMsg,         </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> address of structure with message</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  HWND hWnd,           </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> handle of window</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  UINT wMsgFilterMin,  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> first message</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  UINT wMsgFilterMax   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> last message</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">The TranslateMessage function translates virtual-key messages into character messages. The character messages are posted to the calling thread's message queue, to be read the next time the thread calls the GetMessage or PeekMessage function. </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">BOOL TranslateMessage(<br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  CONST MSG </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">lpMsg   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> address of structure with message</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">The DispatchMessage function dispatches a message to a window procedure. </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">18</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">LONG DispatchMessage(<br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  CONST MSG </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">lpmsg   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> pointer to structure with message</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">20</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><br />12，窗口过程函数（回调函数）原型：<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: #008080">1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">The WindowProc function </span><span style="COLOR: #0000ff">is</span><span style="COLOR: #000000"> an application</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">defined function that processes messages sent to a window. The WNDPROC type defines a pointer to </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000"> callback function. WindowProc </span><span style="COLOR: #0000ff">is</span><span style="COLOR: #000000"> a placeholder（占位符） </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> the application</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">defined function name. <br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />LRESULT CALLBACK WindowProc(  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">这里WindowProc是个代号名字。</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  HWND hwnd,      </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> handle to window</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  UINT uMsg,      </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> message identifier</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">6</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  WPARAM wParam,  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> first message parameter</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">7</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  LPARAM lParam   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> second message parameter</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">8</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><p>说明：两种函数调用约定（__stdcall 和 __cdecl）：<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 src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000"> CALLBACK    __stdcall </span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">__stdcall 标准调用预定，是PASCAL 调用约定，象DELPHI使用的就是标准调用约定</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000"> WINAPIV     __cdecl  </span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> __cdecl 是C 语言形式的调用约定。</span></div>主要区别：函数参数传递顺序 和 对堆栈的清除上。<br />问题：除了那些可变参数的函数调用外，其余的一般都是__stdcall约定。但 C/C++编译默然的是__cdecl约定。所以如果在VC等环境中调用__stdcall约定的函数，必须要在函数声明的时加上 __stdcall 修饰符，以便对这个函数的调用是使用__stdcall约定（如使用DELPHI编写的DLL时候）。<br />（VC中可通过这途径修改：project|settings..|c/c++|...)<br />在窗口过程函数中通过一组switch语句来对消息进行处理：<br />如：<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: #008080"> 1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">LRESULT CALLBACK WindowProc(  <br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  HWND hwnd,<br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  UINT uMsg,<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  WPARAM wParam,<br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  LPARAM lParam   <br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />)<br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img id="Codehighlighter1_95_528_Open_Image" onclick="this.style.display='none'; Codehighlighter1_95_528_Open_Text.style.display='none'; Codehighlighter1_95_528_Closed_Image.style.display='inline'; Codehighlighter1_95_528_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_95_528_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_95_528_Closed_Text.style.display='none'; Codehighlighter1_95_528_Open_Image.style.display='inline'; Codehighlighter1_95_528_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_95_528_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_95_528_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">switch</span><span style="COLOR: #000000">(uMsg)<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img id="Codehighlighter1_118_507_Open_Image" onclick="this.style.display='none'; Codehighlighter1_118_507_Open_Text.style.display='none'; Codehighlighter1_118_507_Closed_Image.style.display='inline'; Codehighlighter1_118_507_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_118_507_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_118_507_Closed_Text.style.display='none'; Codehighlighter1_118_507_Open_Image.style.display='inline'; Codehighlighter1_118_507_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_118_507_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_118_507_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000"> WM_PAINT:<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  <img src="http://www.cppblog.com/images/dot.gif" /><br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000"> <img src="http://www.cppblog.com/images/dot.gif" /><br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000"> WM_CLOSE:<br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">DestroyWindow(hwnd);<br /></span><span style="COLOR: #008080">17</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">销毁窗口，并发送WM_DESTROY消息。</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">18</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000"> WM_DESTROY:<br /></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">PostQuitMessage(0);<br /></span><span style="COLOR: #008080">21</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">发送WM_QUIT消息到消息队列中，请求终止。<br /></span><span style="COLOR: #008080">22</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />         </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">GetMessage()取到WM_QUIT消息后，返回0，退出消息循                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">   环，从而终止应用程序。</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">23</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000">:<br /></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> DefWindowProc(hwnd,uMsg,wParam,lParam);<br /></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">用缺省的窗口过程处理我们不感兴趣的消息（其它消息）。<br /></span><span style="COLOR: #008080">27</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">这是必须的。</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">28</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">    }</span></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">switch</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">29</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">WindowProc<br /></span><span style="COLOR: #008080">31</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><br />13，DestroyWindow()函数和PostQuitMessage()函数原型：<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: #008080"> 1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000">**The DestroyWindow function destroys the specified window. The function sends WM_DESTROY and WM_NCDESTROY messages。</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />BOOL DestroyWindow(<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  HWND hWnd   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> handle to window to destroy</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">**The PostQuitMessage function indicates to the system that a thread has made a request to terminate (quit). It is typically used in response to a WM_DESTROY message. <br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">**The PostQuitMessage function posts a WM_QUIT message to the thread's message queue and returns immediately; the function simply indicates（预示，通知） to the system that the thread is requesting to quit at some time in the future. </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />When the thread retrieves the WM_QUIT message from its message queue, it should exit its message loop and </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> control to the system.<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />VOID PostQuitMessage(<br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> nExitCode   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> exit code</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><br />14，关于DC句柄获取：<br />a)使用BeginPaint(),EndPaint()对。注意只能在响应WM_PAINT消息时使用。<br />b)使用GetDc(),ReleaseDC()对。注意他们不能在响应WM_PAINT中使用。<img src ="http://www.cppblog.com/ispfcn/aggbug/4979.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ispfcn/" target="_blank">编程之道</a> 2006-04-04 11:07 <a href="http://www.cppblog.com/ispfcn/archive/2006/04/04/4979.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>孙鑫VC++讲座笔记-(2)C++ </title><link>http://www.cppblog.com/ispfcn/archive/2006/04/04/4980.html</link><dc:creator>编程之道</dc:creator><author>编程之道</author><pubDate>Tue, 04 Apr 2006 03:07:00 GMT</pubDate><guid>http://www.cppblog.com/ispfcn/archive/2006/04/04/4980.html</guid><wfw:comment>http://www.cppblog.com/ispfcn/comments/4980.html</wfw:comment><comments>http://www.cppblog.com/ispfcn/archive/2006/04/04/4980.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ispfcn/comments/commentRss/4980.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ispfcn/services/trackbacks/4980.html</trackback:ping><description><![CDATA[
		<p>1, c语言中，结构体struct中不能包括函数的，而在C++中struct中可以包括函数。<br />2，C++中结构体和类可以通用，区别主要表现在访问控制方面：struct中默认是public，而 class中默认的是private。<br />3，构造函数最重要的作用是创建对象的本身，C++中每个类可以拥有多个构造函数，但必须至少有一个构造函数，当一个类中没有显式提供任何构造函数，C++编辑器自动提供一个默认的不带参数的构造函数，这个默认的构造函数只负责构造对象，不做任何初始化工作。但在一个类中只要自己定义一个构造函数，不管带参不带参，编辑器不再提供默认的不带参的构造函数了。构造函数没有返回值。<br />4,析构函数当一个对象生命周期结束时候被调用来回收对象占用的内存空间。一个类只需有一个析构函数。析构函数没有返回值也不的带参数。<br />5，析构函数的作用与构造函数相反，对象超出起作用范围对应的内存空间被系统收回，或被程序用delete删除的时候，对象的析构函数被调用。<br />6，函数的重载条件：函数的参数类型、个数不同，才能构成函数的重载。重载是发生在同一个类中。<br />7，类是抽象的，不占用具体物理内存，只有对象是实例化的，是占用具体物理内存的。<br />8，this指针是隐含指针，指向对象本身（this指针不是指向类的），代表了对象的地址。所有的对象调用的成员函数都是同一代码段，但每个对象都有自己的数据成员。当对象通过调用它的成员函数来访问它的数据成员的时候，成员函数除了接收实参外，还接收了对象的地址，这个地址被一个隐藏的形参this所获取，通过这个this指针可以访问对象的数据成员和成员函数。<br />9，对象中public属性的成员在外部和子类中都可以被访问；protected属性的成员在外部不能被访问，在子类中是可以访问的；private属性在子类中和外部都不能被访问。<br />10，类的继承访问特性：（public,protected,private)<br /> a）基类中private属性成员，子类无论采用那种继承方式都不能访问。<br /> b）采用public继承，基类中的public,protected属性的成员访问特性在子类中仍然保持一致。<br /> c）采用protected继承，基类中的public,protected属性成员访问特性在子类中变为protected.<br /> d）采用provate继承，基类中的public,protected属性成员访问特性在子类中变为provate.<br />11，子类和基类的构造函数或析构函数调用顺序：<br /> 当调用子类的构造函数时候先调用基类的构造函数（如果没有指明，则调用基类却省那个不带参数的构造函数；如果要指明则在子类构造函数名后加":基类名(参数)"）。析构函数则相反，先调用子类析构函数，后调用基类的析构函数。<br />12，函数的覆盖：<br /> 函数的覆盖是发生在发生父类和子类之间的。（函数的重载是发生在同一个类中）<br /> 当子类中重写了父类的某些成员函数后，子类中的成员函数覆盖了父类的对应同名成员函数。<br />13，用父类指针访问子类对象成员时候，只能访问子类从父类继承来的那部分。（这时候外部不可以访问父类中保护和私有的部分，子类中不可访问父类私有部分。）<br />14，多态性：在基类的的成员函数前加virturl变成虚函数，当用子类对象调用该功能的成员函数时候，子类有的就调用子类的，子类没有的就调用基类的。<br /> 当C++编译器在编译的时候，发现被调用的成员函数在基类中定义的是虚函数，这个时候C++就会采用迟绑定技术（late binding)，在运行的时候，依据对象的类型来确定调用的哪个函数，子类有调用子类的，子类没有的就调用基类的。<br /> 如果基类中的成员函数不是虚函数，则这时候的绑定是早期绑定，在编译的时候就已经确定该调用哪个函数。<br />15，纯虚函数：在类中定义时 eg: virtual void f1()=0;<br /> 纯虚函数没有函数体，含有纯虚函数的类叫做抽象类，抽象类不能实例化对象。当子类从抽象类的基类中派生出来时候，如果没有实现基类中的纯虚函数，则子类也是个抽象类，也不能实例化对象。<br /> 纯虚函数被标名为不具体实现的虚成员函数，纯虚函数可以让类只具有操作的名称而不具有具体的操作的内容，让派生类在继承的时候再给出具体的定义。如果派生类没有给出基类的纯虚函数的具体定义的时候，派生类也为一个抽象类，也不能实例化对象。<br />16，引用：变量的别名。引用需要在定义的时候用一变量或对象初始化自己。引用一旦在定义的时候初始化，就维系在一个特定的变量或对象上。<br /> 引用不占用物理内存（与定义引用的目标共用同一内存）。指针变量需要占用物理内存，用来存储地址。</p>
<img src ="http://www.cppblog.com/ispfcn/aggbug/4980.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ispfcn/" target="_blank">编程之道</a> 2006-04-04 11:07 <a href="http://www.cppblog.com/ispfcn/archive/2006/04/04/4980.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>孙鑫VC++讲座笔记-(3)MFC程序框架的剖析</title><link>http://www.cppblog.com/ispfcn/archive/2006/04/04/4981.html</link><dc:creator>编程之道</dc:creator><author>编程之道</author><pubDate>Tue, 04 Apr 2006 03:07:00 GMT</pubDate><guid>http://www.cppblog.com/ispfcn/archive/2006/04/04/4981.html</guid><wfw:comment>http://www.cppblog.com/ispfcn/comments/4981.html</wfw:comment><comments>http://www.cppblog.com/ispfcn/archive/2006/04/04/4981.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ispfcn/comments/commentRss/4981.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ispfcn/services/trackbacks/4981.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1,寻找WinMain人口：在安装目录下找到MFC文件夹下的SRC文件夹，SRC下是MFC源代码。路径：MFC|SRC|APPMODUL.CPP：1_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,2 LPTSTR lpCmdLine, int nCmdShow)3{4 // call shared/exported WinMain5 r...&nbsp;&nbsp;<a href='http://www.cppblog.com/ispfcn/archive/2006/04/04/4981.html'>阅读全文</a><img src ="http://www.cppblog.com/ispfcn/aggbug/4981.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ispfcn/" target="_blank">编程之道</a> 2006-04-04 11:07 <a href="http://www.cppblog.com/ispfcn/archive/2006/04/04/4981.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言中面向对象的尝试</title><link>http://www.cppblog.com/ispfcn/archive/2006/04/04/4978.html</link><dc:creator>编程之道</dc:creator><author>编程之道</author><pubDate>Tue, 04 Apr 2006 03:05:00 GMT</pubDate><guid>http://www.cppblog.com/ispfcn/archive/2006/04/04/4978.html</guid><wfw:comment>http://www.cppblog.com/ispfcn/comments/4978.html</wfw:comment><comments>http://www.cppblog.com/ispfcn/archive/2006/04/04/4978.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ispfcn/comments/commentRss/4978.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ispfcn/services/trackbacks/4978.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: C语言中面向对象的尝试		作者：周志明		 		说明：程序中关于画直线和园的算法，请参阅图形学相关知识．算法部分写在在main函数后．		运行环境：ＴＣ２．０（运行时候注意路径问题）						  1								#include				&lt;				graphics.h				&gt;																		  2	...&nbsp;&nbsp;<a href='http://www.cppblog.com/ispfcn/archive/2006/04/04/4978.html'>阅读全文</a><img src ="http://www.cppblog.com/ispfcn/aggbug/4978.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ispfcn/" target="_blank">编程之道</a> 2006-04-04 11:05 <a href="http://www.cppblog.com/ispfcn/archive/2006/04/04/4978.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>