﻿<?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++博客-中国勇士-X-随笔分类-Windows MFC</title><link>http://www.cppblog.com/zgysx/category/2783.html</link><description>抒写快乐心情</description><language>zh-cn</language><lastBuildDate>Fri, 25 Jul 2008 12:38:19 GMT</lastBuildDate><pubDate>Fri, 25 Jul 2008 12:38:19 GMT</pubDate><ttl>60</ttl><item><title>异常处理</title><link>http://www.cppblog.com/zgysx/archive/2008/07/23/56926.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Wed, 23 Jul 2008 05:07:00 GMT</pubDate><guid>http://www.cppblog.com/zgysx/archive/2008/07/23/56926.html</guid><wfw:comment>http://www.cppblog.com/zgysx/comments/56926.html</wfw:comment><comments>http://www.cppblog.com/zgysx/archive/2008/07/23/56926.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zgysx/comments/commentRss/56926.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zgysx/services/trackbacks/56926.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br>#include&nbsp;</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>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">windows.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">dbghelp.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br>#pragma&nbsp;comment(lib,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Dbghelp.lib</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;_INNER_TEST&nbsp;1</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">#if</span><span style="color: #000000;">&nbsp;_DEBUG&nbsp;&amp;&nbsp;!defined(&nbsp;_INNER_TEST&nbsp;)</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;GS_EXCEPTION_BEGIN()</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;GS_EXCEPTION_END()</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#else</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;EXCEPTION_BEGIN()&nbsp;__try&nbsp;{</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;EXCEPTION_END()&nbsp;}&nbsp;__except(&nbsp;MyUnhandledFilter(&nbsp;GetExceptionInformation()&nbsp;)&nbsp;)&nbsp;{}</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#endif</span><span style="color: #000000;"><br><br><br><br><br>LONG&nbsp;WINAPI&nbsp;MyUnhandledFilter(</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;_EXCEPTION_POINTERS&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;lpExceptionInfo)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;LONG&nbsp;ret&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;EXCEPTION_EXECUTE_HANDLER;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;TCHAR&nbsp;szFileName[</span><span style="color: #000000;">64</span><span style="color: #000000;">];<br>&nbsp;&nbsp;&nbsp;&nbsp;SYSTEMTIME&nbsp;st;<br>&nbsp;&nbsp;&nbsp;&nbsp;::GetLocalTime(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">st);<br>&nbsp;&nbsp;&nbsp;&nbsp;wsprintf(szFileName,&nbsp;TEXT(</span><span style="color: #000000;">"</span><span style="color: #000000;">%04d-%02d-%02d-%02d-%02d-%02d-%02d-%02d.dmp</span><span style="color: #000000;">"</span><span style="color: #000000;">),&nbsp;st.wYear,&nbsp;st.wMonth,&nbsp;st.wDay,&nbsp;st.wHour,&nbsp;st.wMinute,&nbsp;st.wSecond,&nbsp;st.wMilliseconds,&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">rand()</span><span style="color: #008000;">*/</span><span style="color: #000000;">100</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;hFile&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;::CreateFile(szFileName,&nbsp;GENERIC_WRITE,&nbsp;FILE_SHARE_WRITE,&nbsp;NULL,&nbsp;CREATE_ALWAYS,&nbsp;FILE_ATTRIBUTE_NORMAL,&nbsp;NULL&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(hFile&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;INVALID_HANDLE_VALUE)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MINIDUMP_EXCEPTION_INFORMATION&nbsp;ExInfo;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExInfo.ThreadId&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;::GetCurrentThreadId();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExInfo.ExceptionPointers&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;lpExceptionInfo;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExInfo.ClientPointers&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;bOK&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;MiniDumpWriteDump(GetCurrentProcess(),&nbsp;GetCurrentProcessId(),&nbsp;hFile,&nbsp;MiniDumpNormal,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">ExInfo,&nbsp;NULL,&nbsp;NULL&nbsp;);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(bOK)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">Create&nbsp;Dump&nbsp;File&nbsp;Success!\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">MiniDumpWriteDump&nbsp;Failed:&nbsp;%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;GetLastError());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::CloseHandle(hFile);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">Create&nbsp;File&nbsp;%s&nbsp;Failed&nbsp;%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;szFileName,&nbsp;GetLastError());<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;std::</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;strTip;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">switch</span><span style="color: #000000;">(&nbsp;lpExceptionInfo</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">ExceptionRecord</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">ExceptionCode&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;STATUS_ACCESS_VIOLATION:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;sz[</span><span style="color: #000000;">200</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">0</span><span style="color: #000000;">};<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(&nbsp;sz,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">内存访问冲突&nbsp;Access&nbsp;violation,&nbsp;Attempt&nbsp;to&nbsp;%s&nbsp;data&nbsp;at&nbsp;address&nbsp;%p</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;&nbsp;lpExceptionInfo</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">ExceptionRecord</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">ExceptionInformation[</span><span style="color: #000000;">0</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">write</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">read</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;lpExceptionInfo</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">ExceptionRecord</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">ExceptionInformation[</span><span style="color: #000000;">1</span><span style="color: #000000;">]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strTip&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sz;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;STATUS_BREAKPOINT:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strTip&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">用户断点&nbsp;Breakpoint</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;STATUS_DATATYPE_MISALIGNMENT:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strTip&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">内存地址对齐错误&nbsp;Address&nbsp;misaligned</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br>#ifdef&nbsp;STATUS_FLOATING_DIVIDE_BY_ZERO<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;STATUS_FLOATING_DIVIDE_BY_ZERO:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strTip&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;L</span><span style="color: #000000;">"</span><span style="color: #000000;">浮点数除数为0&nbsp;Floating&nbsp;point&nbsp;divide&nbsp;by&nbsp;0</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;STATUS_FLOATING_OVERFLOW:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strTip&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;L</span><span style="color: #000000;">"</span><span style="color: #000000;">浮点数溢出&nbsp;Floating&nbsp;point&nbsp;overflow</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;STATUS_FLOATING_UNDERFLOW:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strTip&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;L</span><span style="color: #000000;">"</span><span style="color: #000000;">浮点数溢出&nbsp;Floating&nbsp;point&nbsp;underflow</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;STATUS_FLOATING_RESEVERED_OPERAND:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strTip&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;L</span><span style="color: #000000;">"</span><span style="color: #000000;">保留的浮点数格式&nbsp;Reserved&nbsp;Floating&nbsp;point&nbsp;format</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br></span><span style="color: #0000ff;">#endif</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;STATUS_ILLEGAL_INSTRUCTION:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strTip&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">非法指令&nbsp;Illegal&nbsp;instruction</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;STATUS_PRIVILEGED_INSTRUCTION:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strTip&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">特权指令&nbsp;Priviledged&nbsp;instruction</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;STATUS_INTEGER_DIVIDE_BY_ZERO:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strTip&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">0除数错误&nbsp;Integer&nbsp;divide&nbsp;by&nbsp;0</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;STATUS_INTEGER_OVERFLOW:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strTip&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">整数溢出&nbsp;Integer&nbsp;overflow</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;STATUS_SINGLE_STEP:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strTip&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">单步执行&nbsp;Single&nbsp;step</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">default</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strTip&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">未定义错误&nbsp;Undefined&nbsp;error.</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">发生错误的位置是&nbsp;%p&nbsp;\n&nbsp;%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;lpExceptionInfo</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">ExceptionRecord</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">ExceptionAddress,&nbsp;strTip.c_str()&nbsp;);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;ret;<br>}<br><br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;_tmain(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc,&nbsp;_TCHAR</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">::SetUnhandledExceptionFilter(MyUnhandledFilter);</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;EXCEPTION_BEGIN()<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;b&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">int&nbsp;c&nbsp;=&nbsp;b/a;</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;strcpy(&nbsp;NULL,&nbsp;NULL&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;EXCEPTION_END()<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}</span></div>
<br><img src ="http://www.cppblog.com/zgysx/aggbug/56926.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zgysx/" target="_blank">warrior</a> 2008-07-23 13:07 <a href="http://www.cppblog.com/zgysx/archive/2008/07/23/56926.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在桌面建立快捷方式</title><link>http://www.cppblog.com/zgysx/archive/2007/01/08/17415.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Mon, 08 Jan 2007 02:25:00 GMT</pubDate><guid>http://www.cppblog.com/zgysx/archive/2007/01/08/17415.html</guid><wfw:comment>http://www.cppblog.com/zgysx/comments/17415.html</wfw:comment><comments>http://www.cppblog.com/zgysx/archive/2007/01/08/17415.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/zgysx/comments/commentRss/17415.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zgysx/services/trackbacks/17415.html</trackback:ping><description><![CDATA[    在阅读代码之前，先看一下关于“快捷方式”组件的结构示意图。<br /><br /> <img height="128" src="http://www.vckbase.com/document/journal/vckbase43/images/comtut4pic2.jpg" width="296" border="0" /><br />图二、快捷方式组件的接口结构示意图<br /><br />　　从结构图中可以看出，“快捷方式”组件(CLSID_ShellLink)，有3个（其实不止）接口，每个接口完成一组相关功能的函数。 IShellLink 接口(IID_IShellLink)提供快捷方式的参数读写功能（见图三），IPersistFile 接口(IID_IPersistFile)提供快捷方式持续性文件的读写功能。对象的持续性(注5)，是一个非常常用，并且功能强大的接口家族。但今天，我们只要了解其中两函数，就可以了：IPersistFile::Save()和IPersistFile:Load()。(注6)<br /><br /> <img height="412" src="http://www.vckbase.com/document/journal/vckbase43/images/comtut4pic3.jpg" width="367" border="0" /><br />图三、快捷方式中的各种属性<pre>#include &lt; atlconv.h &gt;
void CreateShortcut(LPCTSTR lpszExe, LPCTSTR lpszLnk)
{
	// 建立块捷方式
	// 参数 lpszExe: EXE 文件全路径名
	// 参数 lpszLnk: 快捷方式文件全路径名
	
	::CoInitialize( NULL );

	IShellLink * psl = NULL;
	IPersistFile * ppf = NULL;

	HRESULT hr = ::CoCreateInstance(  // 启动组件
		CLSID_ShellLink,      // 快捷方式 CLSID
		NULL,                 // 聚合用(注4)
		CLSCTX_INPROC_SERVER, // 进程内(Shell32.dll)服务
		IID_IShellLink,       // IShellLink 的 IID
		(LPVOID *)&amp;psl );     // 得到接口指针

	if ( SUCCEEDED(hr) )
	{
		psl-&gt;SetPath( lpszExe );  // 全路径程序名
//		psl-&gt;SetArguments();      // 命令行参数
//		psl-&gt;SetDescription();    // 备注
//		psl-&gt;SetHotkey();         // 快捷键
//		psl-&gt;SetIconLocation();   // 图标
//		psl-&gt;SetShowCmd();        // 窗口尺寸
		
		// 根据 EXE 的文件名，得到目录名
		TCHAR szWorkPath[ MAX_PATH ];
		::lstrcpy( szWorkPath, lpszExe );
		LPTSTR lp = szWorkPath;
		while( *lp )    lp++;
		while( ''\\'' != *lp )    lp--;
		*lp=0;

		// 设置 EXE 程序的默认工作目录
		psl-&gt;SetWorkingDirectory( szWorkPath );

		hr = psl-&gt;QueryInterface(  // 查找持续性文件接口指针
			IID_IPersistFile,      // 持续性接口 IID
			(LPVOID *)&amp;ppf );      // 得到接口指针

		if ( SUCCEEDED(hr) )
		{
			USES_CONVERSION;       // 转换为 UNICODE 字符串
			ppf-&gt;Save( T2COLE( lpszLnk ), TRUE );  // 保存
		}
	}
	if ( ppf )	ppf-&gt;Release();
	if ( psl )	psl-&gt;Release();

	::CoUninitialize();
}

void OnXXX()
{
	CreateShortcut(
		_T("c:\\winnt\\notepad.exe"),  // 记事本程序。注意，你的系统是否也是这个目录？
		_T("c:\\Documents and Settings\\Administrator\\桌面\\我的记事本.lnk")
	);
	// 桌面上建立快捷方式(lnk)文件的全路径名。注意，你的系统是否也是这个目录？
	// 如果用程序实现寻找桌面的路径，则可以查注册表
	// HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
}
</pre><img src ="http://www.cppblog.com/zgysx/aggbug/17415.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zgysx/" target="_blank">warrior</a> 2007-01-08 10:25 <a href="http://www.cppblog.com/zgysx/archive/2007/01/08/17415.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让List Control有Check Box 和 让List Box有Check Box</title><link>http://www.cppblog.com/zgysx/archive/2006/12/30/17030.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Sat, 30 Dec 2006 05:30:00 GMT</pubDate><guid>http://www.cppblog.com/zgysx/archive/2006/12/30/17030.html</guid><wfw:comment>http://www.cppblog.com/zgysx/comments/17030.html</wfw:comment><comments>http://www.cppblog.com/zgysx/archive/2006/12/30/17030.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zgysx/comments/commentRss/17030.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zgysx/services/trackbacks/17030.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#008000">
						<strong>1.让List Control有Check Box</strong>
				</font>
				<br />用SetExtendedStyle方法可以设置，看代码：<br />（CListCtrl m_ListCtrl;）</p>
		<p>DWORD dwStyle = m_ListCtrl.GetStyle();<br />dwStyle |= LVS_EX_CHECKBOXES;<br />m_ListCtrl.SetExtendedStyle(dwStyle);</p>
		<p>
				<font color="#008000">
						<strong>2.让List Box有Check Box</strong>
				</font>
				<br />首先，声明Control变量的时候用CCheckListBox代替CListBox。<br />然后，将List Box的Has Strings属性改为True；把Ower Draw属性改为Fixed。</p>
<img src ="http://www.cppblog.com/zgysx/aggbug/17030.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zgysx/" target="_blank">warrior</a> 2006-12-30 13:30 <a href="http://www.cppblog.com/zgysx/archive/2006/12/30/17030.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Static控件中显示BMP</title><link>http://www.cppblog.com/zgysx/archive/2006/12/30/17029.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Sat, 30 Dec 2006 05:28:00 GMT</pubDate><guid>http://www.cppblog.com/zgysx/archive/2006/12/30/17029.html</guid><wfw:comment>http://www.cppblog.com/zgysx/comments/17029.html</wfw:comment><comments>http://www.cppblog.com/zgysx/archive/2006/12/30/17029.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zgysx/comments/commentRss/17029.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zgysx/services/trackbacks/17029.html</trackback:ping><description><![CDATA[
		<p>首先，给Static控件添加一个Control变量（ID要改了以后才能添加变量，也就是说ID不能为IDC_STATIC），本例为m_staticTest。<br />然后，用ModifyStyle函数修改Static控件的Style，让它可以显示图片：</p>
		<p>m_staticTest.ModifyStyle(0, SS_BITMAP | SS_CENTERIMAGE);</p>
		<p>最后，就是Load文件显示出来：</p>
		<p>CRect rect;<br />m_staticTest.GetWindowRect(&amp;rect);</p>
		<p>
				<font color="#339966">//  下面的方法是按照Static控件的大小显示bmp，如果要安装图片实际大小显示，用这个方法Load图片：<br />//  HBITMAP hBmp = (HBITMAP)::LoadImage(0, _T("D:\\test.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);<br /></font>HBITMAP hBmp = (HBITMAP)::LoadImage(0, _T("D:\\test.bmp"), IMAGE_BITMAP, rect.Width(), rect.Height(), LR_LOADFROMFILE);</p>
		<p>m_staticTest.SetBitmap(hBmp);<br />DeleteObject(hBmp);</p>
<img src ="http://www.cppblog.com/zgysx/aggbug/17029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zgysx/" target="_blank">warrior</a> 2006-12-30 13:28 <a href="http://www.cppblog.com/zgysx/archive/2006/12/30/17029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]VC 界面开发 常见的问题</title><link>http://www.cppblog.com/zgysx/archive/2006/12/28/16952.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Thu, 28 Dec 2006 09:54:00 GMT</pubDate><guid>http://www.cppblog.com/zgysx/archive/2006/12/28/16952.html</guid><wfw:comment>http://www.cppblog.com/zgysx/comments/16952.html</wfw:comment><comments>http://www.cppblog.com/zgysx/archive/2006/12/28/16952.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zgysx/comments/commentRss/16952.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zgysx/services/trackbacks/16952.html</trackback:ping><description><![CDATA[
		<h2>
				<a id="viewpost1_TitleUrl" href="/mzty/archive/2006/11/14/15149.html">
						<font size="3">VC 常见的问题</font>
				</a>
				<font size="3">
						<br />
						<br />
						<font color="#000000">（3） 如何在程序中获得其他程序的 图标?<br />两种方法:<br />(1) SDK函数 SHGetFileInfo 或使用 ExtractIcon获得图标资源的 handle,<br />(2) SDK函数 SHGetFileInfo 获得有关文件的很多信息,如大小图标,属性, 类型等.</font>
				</font>
		</h2>
		<h2>
				<font size="3">
						<font color="#808080">
								<font color="#000000">void CSampleView:<br />OnDraw(CDC * pDC)<br />{<br />if( :: SHGetFileInfo(_T("c:\\pwin95\\notepad.exe"),0,<br />&amp;stFileInfo,sizeof(stFileInfo),SHGFI_ICON))<br />{<br />pDC -&gt;DrawIcon(10,10,stFileInfo.hIcon)<br />}<br />}<br />Example(2):同样功能,Use ExtractIcon Function<br />void CSampleView:: OnDraw(CDC *pDC)<br />{<br />HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T<br />("NotePad.exe"),0)<br />if (hIcon &amp;&amp;hIcon!=(HICON)-1)<br />pDC-&gt;DrawIcon(10,10,hIcon)<br />}</font>
								<br />
						</font>
						<br />    说明: 获得notepad.exe的路径正规上来说用GetWindowsDirectory函数得到, 如果是调用 win95下的画笔，应该用访问注册表的方法获得其路径，要作成一个比较考究的程序，考虑应该全面点. </font>
		</h2>
		<div class="postbody">
				<div class="postbody">
						<div class="postcontent">
								<p>
										<br />
										<br />（6） 如何改变窗口的图标?<br />向窗口发送 WM_SECTION消息。<br />Example:<br />HICON hIcon=AfxGetApp() -&gt;LoadIcon(IDI_ICON)<br />ASSERT(hIcon)<br />AfxGetMainWnd() -&gt;SendMessage(WM_SECTION,TRUE,(LPARAM)hIcon)<br /></p>（8） 如何将窗口居中显示?<br />Call Function CWnd::CenterWindows()<br /><br />Example(1):<br />Center Window( ) //Relative to it's parent<br />// Relative to Screen<br />Example(2):<br />CenterWindow(CWnd:: GetDesktopWindow( ))<br />//Relative to Application's MainWindow<br />AfxGetMainWnd( ) -&gt;CenterWindow( )<br /><p><br /> </p><p>（12） 如何创建一个字回绕的CEditView<br />重载CWnd : : PreCreateWindow和修改CREATESTRUCT结构，关闭CEditView对象的ES_AUTOHSCROLL和WS_HSCROLL风格位， 由于CEditView : : PreCreateWindow显示设置cs. style，调用基类函数后要修改cs . style。<br /><br />BOOL CSampleEDitView : : PreCreateWindow (CREATESTRUCT&amp;cs)<br />{<br />//First call basse class function .<br />BOOL bResutl =CEditView : : PreCreateWindow (cs)<br /><br />// Now specify the new window style .<br />cs.style &amp;= ~ (ES_AUTOHSCROLL ｜WS_HSCROLL)<br />return bResult<br />}<br /></p><p><br />（17） 如何单击除了窗口标题栏以外的区域使窗口移动<br />当窗口需要确定鼠标位置时Windows向窗口发送WM_NCHITTEST信息，可以处理该信息使Windows认为鼠标在窗口标题上。对于对话框和基于对话的应用程序，可以使用ClassWizard处理该信息并调用基类函数， 如果函数返回HTCLIENT 则表明鼠标在客房区域，返回HTCAPTION表明鼠标在Windows的标题栏中。<br />UINT CSampleDialog : : OnNcHitTest (Cpoint point )<br />{<br />UINT nHitTest =Cdialog: : OnNcHitTest (point )<br />return (nHitTest = =HTCLIENT)? HTCAPTION : nHitTest<br />}<br /><br />上述技术有两点不利之处，<br />其一是在窗口的客户区域双击时，窗口将极大；<br />其二， 它不适合包含几个视窗的主框窗口。<br />还有一种方法，当用户按下鼠标左键使主框窗口认为鼠标在其窗口标题上，使用ClassWizard在视窗中处理WM_LBUTTODOWN信息并向主框窗口发送一个WM_NCLBUTTONDOWN信息和一个单击测试HTCAPTION。<br />void CSampleView : : OnLButtonDown (UINT nFlags , Cpoint point<br />)<br />{<br />CView : : OnLButtonDow (nFlags , pont )<br /><br />//Fool frame window into thinking somene clicked<br />on<br />its caption bar .<br />GetParentFrame ( ) —&gt; PostMessage (<br />WM_NCLBUTTONDOWN ,<br />HTCAPTION , MAKELPARAM (poitn .x , point .y) )<br /><br />}<br />该技术也适用于对话框和基于对的应用程序，只是不必调用<br />CWnd: :GetParentFrame 。<br />void CSampleDialog : : OnLbuttonDown (UINT nFlags, Cpoint point )<br />{<br />Cdialog : : OnLButtonDow (nFlags, goint )<br />//Fool dialog into thinking simeone clicked on its<br />caption bar .<br />PostMessage (WM_NCLBUTTONDOWN , HTCAPTION , MAKELPARM (point.x<br />, point. y<br />) )<br />}</p><p>（18） 如何改变视窗的背景颜色<br />Windows向窗口发送一个WM_ERASEBKGND消息通知该窗口擦除背景，可以使用ClassWizard重载该消息的缺省处理程序来擦除背景（实际是画），并返回TRUE以防止Windows擦除窗口。<br />//Paint area that needs to be erased.<br />BOOL CSampleView : : OnEraseBkgnd (CDC* pDC)<br />{<br />// Create a pruple brush.<br />CBrush Brush (RGB (128 , 0 , 128) )<br /><br />// Select the brush into the device context .<br />CBrush* pOldBrush = pDC—&gt;SelcetObject (&amp;brush)<br /><br />// Get the area that needs to be erased .<br />CRect reClip<br />pDC—&gt;GetCilpBox (&amp;rcClip)<br />//Paint the area.<br />pDC—&gt; PatBlt (rcClip.left , rcClip.top , rcClip.Width ( ) , rcClip.Height( ) , PATCOPY )<br /><br />//Unselect brush out of device context .<br />pDC—&gt;SelectObject (pOldBrush )<br /><br />// Return nonzero to half fruther processing .<br />return TRUE<br />}</p><p>（20） 如何防止主框窗口在其说明中显示活动的文档名<br />创建主框窗口和MDI子窗口进通常具有FWS_ADDTOTITLE风格位，如果不希望在说明中自动添加文档名， 必须禁止该风格位， 可以使用ClassWizard重置<br />CWnd: : PreCreateWindow并关闭FWS_ADDTOTITLE风格。<br />BOOL CMainFrame : : PreCreateWindow (CREATESTRUCT&amp;cs)<br />{<br />//Turn off FWS_ADDTOTITLE in main frame .<br />cs.styel &amp; = ~FWS_ADDTOTITLE 　<br />return CMDIFrameWnd : : PreCreateWindow (cs )<br />}<br />关闭MDI子窗口的FWS _ADDTOTITLE风格将创建一个具有空标题的窗口，可以调用CWnd: : SetWindowText来设置标题。记住自己设置标题时要遵循接口风格指南。</p><p>（21） 如何获取有关窗口正在处理的当前消息的信息<br />调用CWnd: : GetCurrentMessage可以获取一个MSG指针。例如，可以使用ClassWizard将几个菜单项处理程序映射到一个函数中，然后调用GetCurrentMessage来确定所选中的菜单项。<br />viod CMainFrame : : OnCommmonMenuHandler ( )<br />{<br />//Display selected menu item in debug window .<br />TRACE ("Menu item %u was selected . \n" ,</p><p>（22） 如何在代码中获取工具条和状态条的指针<br />缺省时， 工作框创建状态条和工具条时将它们作为主框窗口的子窗口，状态条有一个AFX_IDW_STATUS_BAR标识符，工具条有一个AFX_IDW_TOOLBAR标识符，下例说明了如何通过一起调用CWnd: : GetDescendantWindow和AfxGetMainWnd来获取这些子窗口的指针：<br />//Get pointer to status bar .<br />CStatusBar * pStatusBar = (CStatusBar *) AfxGetMainWnd ( )<br />—&gt; GetDescendantWindow(AFX_IDW_STUTUS_BAR)<br /><br />//Get pointer to toolbar .<br />CToolBar * pToolBar = (CToolBar * ) AfxGetMainWnd ( )<br />—&gt; GetDescendantWindow(AFX_IDW_TOOLBAR)</p><p>（23） 如何使能和禁止工具条的工具提示<br />如果设置了CBRS_TOOLTIPS风格位，工具条将显示工具提示，要使能或者禁止工具提示，需要设置或者清除该风格位。下例通过调用CControlBar : : GetBarStyle和CControlBar : : SetBarStyle建立一个完成此功能的成员函数：<br />void CMainFrame : : EnableToolTips ( BOOL bDisplayTips )<br />{<br />ASSERT_VALID (m_wndToolBar)<br /><br />DWORD dwStyle = m _wndToolBar.GetBarStyle ( )<br /><br />if (bDisplayTips) dwStyle ｜=CBRS_TOOLTIPS<br /><br />else<br />dwStyle &amp; = ~CBRS_TOOLTIPS<br /><br />m_wndToolBar.SetBarStyle (dwStyle )<br />}</p><p>（24） 如何创建一个不规则形状的窗口<br />可以使用新的SDK函数SetWindowRgn。该函数将绘画和鼠标消息限定在窗口的一个指定的区域，实际上使窗口成为指定的不规则形状。 使用AppWizard创建一个基于对的应用程序并使用资源编辑器从主对话资源中删除所在的缺省控件、标题以及边界。<br />给对话类增加一个CRgn数据成员，以后要使用该数据成员建立窗口区域。<br />Class CRoundDlg : public CDialog<br />{<br />…<br />private :<br />Crgn m_rgn : // window region<br />…<br />}<br />修改OnInitDialog函数建立一个椭圆区域并调用SetWindowRgn将该区域分配给窗口：<br />BOOL CRoundDlg : : OnInitDialog ( )<br />{<br />CDialog : : OnInitDialog ( )<br /><br />//Get size of dialog .<br />CRect rcDialog<br />GetClientRect (rcDialog )<br /><br />// Create region and assign to window .<br />m_rgn . CreateEllipticRgn (0 , 0 , rcDialog.Width( ) , rcDialog.Height ( ) )<br />SetWindowRgn (GetSafeHwnd ( ) , (HRGN) m_ rgn ,TRUE )<br /><br />return TRUE<br />}<br /><br />通过建立区域和调用SetWindowRgn，已经建立一个不规则形状的窗口，下面的例子程序是修改OnPaint函数使窗口形状看起来象一个球形体。<br />voik CRoundDlg : : OnPaint ( )<br />{<br />CPaintDC de (this) // device context for painting<br />.<br />//draw ellipse with out any border<br />dc. SelecStockObject (NULL_PEN)<br />//get the RGB colour components of the sphere color<br />COLORREF color= RGB( 0 , 0 , 255)<br />BYTE byRed =GetRValue (color)<br />BYTE byGreen = GetGValue (color)<br />BYTE byBlue = GetBValue (color)<br /><br />// get the size of the view window<br />Crect rect<br />GetClientRect (rect)<br /><br />// get minimun number of units<br />int nUnits =min (rect.right , rect.bottom )<br /><br />//calculate he horiaontal and vertical step size<br />float fltStepHorz = (float) rect.right /nUnits<br />float fltStepVert = (float) rect.bottom /nUnits<br /><br /><br />int nEllipse = nUnits/3 // calculate how many to<br />draw<br />int nIndex<br />// current ellipse that is being draw<br /><br />CBrush brush<br />// bursh used for ellipse fill color<br />CBrush *pBrushOld // previous<br />brush that was selected into dc<br />//draw ellipse , gradually moving towards upper-right<br />corner<br />for (nIndex = 0 nIndes &lt; + nEllipse nIndes++)<br />{<br />//creat solid brush<br />brush . CreatSolidBrush (RGB ( ( (nIndex*byRed ) /nEllipse ).<br />( ( nIndex * byGreen ) /nEllipse ), ( (nIndex * byBlue)<br />/nEllipse ) ) )<br /><br />//select brush into dc<br />pBrushOld= dc .SelectObject (&amp;brhsh)<br /><br />//draw ellipse<br />dc .Ellipse ( (int) fltStepHorz * 2, (int) fltStepVert * nIndex ,<br />rect. right -( (int) fltStepHorz * nIndex )+ 1,<br />rect . bottom -( (int) fltStepVert * (nIndex *2) ) +1)<br /><br />//delete the brush<br />brush.DelecteObject ( )<br />}<br />}<br /><br />最后，处理WM_NCHITTEST消息，使当击打窗口的任何位置时能移动窗口。<br />UINT CRoundDlg : : OnNchitTest (Cpoint point )<br />{<br />//Let user move window by clickign anywhere on thewindow .<br />UINT nHitTest = CDialog : : OnNcHitTest (point)<br />rerurn (nHitTest = = HTCLIENT)? HTCAPTION: nHitTest<br /><br />}</p><p>（27） 如何创建和使用无模式对话框<br />MFC将模式和无模式对话封装在同一个类中，但是使用无模式对话需要几个对话需要几个额处的步骤。首先，使用资源编辑器建立对话资源并使用ClassWizard创建一个CDialog的派生类。模式和无模式对话的中止是不一样的：模式对话通过调用CDialog : : EndDialog 来中止，无模式对话则是调用CWnd: : DestroyWindow来中止的，函数CDialog : : OnOK和CDialog : : OnCancel调用EndDialog ,所以需要调用DestroyWindow并重置无模式对话的函数。<br />void CSampleDialog : : OnOK ( )<br />{<br />// Retrieve and validate dialog data .<br />if (! UpdateData (TRUE) )<br />{<br />// the UpdateData rountine<br />will set focus to correct item TRACEO (" UpdateData failed during dialog termination .\n")<br />return<br />}<br /><br />//Call DestroyWindow instead of EndDialog .<br />DestroyWindow ( )<br />}<br /><br />void CSampleDialog : : OnCancel ( )<br />{<br />//Call DestroyWindow instead of EndDialog .<br />DestroyWindow ( )<br />}<br /><br />其次，需要正确删除表示对话的C++对象。对于模式对来说，这很容易，需要创建函数返回后即可删除C++对象；无模式对话不是同步的，创建函数调用后立即返回，因而用户不知道何时删除C++对象。撤销窗口时工作框调用CWnd : : PostNcDestroy，可以重置该函数并执行清除操作，诸如删除this指针。<br />void CSampleDialog : : PostNcDestroy ( )<br />{<br />// Declete the C++ object that represents this dialog.<br />delete this<br />}<br /><br />最后，要创建无模式对话。可以调用CDialog : : DoModal创建一个模式对放，要创建一个无模式对话则要调用CDialog: : Create。下面的例子说明 了应用程序是如何创建无模式对话的： 象；无模式对话不是同步的，创建函数调用后立即返回，<br />void CMainFrame : : OnSampleDialog ( )<br />{<br />//Allocate a modeless dialog object .<br />CSampleDilog * pDialog =new CSampleDialog<br />ASSERT_VALID (pDialog) Destroy ( )<br /><br />//Create the modeless dialog . represents this dialog.<br />BOOL bResult = pDialog —&gt; Create (IDD_IDALOG)<br />ASSERT (bResult )<br />}<br /></p><p></p><p>（28） 如何防止主框窗口在其说明中显示活动的文档名<br />创建主框窗口和MDI子窗口进通常具有FWS_ADDTOTITLE风格位，如果不希望在说明中自动添加文档名， 必须禁止该风格位， 可以使用ClassWizard重置<br />CWnd: : PreCreateWindow并关闭FWS_ADDTOTITLE风格。<br />BOOL CMainFrame : : PreCreateWindow (CREATESTRUCT&amp;cs)<br />{<br />//Turn off FWS_ADDTOTITLE in main frame .<br />cs.styel &amp; = ~FWS_ADDTOTITLE 　<br />return CMDIFrameWnd : : PreCreateWindow (cs )<br />}<br />关闭MDI子窗口的FWS _ADDTOTITLE风格将创建一个具有空标题的窗口，可以调用CWnd: : SetWindowText来设置标题。记住自己设置标题时要遵循接口风格指南。</p><p><br />（30） 怎样加载其他的应用程序?<br />三个SDK函数 winexec, shellexecute,createprocess可以使用。<br />WinExec最简单，两个参数，前一个指定路径，后一个指定显示方式.后一个参数值得说一下，比如泥用 SW_SHOWMAXMIZED方式去加载一个无最大化按钮的程序，就是Neterm,calc等等，就不会出现正常的窗体，但是已经被加到任务列表里了。<br /><br />ShellExecute较 WinExex灵活一点，可以指定工作目录,下面的Example就是直接打开 c:\temp\1.txt,而不用加载与 txt文件关联的应用程序,很多安装程序完成后都会打开一个窗口，来显示Readme or Faq,我猜就是这么作的啦.<br /><br />ShellExecute(NULL,NULL,_T("1.txt"),NULL,_T("c:\\temp"),SW_SHOWMAXMIZED)<br /><br />CreateProcess最复杂，一共有十个参数，不过大部分都可以用NULL代替，它可以指定进程的安全属性，继承信息，类的优先级等等.来看个很简单的Example:<br />STARTUPINFO stinfo<br />//启动窗口的信息<br />PROCESSINFO procinfo //进程的信息<br /><br />CreateProcess(NULL,_T("notepad.exe"),NULL,NULL.FALSE,<br />NORMAL_PRIORITY_<br /><br />CLASS,NULL,NULL, &amp;stinfo,&amp;procinfo)<br /></p><p><br />（32） 如何使能和禁止工具条的工具提示<br />如果设置了CBRS_TOOLTIPS风格位，工具条将显示工具提示，要使能或者禁止工具提示，需要设置或者清除该风格位。下例通过调用CControlBar : : GetBarStyle和CControlBar : : SetBarStyle建立一个完成此功能的成员函数：<br />void CMainFrame : : EnableToolTips ( BOOL bDisplayTips )<br />{<br />ASSERT_VALID (m_wndToolBar)<br /><br />DWORD dwStyle = m _wndToolBar.GetBarStyle ( )<br /><br />if (bDisplayTips) dwStyle ｜=CBRS_TOOLTIPS<br /><br />else<br />dwStyle &amp; = ~CBRS_TOOLTIPS<br /><br />m_wndToolBar.SetBarStyle (dwStyle )<br />}<br /><br />//Get pointer to toolbar .<br />CToolBar * pToolBar = (CToolBar * ) AfxGetMainWnd ( )<br />—&gt; GetDescendantWindow(AFX_IDW_TOOLBAR)</p><p>（33） 如何设置工具条标题<br />工具条是一个窗口，所以可以在调用CWnd : : SetWindowText来设置标题，例子如下：<br />int CMainFrame : : OnCreate (LPCREATESTRUCT lpCreateStruct )<br />{<br />…<br />// Set the caption of the toolbar .<br />m_wndToolBar.SetWindowText (_T "Standdard")<br /></p><p>}<br /><br />（36） 如何改变对话或窗体视窗的背景颜色<br />调用CWinApp : : SetDialogBkColor可以改变所有应用程序的背景颜色。第一个参数指定了背景颜色，第二个参数指定了文本颜色。下例将应用程序对话设置为蓝色背景和黄色文本。<br />BOOL CSampleApp : : InitInstance ( )<br />{<br />…<br />//use blue dialog with yellow text .<br />SetDialogBkColor (RGB (0, 0, 255 ), RGB ( 255 ,255 , 0 ) )<br />…<br />}<br /><br />需要重画对话（或对话的子控件）时，Windows向对话发送消息WM_CTLCOLOR，通常用户可以让Windows选择绘画背景的刷子，也可重置该消息指定刷子。下例说明了创建一个红色背景对话的步骤。<br /><br />首先，给对话基类增加一人成员变量<br />CBursh :class CMyFormView : public CFormView<br />{<br />…<br /><br />private :<br />CBrush m_ brush // background brush<br /><br />…<br />}<br /><br />其次， 在类的构造函数中将刷子初始化为所需要的背景颜色。<br />CMyFormView : : CMyFormView ( )<br />{<br />// Initialize background brush .<br />m_brush .CreateSolidBrush (RGB ( 0, 0, 255) )<br />}<br /><br />最后，使用ClassWizard处理WM_CTLCOLOR消息并返回一个用来绘画对话背景的刷子句柄。注意：由于当重画对话控件时也要调用该函数，所以要检测nCtlColor参量。<br />HBRUSH CMyFormView : : OnCtlColor (CDC* pDC , CWnd*pWnd , UINT nCtlColor<br />)<br /><br />{<br />// Determine if drawing a dialog box . If we are, return +handle to<br />//our own background brush . Otherwise let windows handle it .<br />if (nCtlColor = = CTLCOLOR _ DLG )<br />return (HBRUSH) m_brush.GetSafeHandle ( )<br />return CFormView : : OnCtlColor (pDC, pWnd , nCtlColor<br />)<br />}</p><p></p><p>（39） 如何改变控件的字体<br />由于控件是也是窗口，用户可以调用CWnd: : SetFont指定新字体。该函数用一个Cfont指针，要保证在控件撤消之前不能撤消字体对象。下例将下压按钮的字体改为8点Arial字体：<br />//Declare font object in class declaration (.H file ).<br />private : Cfont m_font<br />// Set font in class implementation (.Cpp file ). Note m_wndButton is a<br />//member variable added by ClassWizard.DDX routines hook the member<br />//variable to a dialog button contrlo.<br />BOOL CSampleDialog : : OnInitDialog ( )<br />{<br />…<br />//Create an 8-point Arial font<br />m_font . CreateFont (MulDiv (8 , -pDC<br />—&gt; GetDeviceCaps(LOGPIXELSY) ,72). 0 , 0 , 0 , FW_NORMAL , 0 , 0,0, ANSI_CHARSER, OUT_STROKE_PRECIS ,<br /><br />CLIP_STROKE _PRECIS , DRAFT _QUALITY<br />VARIABLE_PITCH ｜FF_SWISS, _T("Arial") )<br /><br />//Set font for push button .<br />m_wndButton . SetFont (&amp;m _font )<br /><br />…<br />}</p><p>（40） 如何在OLE控件中使用OLE_COLOR数据类型<br />诸如COleControl : : GetFortColor和COleControl : : GetBackColor等函数返回OLE _COLOR数据类型的颜色，而GDI对象诸如笔和刷子使用的是COLORREF数据类型，调用COleControl : : TranslateColor可以很容易地将OLE_COLOR类型改为COLORREF类型。下例创建了一个当前背景颜色的刷子：<br /><br />void CSampleControl : : OnDraw (CDC* pdc<br />const Crect&amp; rcBounds , const Crect&amp; rcInvalid<br />)<br />{<br />//Create a brush of the cuttent background color.<br />CBrush brushBack (TranslateColor (GetBackColor () ) )<br /><br />//Paint the background using the current backgroundcolor .<br />pdc—&gt; FilllRect (rcBounds , &amp;brushBack)<br /><br />//other drawign commands<br /><br />…<br />}</p><p>（42） 为什么旋转按钮控件看起来倒转<br />需要调用CSpinCtrl : : SetRange 设置旋转按钮控件的范围，旋转按钮控件的缺省上限为0，缺省下限为100，这意味着增加时旋转按控件的值由100变为0。下例将旋转按钮控件的范围设置为0到100：<br />BOOL CAboutDlg : : OnInitDialog ( )<br />{<br />CDialog : : OnInitDialog ( )<br /><br />//set the lower and upper limit of the spin button<br />m_wndSpin . SetRange ( 0 ,100 )<br /><br />return TRUE<br />}<br /><br />Visual C++ 4.0 Print对话中的Copise旋转按钮控件也有同样的问题：按下Up按钮时拷贝的数目减少，而按下Down 按钮时拷贝的数目增加。</p><p>（43） 为什么旋转按钮控件不能自动地更新它下面的编辑控件<br />如果使用旋转按钮的autu buddy特性， 则必须保证在对话的标记顺序中buddy窗口优先于旋转按钮控件。从Layout菜单中选择Tab Order菜单项（或者按下Crtl+D）可以设置对话的标签顺序。</p><p>（44） 如何用位图显示下压按钮<br />Windows 95按钮有几处新的创建风格，尤其是BS_BITMAP和BS_ICON，要想具有位图按钮，创建按钮和调用CButton : : SetBitmap或CButton : : SetIcon时要指定BS_BITMAP或BS_ICON风格。<br /><br />首先，设置按钮的图标属性。然后，当对话初始化时调用CButton: : SetIcon。注意：下例用图标代替位图，使用位图时要小心，因为不知道背景所有的颜色——并非每个人都使用浅灰色。<br /><br />BOOL CSampleDlg : : OnInitDialog ( )<br />{<br />CDialog : : OnInitDialog ( )<br /><br />//set the images for the push buttons .<br />BOOL CSampleDlg : : OnInitDialog ( )<br />{<br />CDialog : : OnInitDialog ( )<br /><br />//set the images for the push buttons .<br />m_wndButton1.SetIcon (AfxGetApp ( ) —&gt; LoadIcon (IDI _ IPTION1))<br />m_wndButton2.SetIcon (AfxGetApp ( ) —&gt; LoadIcon (IDI _ IPTION2))<br />m_wndButton3.SetIcon (AfxGetApp ( ) —&gt; LoadIcon (IDI _ IPTION3))<br /><br />return TRUE<br />}</p><p></p><p>（45） 如何一个创建三态下压按钮<br />可以使用新的BS_PUSHBUTTON 风格位和检测框以及按钮来创建一个三态下压按钮。这很容易，只需将检测框和按钮拖拉到对话中并指定属性Push—like即可。不用任何附加程序就可以成为三态下压按钮。</p><p>（46） 如何动态创建控件<br />分配一个控件对象的实例并调用其Create成员函数。开发者最容易忽略两件事：忘记指定WS_VISBLE标签和在栈中分配控件对象。下例动态地创建一个下压按钮控件：<br />//In class declaration (.H file ).<br />private : CButton* m _pButton<br /><br />//In class implementation (.cpp file ) .<br />m_pButton =new CButton<br />ASSERT_VALID (m_pButton)<br />m_pButton —&gt;Create (_T ("Button Title ") , WS_CHILD ｜WS_VISIBLE ｜BS_PUSHBUTTON. Crect ( 0, 0, 100 , 24) , this , IDC _MYBUTTON )</p><p>（47） 如何限制编辑框中的准许字符<br />如果用户在编辑控件中只允许接收数字，可以使用一个标准的编辑控件并指定新的创建标志ES_NUMBERS,它是Windows 95新增加的标志，该标志限制 编辑控件只按收数字字符。如果用户需要复杂的编辑控件，可以使用Microsoft 的屏蔽编辑控件，它是一个很有用的OLE定制控件。<br />如果希望不使用OLE 定制控件自己处理字符，可以派生一个CEdit类并处理WM_CHAR消息，然后从编辑控件中过滤出特定的字符。首先，使用ClassWizard建立一个 CEdit的派生类，其次，在对话类中指定一个成员变量将编辑控件分类在OnInitdialog 中调用CWnd: : SubclassDlgItem .<br /><br />//In your dialog class declaration (.H file )<br />private : CMyEdit m_wndEdit // Instance of your new edit control .<br /><br />//In you dialog class implementation (.CPP file )<br />BOOL CSampleDialog : : OnInitDialog ( )<br />{<br />…<br /><br />//Subclass the edit lontrod .<br />m_wndEdit .SubclassDlgItem (IDC_EDIT,this)<br /><br />…<br />}<br /><br />使用ClassWizard处理WM_CHAR消息，计算nChar参量并决定所执行的操作，用户可以确定是否修改、传送字符。下例说明了如何显示字母字符，如果字符是字母字符，则调用CWnd OnChar，否则不调用OnChar.<br />//Only display alphabetic dharacters .<br />void CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UITN nFlags )<br />{<br />//Determine if nChar is an alphabetic character.<br />if (: : IsCharAlpha ( ( TCHAR) nChar ) )<br />CEdit : : OnChar (nChar, nRepCnt , nFlags )<br />}<br /><br />如果要修改字符，则不能仅仅简单地用修改过的nChar调用CEdit: : OnChar，然后CEdit: : OnChar调用CWnd: : Default获取原来的wParam 和lParam 的值，这样是不行的。要修改一个字符，需要首先修改nChar，然后用修改过的nChar调用CWnd: : DefWindowProc。下例说明了如何将字符转变为大写：<br />//Make all characters uppercase<br />void CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UINT nFlags )<br />{<br />//Make sure character is uppercase .<br />if (: : IsCharAlpha ( .( TCHAR) nChar)<br />nChar=: : CharUpper(nChar )<br /><br />//Bypass default OnChar processing and directly call<br />//default window proc.<br />DefWindProc (WM_CHAR, nChar , MAKELPARAM (nRepCnt, nFlags ))<br />}</p><p>（48） 如何改变控件的颜色<br />有两种方法。其一，可以在父类中指定控件的颜色，或者利用MFC4.0新的消息反射在控件类中指定颜色。 当控件需要重新着色时，工作框调用父窗口（通常是对话框）的CWnd: : OnCrtlColor,可以在父窗口类中重置该函数并指定控件的新的绘画属性。例如，下述代码将对话中的所有编辑控件文本颜色改为红色：<br />HBRUSH CAboutDig : : OnCtlColor (CDC * pDCM , CWnd * pWnd , UINT nCtlColor)<br /><br />{<br />HBRUSH hbr = CDialog : : OnCtlColor (pDC, pWnd , nCtlColor )<br /><br />//Draw red text for all edit controls .<br />if (nCtlColor= = CTLCOLOR_EDIT )<br />pDC —&gt; SetTextColor (RGB (255, 0 , 0 , ) )<br /><br />return hbr<br />}<br /><br />然而，由于每个父窗口必须处理通知消息并指定每个控件的绘画属性，所以，这种方法不是完全的面向对象的方法。控件处理该消息并指定绘画属性更合情合理。消息反射允许用户这样做。通知消息首先发送给父窗口，如果父窗口没有处理则发送给控件。创建一个定制彩色列表框控件必须遵循下述步骤。<br /><br />首先，使用ClassWizard 创建一个CListBox 的派生类并为该类添加下述数据成员。<br />class CMyListBox publilc CListBox<br />{<br />…<br />private<br />COLORREF m_clrFor // foreground color<br />COLORREF m_clrBack //background color<br />Cbrush m_brush //background brush<br />…<br />}<br />其次，在类的构造函数中，初始化数据中。<br />CMyListBox : : CMyListBox ()<br />{<br />//Initialize data members .<br />m_clrFore =RGB (255 , 255 , 0) //yellow text<br />m_clrBack=RGB (0 , 0 , 255) // blue background<br />m_brush . CreateSolidBrush (m _clrBack )<br />}<br /><br />最后，使用ClassWizard处理反射的WM_CTLCOLOR(=WM_CTLCOLOR)消息并指定新的绘画属性。<br />HBRUSH CMyListBox : : CtlColor (CDC* pDC, UINT nCtlColor )<br />{<br />pDC—&gt;SetTextColor (m_clrFore)<br />pDC—&gt;SetBkColor (m_clrBack)<br /><br />return (HBRUSH) m_brush.GetSafeHandle ()<br />}<br />现在，控件可以自己决定如何绘画，与父窗口无关。</p><p>（49） 当向列表框中添加多个项时如何防止闪烁<br />调用CWnd::SetRedraw 清除重画标志可以禁止CListBox（或者窗口）重画。当向列表框添加几个项时，用户可以清除重画标志，然后添加项，最后恢复重画标志。为确保重画列表框的新项，调用SetRedraw (TRUE) 之后调用CWnd::Invalidate。<br />//Disable redrawing.<br />pListBox-&gt;SetRedraw (FALSE)<br /><br />//Fill in the list box gere<br />//Enable drwing and make sure list box is redrawn.<br />pListBox-&gt;SetRedraw (TRUE)<br />pListBox-&gt;Invalidate ()</p><p>（50） 如何向编辑控件中添加文本<br />由于没有CEdit:: AppendText函数，用户只好自己做此项工作。调用CEdit:: SetSel移动到编辑控件末尾，然后调用CEdit:: ReplaceSel添加文本。下例是AppendText 的一种实现方法：<br /><br />void CMyEdit:: AppendText (LPCSTR pText)<br />{<br />int nLen=GetWindowTextLength ()<br />SetFocus ()<br />SetSel (nLen, nLen)<br /><br />ReplaceSel (pText)<br />}</p><p>（51） 如何访问预定义的GDI对象<br />可以通过调用CDC:: SlectStockObject使用Windows的几个预定义的对象，诸如刷子、笔以及字体。下例使用了Windows预定义的笔和刷子GDI对象在视窗中画一个椭圆。<br />//Draw ellipse using stock black pen and gray brush.<br />void CSampleView:: OnDraw (CDC* pDC)<br />{<br />//Determine size of view.<br />CRect rcView<br />GetClientRect (rcView)<br /><br />//Use stock black pen and stock gray brush to draw ellipse.<br />pDC-&gt;SelectStockObject (BLACK_PEN)<br />pDC-&gt;SelectStockObject (GRAY_BRUSH)<br />//Draw the ellipse.<br />pDC-&gt;Ellipse (reView)<br />}<br /><br />也可以调用新的SDK函数GetSysColorBrush获取一个系统颜色刷子，下例用背景色在视窗中画一个椭圆：<br />void CsampleView:: OnDraw (CDC* pDC)<br />{<br />//Determine size of view.<br />CRect rcView<br />GetClientRect (rcView)<br /><br />//Use background color for tooltips brush.<br />CBrush * pOrgBrush=pDC-&gt;SelectObject ( CBrush ::FromHandle( ::GetSysColorBrush (COLOR_INFOBK)))<br /><br />//Draw the ellipse.<br />pDC-&gt;Ellipse (rcView)<br /><br />//Restore original brush.<br />pDC-&gt;SelectObject (pOrgBrush)<br />}</p><p>（52） 如何获取GDI对象的属性信息<br />可以调用GDIObject:: GetObject。这个函数将指定图表设备的消息写入到缓冲区。下例创建了几个有用的辅助函数。<br />//Determine if font is bold.<br />BOOL IsFontBold (const CFont&amp;font)<br />{<br />LOGFONT stFont<br />font.GetObject (sizeof (LOGFONT), &amp;stFont)<br />return (stFont.lfBold)? TRUE: FALSE<br />}<br /><br />//Return the size of a bitmap.<br />CSize GetBitmapSize (const CBitmap&amp;bitmap)<br />{<br />BITMAP stBitmap<br />bitmap.GetObject (sizeof (BITMAP), &amp;stBitmap)<br />return CSize (stBitmap.bmWidth, stBitmap.bmHeight)<br />}<br /><br />//Create a pen with the same color as a brush.<br />BOOL CreatePenFromBrush (Cpen&amp;pen, cost Cbrush&amp;brush)<br />{<br />LOGBRUSH stBrush<br />brush.Getobject (sizeof (LOGBRUSH), &amp;stBrush)<br />return pen. Createpen (PS_SOLID, 0, stBrush.ibColor)<br />}</p><p>（53） 如何实现一个橡皮区矩形<br />CRectTracker是一个很有用的类，可以通过调用CRectTracker::TrackRubberBand 响应WM_LBUTTONDOWN消息来创建一个橡皮区矩形。<br />下例表明使用CRectTracker移动和重置视窗中的蓝色椭圆的大小是很容易的事情。<br /><br />首先，在文件档中声明一个CRectTracker数据成员：<br />class CSampleView : Public CView<br />{<br />…<br />public :<br />CrectTracker m_tracker<br />…<br />}<br /><br />其次，在文档类的构造函数中初始化CRectTracker 对象：<br />CSampleDoc:: CSampleDOC ()<br />{<br />//Initialize tracker position, size and style.<br />m_tracker.m_rect.SetRect (0, 0, 10, 10)<br />m_tracker.m_nStyle=CRectTracker:: resizeInside | CRectTracker ::dottedLine<br />}<br /><br />然后，在OnDraw函数中画椭圆和踪迹矩形：<br />void CSampleView:: OnDraw (CDC* pDC)<br />{<br />CSampleDoc* pDoc=GetDocument ()<br />ASSERT_VALID (pDoc)<br /><br />//Select blue brush into device context.<br />CBrush brush (RGB (0, 0, 255))<br />CBrush* pOldBrush=pDC-&gt;SelectObject (&amp;brush)<br /><br />//draw ellipse in tracking rectangle.<br />Crect rcEllipse<br />pDoc-&gt;m_tracker.GetTrueRect (rcEllipse)<br />pDC-&gt;Ellipse (rcEllipse)<br /><br />//Draw tracking rectangle.<br />pDoc-&gt;m_tracker.Draw (pDC)<br />//Select blue brush out of device context.<br />pDC-&gt;Selectobject (pOldBrush)<br />}<br /><br />最后，使用ClassWizard处理WM_LBUTTONDOWN消息，并增加下述代码。该段代码根据鼠标击键情况可以拖放、移动或者重置椭圆的大小。<br />void CSampleView::OnLButtonDown (UINT nFlags, CPoint point)<br />{<br />//Get pointer to document.<br />CSampleDoc* pDoc=GetDocument ()<br />ASSERT_VALID (pDoc)<br /><br />//If clicked on ellipse, drag or resize it.Otherwise create a<br />//rubber-band rectangle nd create a new ellipse.<br />BOOL bResult=pDoc-&gt;m_tracker.HitTest (point)!= CRectTracker::hitNothing<br /><br />//Tracker rectangle changed so update views.<br />if (bResult)<br />{<br />pDoc-&gt;m_tracker.Track (this,point,TRue)<br />pDoc-&gt;SetModifiedFlag ()<br />pDoc-&gt;UpdateAllViews (NULL)<br />}<br /><br />else<br />pDoc-&gt;m-tracker.TrackRubberBand(this,point,TRUE)<br />CView:: onLButtonDown (nFlags,point)<br />}</p><p>（54） 如何更新翻转背景颜色的文本<br />调用CDC:: SetBkmode并传送OPAQUE用当前的背景颜色填充背景，或者调用CDC::SetBkMode并传送TRANSPAARENT使背景保持不变，这两种方法都可以设置背景模式。下例设置背景模式为TRANSPARENT，可以两次更新串，用花色带黑阴影更新文本。黑色串在红色串之后，但由于设置了背景模式仍然可见。<br /><br />void CSampleView:: OnDraw (CDC* pDC)<br />{<br />//Determint size of view.<br />CRect rcView<br />GetClientRect (rcVieew)<br /><br />//Create sample string to display.<br />CString str (_T ("Awesome Shadow Text．．．"))<br />//Set the background mode to transparent.<br />pDC-&gt;SetBKMode (TRANSPARENT)<br /><br />//Draw black shadow text.<br />rcView.OffsetRect (1, 1)<br />pDc-&gt;SetTextColor (RGB (0, 0, 0))<br />pDC-&gt;DrawText (str, str.GetLength (), rcView, DT_SINGLELINE | DT_CENTER | DT_VCENTER)<br /><br />//Draw red text.<br />rcView.OffsetRect (-1,-1)<br />pDc-&gt;SetTextColor (RGB (255, 0, 0))<br />pDC-&gt;DrawText (str, str.GetLength (), rcView, DT_SINGLELINE | DT_CENTER | DT_VCENTER)<br /><br />}</p><p>（55） 如何创建一个具有特定点大小的字体<br />可以指定字体逻辑单位的大小，但有时指定字体的点的大小可能会更方便一些。可以如下将字体的点转换为字体的高度：<br /><br />int nHeigth=mulDiv (nPointSize, -dc.GetDeviceCaps (LOGPIXELSY), 72)<br />下例创建了一个8点的Apial字体：<br />…<br />CClientDC dc (AqfxGetMainWnd ())<br /><br />m_font. CreateFont (MulDiv (8, -dc.GetDeviceCaps (LOGPIXELSY), 72), 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, OUT_STROKE_PRECIS, CLIP_STROKE_PRECIS, DRAFT_QUALITY, VARIABLE_PITCH | FF-SWISS,_T("Arial"))</p><p>（56） 如何计算一个串的大小<br />函数CDC:: Det text Extent 根据当前选择的字体计算一个串的高度和宽度。如果使用的不是系统字体而是其他字体，则在调用GetTextExtent之前将字体选进设备上下文中是很重要的，否则计算高度和宽度时将依据系统字体，由此得出的结果当然是不正确的。下述样板程序当改变下压按钮的标题时动态调整按钮的大小，按钮的大小由按钮的字体和标题的大小而定。响应消息WM_SETTEXT时调用OnSetText，该消息使用ON_MESSAE宏指令定义的用户自定义消息。<br /><br />LRESULT CMyButton:: OnSettext (WPARAM wParam, LPARAM lParam)<br />{<br />//Pass message to window procedure.<br />LRESULT bResult=CallWindowProc (*GetSuperWndProcAddr(), m_hWnd, GetCurrentMessage() -&gt;message,wParam,lParam)<br />//Get title of push button.<br />CString strTitle<br />GetWindowText (strTitle)<br /><br />//Select current font into device context.<br />CDC* pDC=GetDc ()<br />CFont*pFont=GetFont ()<br />CFont*pOldFont=pDC-&gt;SelectObject (pFont)<br /><br />//Calculate size of title.<br />CSize size=pDC-&gt;GetTextExent (strTitle,strTitle.GetLength())<br /><br />//Adjust the button's size based on its title.<br />//Add a 5-pixel border around the button.<br />SetWindowPos (NULL, 0, 0, size.cx+10, size.cy+10, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE)<br />//Clean up.<br />pDC-&gt;SelectFont (pOldFont)<br />ReleaseDC (pDC)<br /><br />return bResult<br />}<br /></p><p>（57） 如何显示旋转文本<br />只要用户使用TrueType或者GDI笔或字体就可以显示旋转文本(有些硬件设备也支持旋转光栅字体）。LOGFONT结构中的ifEscapement成员指定了文本行和x轴的角度，角度的单位是十分之一度而不是度，例如，ifEscapement为450表示字体旋转45度。为确保所有的字体沿坐标系统的同一方向旋转，一定要设置ifEscapement成员的CLIP_LH_ANGLES位，否则，有些字体可能反向旋转。下例使用了14点Arial字体每间隔15度画一个串。<br />void CSampleView:: OnDraw (CDC* pDC)<br />{<br />//Determine the size of the window.<br />CRect rcClient<br />GetClientRect (rcClient)<br /><br />//Create sample string.<br />CString str (_T ("Wheeee．．．I am rotating!"))<br />//Draw transparent, red text.<br />pDC-&gt;SetBkMode (TRANSPARENT)<br />pDC-&gt;SetTextColor (RGB (255,0,0))<br />CFont font<br />//font object<br />LOGFONT stFont //font definition<br />//Set font attributes that will not change.<br />memset (&amp;stFont, 0, sizeof (LOGFONT))<br />stFont.ifheight=MulDiv (14, -pDC-&gt;GetDeviceCaps(LOGPIXELSY), 72)<br />stFont.ifWeight=FW_NORMAL<br />stFont.ifClipPrecision=LCIP_LH_ANGLES<br />strcpy (stFont.lfFaceName, "Arial")<br /><br />//Draw text at 15degree intervals.<br />for (int nAngle=0 nAngle&lt;3600 nAngle+=150)<br />{<br />//Specify new angle.<br />stFont.lfEscapement=nAngle<br /><br />//Create and select font into dc.<br />font.CreateFontIndirect(&amp;stfont)<br />CFont* pOldFont=pDC -&gt;SelectObject(&amp;font)<br /><br />//Draw the text.<br />pDC-&gt;SelectObject(pOldFont)<br />font.DelectObjext()<br />}<br />}</p><p></p><p>（58） 如何正确显示包含标签字符的串<br />调用GDI文本绘画函数时需要展开标签字符，这可以通过调用CDC:: TabbedTextOut或者CDC:: DrawText并指定DT_EXPANDTABS标志来完成。TabbedTextOut函数允许指定标签位的数组，下例指定每20设备单位展开一个标签：<br /><br />void CSampleView:: OnDraw (CDC* pDC)<br />{<br />CTestDoc* pDoc=GetDocument ()<br />ASSERT_VALID (pDoC)<br /><br />CString str<br />str.Format (_T ("Cathy\tNorman\tOliver"))<br />int nTabStop=20 //tabs are every 20 pixels<br />pDC-&gt;TabbedtextOut (10, 10, str, 1, &amp;nTabStop, 10)<br />}</p><p>（59） 如何快速地格式化一个CString对象<br />调用CString:: Format，该函数和printf函数具有相同的参数，下例说明了如何使用Format函数：<br /><br />//Get size of window.<br />CRect rcWindow<br />GetWindowRect (rcWindow)<br />//Format message string.<br />CString strMessage<br />strMessage.Format (_T ("Window Size (%d, %d)"),<br /><br />rcWindow.Width (), rcWindow.Height ())<br /><br />//Display the message.<br />MessageBox (strmessage)</p><p>（60） 串太长时如何在其末尾显示一个省略号<br />调用CDC:: DrawText并指定DT_END_ELLIPSIS标志，这样就可以用小略号取代串末尾的字符使其适合于指定的边界矩形。如果要显示路径信息，指定DT_END_ELLIPSIS标志并省略号取代串中间的字符。<br /><br />void CSampleView:: OnDraw (CDC* pDC)<br />{<br />CTestDoc* pDoc=GetDocument ()<br />ASSERT_VALID (pDoc)<br /><br />//Add ellpsis to end of string if it does not fit<br />pDC-&gt;Drawtext (CString ("This is a long string"), CRect (10, 10, 80, 30), DT_LEFT | DT_END_ELLIPSIS)<br /><br />//Add ellpsis to middle of string if it does not fit<br />pDC-&gt;DrawText (AfxgetApp () -&gt;m_pszhelpfilePath, CRect (10, 40, 200, 60), DT_LEFT | DT_PATH_ELLIPSIS)<br />}<br /></p><p>（61） 为什么即使调用EnableMenuItem菜单项后，菜单项还处于禁止状态<br />需要将CFrameWnd:: m_bAutomenuEnable设置为FALSE，如果该数据成员为TRUE（缺省值），工作框将自动地禁止没有ON_UPDATE_COMMAND_UI或者ON_COMMAND的菜单项。<br /><br />//Disable MFC from automatically disabling menu items.<br />m_bAuoMenuEnable=FALSE<br />//Now enable the menu item.<br />CMenu* pMenu=GetMenu ()<br />ASSERT_VALID (pMenu)<br /><br />pMenu-&gt;EnableMenuItem (ID_MENU_ITEM,MF_BYCOMMAND | MF_ENABLED)</p><p></p><p>（62） 如何给系统菜单添加一个菜单项<br />给系统菜单添加一个菜单项需要进行下述三个步骤：<br />首先，使用Resource Symbols对话（在View菜单中选择Resource Symbols．．．可以显示该对话）定义菜单项ID，该ID应大于0x0F而小于0xF000；<br />其次，调用CWnd::GetSystemMenu获取系统菜单的指针并调用CWnd:: Appendmenu将菜单项添加到菜单中。下例给系统菜单添加两个新的<br />int CMainFrame:: OnCreate (LPCREATESTRUCT lpCreateStruct)<br />{<br />…<br />//Make sure system menu item is in the right range.<br />ASSERT (IDM_MYSYSITEM &amp;0xFFF0)==IDM_MYSYSITEM)<br />ASSERT (IDM-MYSYSITEM&lt;0xF000)<br /><br />//Get pointer to system menu.<br />CMenu* pSysmenu=GetSystemmenu (FALSE)<br />ASSERT_VALID (pSysMenu)<br />//Add a separator and our menu item to system menu.<br />CString StrMenuItem (_T ("New menu item"))<br />pSysMenu-&gt;Appendmenu (MF_SEPARATOR)<br />pSysMenu-&gt;AppendMenu (MF_STRING, IDM_MYSYSITEM, strMenuitem)<br /><br />…<br />}<br /><br />现在，选择系统菜单项时用户应进行检测。使用ClassWizard处理WM_SYSCOMMAND消息并检测用户菜单的nID参数：<br />void CMainFrame:: OnSysCommand (UINT nID,LPARAM lParam)<br />{<br />//Determine if our system menu item was selected.<br />if ( (nID &amp; 0xFFF0)==IDM_MYSYSITEM)<br />{<br />//TODO-process system menu item<br />}<br /><br />else<br />CMDIFrameWnd ::OnSysCommand (nID, lParam)<br />}<br />最后，一个设计良好的UI应用程序应当在系统菜单项加亮时在状态条显示一个帮助信息，这可以通过增加一个包含系统菜单基ID的串表的入口来实现。</p><p>（63） 如何确定顶层菜单所占据的菜单行数<br />这可以通过简单的减法和除法来实现。首先，用户需要计算主框窗口的高度和客户区；其次，从主框窗口的高度中减去客户区、框边界以及标题的高度；最后，除以菜单栏的高度。下例成员函数是一个计算主框菜单所占据的行数的代码实现。<br /><br />int CMainFrame:: GetMenuRows ()<br />{<br />CRect rcFrame,rcClient<br />GetWindowRect (rcFrame)<br />GetClientRect (rcClient)<br />return (rcFrame.Height () -rcClient.Height () - :: GetSystemMetrics(SM_CYCAPTION) - (:: getSystemMetrics(SM_CYFRAME) *2)) / :: GetSystemMetrics(SM_CYMENU)<br />}</p><p>（64） 在用户环境中如何确定系统显示元素的颜色<br />调用SDK函数GetSysColor可以获取一个特定显示元素的颜色。下例说明了如何在MFC函数CMainFrameWnd:: OnNcPaint中调用该函数设置窗口标题颜色。<br /><br />void CMiniFrameWnd:: OnNcPaint ()<br />{<br />…<br />dc.SetTextColor (:: GetSysColor (m_bActive ? COLOR_CAPTIONTEXT : COLOR_INACTIVECAPTIONTEXT))<br />…</p><p></p><p>（65） 如何查询和设置系统参数<br />在Windows 3.1 SDK中介绍过SDK函数SystemParametersInfo，调用该函数可以查询和设置系统参数，诸如按键的重复速率设置、鼠标双击延迟时间、图标字体以及桌面覆盖位图等等。<br /><br />//Create a font that is used for icon titles.<br />LOGFONT stFont<br />∶: SystemParametersInfo (SPIF_GETICONTITLELOGFONT, sizeof (LOGFONT), &amp;stFont, SPIF_SENDWININICHANGE)<br />m_font.CreateFontIndirect (&amp;stFont)<br /><br />//Change the wallpaper to leaves.bmp.<br />∶ : SystemParametersInfo (SPI_SETDESKWALLPAPER, 0, _T (" forest.bmp"), SPIF_UPDATEINIFILE)</p><p></p><p>（66） 如何确定当前屏幕分辨率<br />调用SDK函数GetSystemMetrics，该函数可以检索有关windows显示信息，诸如标题大小、边界大小以及滚动条大小等等。<br /><br />//Initialize CSize object with screen size.<br />CSize sizeScreen (GetSystemMetrics (SM_CXSCREEN),<br />GetSystemMetrics (SM_CYSCREEN))</p><p></p><p>（67） 如何使用一个预定义的Windows光标<br />调用CWinApp:: LoadStandardCursor并传送光标标识符。<br />BOOL CSampleDialog:: OnSetCursor (CWnd* pWnd,<br />UINT nHitTest, UINT<br />message)<br />{<br />//Display wait cursor if busy.<br />if (m_bBusy)<br />{<br />SetCursor (AfxGetApp () -&gt;LoadStandardCursor (IDC_WAIT))<br />return TRUE<br />}<br /><br />return CDialog:: OnSetCursor (pWnd. nHitTest,message)<br />}</p><p>（68） 如何检索原先的Task Manager应用程序使用的任务列表<br />原先的Task Manager应用程序显示顶层窗口的列表。为了显示该列表，窗口必须可见、包含一个标题以及不能被其他窗口拥有。调用CWnd:: GetWindow可以检索顶层窗口的列表，调用IsWindowVisible、GetWindowTextLength以及GetOwner可以确定窗口是否应该在列表中。下例将把TaskManager窗口的标题填充到列表中。<br /><br />void GetTadkList (CListBox&amp;list)<br />{<br />CString strCaption<br />//Caption of window.<br /><br />list.ResetContent ()<br />//Clear list box.<br /><br />//Get first Window in window list.<br />ASSERT_VALID (AfxGetMainWnd ())<br />CWnd* pWnd=AfxGetMainWnd () -&gt;GetWindow (GW_HWNDFIRST)<br /><br />//Walk window list.<br />while (pWnd)<br />{<br />// I window visible, has a caption, and does not have an owner?<br />if (pWnd -&gt;IsWindowVisible()<br />&amp;&amp; pWnd -&gt;GetWindowTextLength ()<br />&amp;&amp;! pWnd -&gt;GetOwner ())<br />{<br /><br />//Add caption o window to list box.<br /><br />pWnd -&gt;GetWindowText (strCaption)<br /><br />list.AddString (strCaption)<br />}<br />//Get next window in window list.<br />pWnd=pWnd -&gt;GetWindow(GW_HWNDNEXT)<br />}<br />}</p><p>（69） 如何确定Windows和Windows系统目录<br />有两个SDK函数可以完成该功能。GetWindowsDirectory和GetSystemDirectory，下例说明了如何使用这两个函数：<br /><br />TCHAR szDir [MAX_PATH]<br />//Get the full path of the windows directory.<br />∶ : GetWindowsDirectory (szDir, MAX_PATH)<br />TRACE ("Windows directory %s\n", szDir)<br />//Get the full path of the windows system directory.<br />∶ : GetSystemDirectory (szDir, MAX_PATH)<br />TRACE ("Windows system directory %s\n", szDir)</p><p>（70） 在哪儿创建临文件<br />调用SDK函数GetTemPath可以确定临时文件的目录，该函数首先为临时路径检测TMP环境变量：如果没有指定TMP，检测TMP环境变量，然后返回到当前目录。下例说明了如何创建一个临时文件。<br /><br />…<br />//get unique temporary file.<br />CString strFile<br />GetUniqueTempName (strFile)<br />TRY<br />{<br />//Create file and write data.Note that file is closed<br />//in the destructor of the CFile object.<br />CFile file (strFile,CFile ::modeCreate | Cfile:: modeWrite)<br /><br />//write data<br />}<br /><br />CATCH (CFileException, e)<br />{<br />//error opening file<br />}<br />END_CATCH<br />…<br /><br />Void GetuniqueTempName (CString&amp; strTempName)<br />{<br />//Get the temporary files directory.<br />TCHAR szTempPath [MAX_PATH]<br />DWORD dwResult=:: GetTempPath (MAX_PATH, szTempPath)<br />ASSERT (dwResult)<br /><br />//Create a unique temporary file.<br />TCHAR szTempFile [MAX_PATH]<br />UINT nResult=GetTempFileName (szTempPath, _T ("~ex"),0,szTempfile)<br />ASSERT (nResult)<br /><br />strTempName=szTempFile<br />}</p><p>（71） 我怎样才能建立一个等待光标?<br />调 用 BeginWaitCursor 函 数 来 启 动 等 待 光 标，调 用 EndWaitCursor 函 数 来 结 束 等 待 光 标。要 注 意，二 者 都 要 调 用 app 的 成 员 函 数，如 下 所 示:<br /><br />    AfxGetApp()-&gt;BeginWaitCursor();<br />    // 要做的事<br />    AfxGetApp()-&gt;EndWaitCursor();</p><p>（72） 我在MDI框架中有个 form 视窗。它有个取消按钮，我需要当用户按取消按钮时可关闭form视窗。我应该如何关闭该文档?<br />调 用 OnCloseDocument 函 数。</p><p>（73） 如何访问桌面窗口<br />静态函数CWnd:: GetDesktopWindow 返回桌面窗口的指针。下例说明了MFC函数CFrameWnd::BeginModalStae是如何使用该函数进入内部窗口列表的。<br /><br />void CFrameWnd::BeginModalState ()<br />{<br />…<br />//first count all windows that need to be disabled<br />UINT nCount=0<br />HWND hWnd= :: GetWindow (:: GetDesktopWindow(), GW_CHILD)<br />while (hWnd!=NULL)<br />{<br />if (:: IsWindowEnabled (hwnd)<br />&amp;&amp; CWnd::FromHandlePermanent (hWnd)!=NULL<br />&amp;&amp; AfxIsDescendant (pParent-&gt;m_hWnd, hWnd)<br />&amp;&amp; :: SendMessage (hWnd, WM_DISABLEMODAL, 0, 0)==0)<br />{<br />++nCount<br />}<br />hWnd=:: GetWindow (hWnd, GW_HWNDNEXT)<br />}<br />…</p><p></p><p> </p><p>（76） 我在我的程序中是了CDWordArray。我向它添加了约10,000个整数，这使得它变得非常非常慢。为什么会这么糟?<br />CDWordArray 是 很 好 用 的，只 是 因 为 你 没 有 指 定 数 组 的最大尺寸。因 此，当 你 添 加 新 元 素 时，该 类 会 从 堆 中 重 新 分 配 空 间。不 幸 的 是，该 类 会 在 每 次 插 入 新 元 素 时 都 为 数 组 重 新 分 配 空 间。如 果 你 向 它 添 加 了 很 多 新 元 素，所 有 这 些 分 配 和 复 制 数 组 的 操 作 会 就 会 使 它 变 慢。解 决 该 问 题 的 方 法 是，你 可 以 使 用 SetSize 函 数 的 第 二 个 参 数 来 改 变 这 种 重 新 分 配 的 频 率。例 如，如 果 你 把 该 参 数 设 置 为 500，则 每 次 数 组 空 间 超 出 时 它 才 重 新 分 配 并 添 加 500 个 新 空 间，而 不 是 1 个。这 样 一 来，你 就 可 以 不 用 重 新 分 配 而 添 加 了 另 外 499 个 元 素 空 间，这 也 会 大 大 提 高 程 序 的 运 行 速 度。</p><p></p><p>（77） 我该如何改变MDI框架窗口的子窗口的大小以使在窗口以一定的大小打开?<br />在 视 中 的 OnInitialUpdate 函 数 中 调 用 GetParentFrame 函 数。GetParentFrame 会 返 回 一 指 向 一 保 存 有 该 视 的 框 架 窗 口 的 指 针。然 后 调 用 在 框 架 窗 口 上 调 用 MoveWindow。</p><p>（78） 在我的程序的某些部分，我可以调用 MessageBox 函数来建立一个信息对话框，例如在视类中。但是，在其它部分我却不能，如文档类中。为什么？我怎样才能在我的应用程序类中建立一个信息对话框？<br />MessageBox 函 数 来 自 CWnd 类，所 以 你 只 能 在 从 CWnd 继 承 的 类 ( 如 CView ) 中 调 用 它。但 是，MFC 也 提 供 了 AfxMessageBox 函 数，你 可 以 在 任 何 地 方 调 用 它。</p><p></p><p>（79） 我需要在我的程序中设置全局变量，以使文档中的所有类都能访问。我应该吧它放到哪儿?<br />把 该 变 量 放 到 该 应 用 程 序 类 的 头 文 件 中 的 attribute 处。然 后，在 程 序 的 任 何 地 方，你 都 可 以 用 下 面 的 方 法 来 访 问 该 变 量：<br /><br />    CMyApp *app = (CMyApp *)AfxGetApp();<br />    app-&gt;MyGlobalVariable = ...</p><p><br />（81） 我怎样才能在我的应用程序中循环浏览已经打开的文档?<br />使用CDocTemplate中未公开的GetFirstDocPosition()和GetNextDoc()函数。 </p><p></p><p>（82）才能在我的应用程序中循环浏览已经打开的视?<br />使 用 CDocument 中 未 公 开 的 GetFirstViewPosition() 和 GetNextView() 函 数。</p><p>（83）数PreCreateWindow是干什么用的?<br />PreCreateWindow 允 许 你 在 调 用 CreateWindow 之 前 来 改 变 窗 口 属 性。</p><p>（84）该怎样防止MFC在窗口标题栏上把文档名预置成应用程序名?<br />在 PreCreateWindow 函 数 中 删 除 FWS_PREFIXTITLE 标 志 的 窗 口 样 式：<br /><br />    cs.style &amp;= ~FWS_PREFIXTITLE;</p><p></p><p>（85） 我应该怎样防止MFC在窗口标题栏上添加文档名?<br />在 PreCreateWindow 函 数 中 删 除 FWS_ADDTOTITLE 标 志 的 窗 口 样 式：<br /><br />    cs.style &amp;= ~FWS_ADDTOTITLE ;</p><p></p><p>（86） 我应该如何改变视窗口的大小?<br />因 为 视 窗 口 实 际 上 是 框 架 窗 口 的 子 窗 口，所 以 你 必 须 改 变 框 架 窗 口 的 大 小，而 不 是 改 变 视 窗 口。使 用 CView 类 中 的 GetParentFrame() 函 数 获 得 指 向 框 架 窗 口 的 指 针，然 后 调 用 MoveWindow() 函 数 来 改 变 框 架 的 大 小。这 会 使 变 尺 寸 的 视 充 满 框 架 窗 口。</p><p>（87） 我有一无模式对话框。我怎样才能在窗口退出时删除CDialog对象?<br />把“delete this”加 到 PostNcDestroy 中。这 主 要 用 在 需 要 自 动 删 除 对 象 的 场 合。</p><p></p><p>（88） 为什么把“delete this”放在PostNcDestroy中而不是OnNcDestroy?<br />OnNcDestroy 只 被 已 建 立 的 窗 口 调 用。如 果 建 立 窗 口 失 败 ( 如 PreCreateWindow )，则 没 有 窗 口 处 来 发 送 WM_NCDESTROY 消 息。PostNcDestroy 是 在 对 象 窗 口 被 完 全 删 除，在 OnNcDestroy 后，甚 至 在 窗 口 建 立 失 败 之 后 调 用 的。</p><p></p><p>（89） File菜单中的MRU列表是从哪儿来的？列表中的名字放在哪儿了？我怎样才能改变列表中项目的最大值？<br />在 应 用 程 序 类 的 InitInstance 函 数 中 对 LoadStdProfileSettings 的 调 用 中。该 调 用 接 受 一 个 参 数 ( 在 缺 省 情 况 下 如 果 没 有 传 递 值 则 为 4 )。MRU 文 件 名 是 从 INI 文 件 中 调 用 的。如 果 你 有 带 有 ID_FILE_MRU_FILE1 的 ID 的 菜 单 选 项，它 会 为 调 入 的 MRU 列 表 所 替 换。如 果 你 改 变 传 递 给 LoadStdProfileSettings 的 数 值 ( 最 大 为 16 )，则 你 就 改 变 了 所 装 如 文 件 名 的 最 大 值。</p><p>（90） 我在菜单中添加了新的项。但是，当我选该项时，在状态栏上没有出现任何提示信息。为什么?<br />打 开 资 源 文 件 中 的 菜 单 模 板。打 开 新 菜 单 选 项 的 属 性 对 话 框。在 对 话 框 的 底 部 的 Prompt 编 辑 框 中 ，你 可 以 如 下 指 定 状 态 栏 上 的 提 示 信 息 和 工 具 栏 上 的 提 示 信 息 ( 如 果 你 已 经 建 立 的 工 具 栏 按 钮 ):<br /><br />    Status bar string\nFlying tag<br /></p><p>（92） 我建立了一个对话框。但是当我显示该对话框时，第一个编辑框总是不能获得焦点，我必须单击它来使它获得焦点。我怎样才能使第一个编辑框在对话框打开时就获得焦点?<br />打 开 资 源 编 辑 器 中 的 对 话 框 模 板。在 Layout 菜单 中 选 择 Tab Order 选 项。按 你 的 需 求 单 击 对 话 框 中 的 控 制 来 重 新 排 列 这 些 控 制 的 tab 顺 序。</p><p>（93） 我怎样才能使一个窗口具有“always on top”特性?<br />在 调 用 OnFileNew 后，在 你 的 InitInstance 函 数 中 加 上 下 面 的 代 码：<br /><br />m_pMainWnd-&gt;SetWindowPos(&amp;CWnd::wndTopMost,0,0,0,0, SWP_NOMOVE | SWP_NOSIZE);</p><p>(94)   我要为我的form view添加文档模板。我先建立了对话框模板，然后使用ClassWizard建立了基于CFormView的新类，它也是从CDocument继承来的。我还建立了相应的资源并在InitInstance中添加了新的文档模板。但是，当我试图运行该程序时，出现了Assertion信息。为什么?</p><p>form 的 对 话 框 模 板 需 要 些 特 殊 设 置 以 便 可 用 于 CFromView。确 保 这 些 设 置 的 最 简 单 方 法 是 使 用 AppWizard 来 建 立 CFormView 应 用 程 序，并 查 看 AppWizard 所 建 立 的 对 话 框 模 板 所 选 择 的Styles Properties。你 会 发 现 该 对 话 框 模 板 具 有 下 列 样 式：没 有 标 题 栏、不 可 见 和“Child”。把 你 的 form view 的 对 话 框 属 性 变 成 这 样 就 可 以 了。<br /><br />(95)   我在一对话框中有一列表框，我需要tabbed列表框中的项目。但是，当我处理含有tab字符(用AddString添加的)的列表项时，tab被显示成小黑块而没有展开。哪儿出错了?</p><p>在 对 话 框 模 版 中，打 开 列 表 框 的 属 性。确 保 选 择 了“Use Tabstops” 样 式。然 后，确 保 在 对 话 框 类 中 OnInitDialog 函 数 中 调 用 SetTabStops。<br /><br />(96)  我建立了一个应用程序，并使用了CRecordset类。但是，当我运行该程序时，它试图要访问数据库，并给出“Internal Application Error”对话框。我应该怎样做?</p><p>通 常 情 况 下，当 你 的 程 序 中 向 数 据 库 发 送 信 息 的 SQL 语 句 出 现 问 题 时 才 出 现 该 对 话 框。例 如，参 见 下 面 的 例 子：<br /><br />    set.m_strFilter = "(ZipCode = '27111')";<br />如 果 ZipCode 列 被 定 义 为 字 符 串 时 不 会 出 现 问 题，如 果 定 义 为 long，则 会 出 现“Internal Application Error”对 话 框，这 是 由 于 类 型 不 匹 配 的 缘 故。如 果 你 删 除 27111 的 单 引 号，则 不 会 出 现 问 题。当 你 看 到“Internal Application Error”时，最 好 检 查 一 下 试 图 要 发 送 给 数 据 库 的 SQL 语 句。<br /></p><p>(98)     当我打开应用程序中的窗口时，我要传递该窗口的矩形尺寸。该矩形指定了窗口的外围大小，但是当我调用GetClientRect时，所得到的尺寸要比所希望的值要小(因为工具栏和窗口边框的缘故)。有其它方法来计算窗口的尺寸吗?</p><p>参 见 CWnd::CalcWindowRect。<br /><br />(99)   我在文档类中设置了一个整型变量。但是，当我试图把该变量写入Serialize函数中的archive文件中时，出现了类型错误。而文档中的其它变量没有问题。为什么?</p><p>archive 类 只 重 载 某 些 类 型 的 &gt;&gt; 和 &lt;&lt; 操 作 符。“int”类 型 没 有 在 其 中，也 许 是 因 为 int 变 量 在 Windows 3.1 与 Windows NT/95 有 所 不 同 的 缘 故 吧。“long”类 型 得 到 了 支 持，所 以 你 可 以 把 int 类 型 改 成 long 型。参 见 MFC 帮 助 文 件 中 CArchive 类。<br /></p><p><br />(100)  如何控制菜单的大小?<br />我用MFC的CMenu生成了一个动态菜单(例如File,Edit,View...Help), 我想控制这个菜单的大小(长+高).</p><p>方法一:查找 WM_MEASUREITEM 和 MEASUREITEMSTRUCT.<br />方法二:查询系统::GetSystemMetric(SM_CXMENUSIZE).</p><p>     /* 你可以通过如下代码来获得文本的大小:<br />        (A)获得被使用的字体 */</p><p>       NONCLIENTMETRICS ncm;<br />     HFONT hFontMenu;<br />     SIZE size;<br />     size.cy = size.cy = 0;</p><p>     memset(&amp;ncm, 0, sizeof(NONCLIENTMETRICS));<br />     ncm.cbSize = sizeof(NONCLIENTMETRICS);<br />     if (SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &amp;ncm, 0))<br />     {<br />          hFontMenu = CreateFontIndirect(&amp;ncm.lfMenuFont);<br />          /*<br />          (B) 获得菜单项的文本: */<br />          char szText[_MAX_PATH];</p><p>          pMenu-&gt;GetMenuString(0, szText, _MAX_PATH, MF_BYPOSITION);<br />          /*<br />          然后,获得菜单项文本的高度: */<br />          HFONT hFontOld;<br />          HDC hDC;</p><p>          hDC = ::GetDC(NULL);<br />          hFontOld = (HFONT) ::SelectObject(hDC, hFontMenu);<br />          GetTextExtentPoint32(hDC, szText, lstrlen(szText), &amp;size);<br />          SelectObject(hDC, hFontOld);<br />          ::ReleaseDC(NULL, hDC);<br />     }<br />     /*此时,size.cy即为高度,size.cx为宽度,你可以给菜单加上自定义的高度和宽度,通过比较,我发现宽度为4</p><p>比较合适。*/</p><p><br />(101)  改变LVIS_SELECTED的状态颜色?<br />我想将CListCtrl项和CTreeCtrl项在LVIS_SELECTED状态时的颜色变灰.</p><p>方法一:查找函数CustomDraw,它是IE4提供的公共控制,允许有你自己的代码.<br />方法二:生成一个draw控件,然后在DrawItem中处理文本颜色.</p><p>(102)   如何只存储文档的某一部分?<br />我只想存储文档的某一部分,能否象使用文件一样使用文档?(也就是有定位函数).将每个CArchive类设置为CFile类的派生类,这样你就能使用Seek等成员函数.</p><p>(103)   保存工具条菜单有bug吗?<br /></p><p>使用浮动菜单条时,SaveBarState和LoadBarState出现了问题.如果菜单是浮动的,重起应用程序时它会出现在左上角,而它固定在屏幕其它位置时,下一次启动就会出现在该位置,这是什么原因?你试试这个PToolBar-&gt;Create(this,...,ID_MYTOOLBAR);<br />你的工具条需要包括id,而不是象默认的工具条那样.</p><p>(104)   Tip of the day的bug</p><p>我创建了一个简单的mdi应用程序,使用.BSF(自定义的文档扩展名)作为它的文档我保存一个foo.bsf文档后,可以在资源管理器中双击该文件打开mdi应用程序同时打开foo.bsf文档.但当我给mdi应用程序加上a tip of the day组件之后,从资源管理器中双击foo.bsf后,就会给我一个警告:ASSERT(::IsWindow(m_hWnd)),然后mdi应用程序就死那了.<br /><br />当从dde启动应用程序(例如:双击相关文档)时,"Tip of the Day"是有bug的.你可以看看函数"ShowTipAtStartup",它在"InitInstance"中调用,可以看到tip of the day作为一个模式对话框显示,在处理其它消息时它一直进行消息循环你可心修改ShowTipAtStartup使其从dde启动时不出现tip of the day.<br />void CTipOfApp::ShowTipAtStartup(void)<br />        {<br />                // CG: This function added by 'Tip of the Day' component.<br /><br />                CCommandLineInfo cmdInfo;<br />                ParseCommandLine(cmdInfo);<br /><br />                if (<br />                        cmdInfo.m_bShowSplash &amp;&amp;<br />                        cmdInfo.m_nShellCommand != CCommandLineInf:FileDDE<br />                        )<br />                {<br />                        CTipDlg dlg;<br />                        if (dlg.m_bStartup)<br />                                dlg.DoModal();<br />                }<br />        }<br />如果还有其它bug,你可以设定cmdInfo.m_nShellCommand的过滤.<br /><br />(105)   如何可以让我的程序可以显示在其它的窗口上面?<br /><br />让用户选择"总是在最上面"最好是在系统菜单里加入一个选项.可以通过修改WM_SYSCOMMAND消息来发送用户的选择.菜单的命令标识(id)会作为一个参数传给OnSysCommand().要定义标识(id),将如下代码加入到CMainFrame.CPP中:<br /><br />    #define WM_ALWAYSONTOP WM_USER + 1<br />将"总在最上面"的菜单项加入到系统菜单中,将如下代码加入到函数CMainFrame::OnCreate()中:<br /><br />      CMenu* pSysMenu = GetSystemMenu(FALSE);<br />      pSysMenu-&gt;AppendMenu(MF_SEPARATOR);<br />      pSysMenu-&gt;AppendMenu(MF_STRING, WM_ALWAYSONTOP,<br />                     "&amp;Always On Top");<br />使用ClassWizard,加入对WM_SYSCOMMAND消息的处理,你应该改变消息过滤器,使用系统可以处理这个消息.<br />void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)<br />{<br />    switch ( nID )<br />    {<br />    case WM_ALWAYSONTOP:<br /><br />        if ( GetExStyle() &amp; WS_EX_TOPMOST )<br />        {<br />            SetWindowPos(&amp;wndNoTopMost, 0, 0, 0, 0,<br />                SWP_NOSIZE | SWP_NOMOVE);<br />            GetSystemMenu(FALSE)-&gt;CheckMenuItem(WM_ALWAYSONTOP,<br />                MF_UNCHECKED);<br />        }<br />        else<br />        {<br />            SetWindowPos(&amp;wndTopMost, 0, 0, 0, 0,<br />                SWP_NOSIZE | SWP_NOMOVE);<br />            GetSystemMenu(FALSE)-&gt;CheckMenuItem(WM_ALWAYSONTOP,MF_CHECKED);<br />        }<br /><br />        break;<br /><br />    default:<br />        CFrameWnd::OnSysCommand(nID, lParam);<br />    }<br />}<br /><br />(106)    如何控制窗口框架的最大最小尺寸?</p><p>要控制一个框架的的最大最小尺寸,你需要做两件事情.在CFrameWnd的继承类中处理消息WM_GETMINMAXINFO,结构MINMAXINFO设置了整个窗口类的限制,因此记住要考虑工具条,卷动条等等的大小.<br /><br />// 最大最小尺寸的象素点 - 示例<br />#define MINX 200<br />#define MINY 300<br />#define MAXX 300<br />#define MAXY 400<br /><br />void CMyFrameWnd::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)<br />{<br />    CRect rectWindow;<br />    GetWindowRect(&amp;rectWindow);<br /><br />    CRect rectClient;<br />    GetClientRect(&amp;rectClient);<br /><br />      // get offset of toolbars, scrollbars, etc.<br />    int nWidthOffset = rectWindow.Width() - rectClient.Width();<br />    int nHeightOffset = rectWindow.Height() - rectClient.Height();<br /><br />    lpMMI-&gt;ptMinTrackSize.x = MINX + nWidthOffset;<br />    lpMMI-&gt;ptMinTrackSize.y = MINY + nHeightOffset;<br />    lpMMI-&gt;ptMaxTrackSize.x = MAXX + nWidthOffset;<br />    lpMMI-&gt;ptMaxTrackSize.y = MAXY + nHeightOffset;<br />}<br />第二步,在CFrameWnd的继承类的PreCreateWindow函数中去掉WS_MAXIMIZEBOX消息,否则在最大化时你将得不到预料的结果.<br /><br />BOOL CMyFrameWnd::PreCreateWindow(CREATESTRUCT&amp; cs)<br />{<br />    cs.style &amp;= ~WS_MAXIMIZEBOX;<br />    return CFrameWnd::PreCreateWindow(cs);<br />}<br /><br />(107)    如何改变窗口框架的颜色?</p><p>MDI框架的客户区被另一个窗口的框架所覆盖.为了改变客户区的背景色,你需要重画这个客户窗口.为了做到这点,你要处理消息WM_ERASEBKND产生一个新类,从CWnd继承,姑且称之为CMDIClient.给它加上一个成员变量,<br />#include "MDIClient.h"<br />class CMainFrame : public CMDIFrameWnd<br />{<br />...<br />protected:<br />CMDIClient m_wndMDIClient;<br />}<br />在CMainFrame中重载CMDIFrameWnd::OnCreateClient<br />BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)<br />{<br />    if ( CMDIFrameWnd::OnCreateClient(lpcs, pContext) )<br />    {<br />        m_wndMDIClient.SubclassWindow(m_hWndMDIClient);<br />        return TRUE;<br />    }<br />    else<br />        return FALSE;<br />}<br />然后就可以加入对消息WM_ERASEBKGND的处理了.<br /><br />(108)    如何将应用程序窗口置于屏幕正中?</p><p>要将你的应用程序窗口放置在屏幕正中央,只须在MainFrame的OnCreate函数中加入:<br />CenterWindow( GetDesktopWindow() );</p></div>
				</div>
		</div>
<img src ="http://www.cppblog.com/zgysx/aggbug/16952.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zgysx/" target="_blank">warrior</a> 2006-12-28 17:54 <a href="http://www.cppblog.com/zgysx/archive/2006/12/28/16952.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]windows消息大全</title><link>http://www.cppblog.com/zgysx/archive/2006/12/28/16946.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Thu, 28 Dec 2006 08:39:00 GMT</pubDate><guid>http://www.cppblog.com/zgysx/archive/2006/12/28/16946.html</guid><wfw:comment>http://www.cppblog.com/zgysx/comments/16946.html</wfw:comment><comments>http://www.cppblog.com/zgysx/archive/2006/12/28/16946.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zgysx/comments/commentRss/16946.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zgysx/services/trackbacks/16946.html</trackback:ping><description><![CDATA[
		<h2>
				<a id="viewpost1_TitleUrl" href="/mzty/archive/2006/11/24/15618.html">
						<font color="#223355">windows消息大全 </font>
				</a>
		</h2>
		<div class="postbody">
				<p style="MARGIN: 8px; LINE-HEIGHT: 150%">
						<font color="#223355">
						</font>
				</p>
				<table style="FLOAT: right; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="0">
						<tbody>
								<tr>
										<font color="#223355">
										</font>
								</tr>
						</tbody>
				</table>消息，就是指Windows发出的一个通知，告诉应用程序某个事情发生了。例如，单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。消息本身是作为一个记录传递给应用程序的，这个记录中包含了消息的类型以及其他信息。例如，对于单击鼠标所产生的消息来说，这个记录中包含了单击鼠标时的坐标。这个记录类型叫做TMsg， 
<p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%"></p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">它在Windows单元中是这样声明的： </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">type </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">TMsg = packed record </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">hwnd: HWND; / /窗口句柄 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">message: UINT; / /消息常量标识符 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">wParam: WPARAM ; // 32位消息的特定附加信息 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">lParam: LPARAM ; // 32位消息的特定附加信息 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">time: DWORD; / /消息创建时的时间 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">pt: TPoint; / /消息创建时的鼠标位置 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">end; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%"></p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">消息中有什么？ </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">是否觉得一个消息记录中的信息像希腊语一样？如果是这样，那么看一看下面的解释： </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">hwnd 32位的窗口句柄。窗口可以是任何类型的屏幕对象，因为Win32能够维护大多数可视对象的句柄(窗口、对话框、按钮、编辑框等)。 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">message 用于区别其他消息的常量值，这些常量可以是Windows单元中预定义的常量，也可以是自定义的常量。 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">wParam 通常是一个与消息有关的常量值，也可能是窗口或控件的句柄。 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">lParam 通常是一个指向内存中数据的指针。由于W P a r a m、l P a r a m和P o i n t e r都是3 2位的， </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">因此，它们之间可以相互转换。 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%"></p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_NULL = $0000; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_CREATE = $0001; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">应用程序创建一个窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_DESTROY = $0002; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">一个窗口被销毁 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MOVE = $0003; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">移动一个窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_SIZE = $0005; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">改变一个窗口的大小 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_ACTIVATE = $0006; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">一个窗口被激活或失去激活状态； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_SETFOCUS = $0007; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">获得焦点后 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_KILLFOCUS = $0008; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">失去焦点 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_ENABLE = $000A; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">改变enable状态 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_SETREDRAW = $000B; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">设置窗口是否能重画 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_SETTEXT = $000C; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">应用程序发送此消息来设置一个窗口的文本 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_GETTEXT = $000D; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">应用程序发送此消息来复制对应窗口的文本到缓冲区 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_GETTEXTLENGTH = $000E; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">得到与一个窗口有关的文本的长度（不包含空字符） </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_PAINT = $000F; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">要求一个窗口重画自己 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_CLOSE = $0010; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当一个窗口或应用程序要关闭时发送一个信号 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_QUERYENDSESSION = $0011; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当用户选择结束对话框或程序自己调用ExitWindows函数 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_QUIT = $0012; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">用来结束程序运行或当程序调用postquitmessage函数 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_QUERYOPEN = $0013; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当用户窗口恢复以前的大小位置时，把此消息发送给某个图标 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_ERASEBKGND = $0014; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当窗口背景必须被擦除时（例在窗口改变大小时） </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_SYSCOLORCHANGE = $0015; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当系统颜色改变时，发送此消息给所有顶级窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_ENDSESSION = $0016; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当系统进程发出WM_QUERYENDSESSION消息后，此消息发送给应用程序， </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">通知它对话是否结束 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_SYSTEMERROR = $0017; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_SHOWWINDOW = $0018; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当隐藏或显示窗口是发送此消息给这个窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_ACTIVATEAPP = $001C; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">发此消息给应用程序哪个窗口是激活的，哪个是非激活的； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_FONTCHANGE = $001D; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当系统的字体资源库变化时发送此消息给所有顶级窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_TIMECHANGE = $001E; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当系统的时间变化时发送此消息给所有顶级窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_CANCELMODE = $001F; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">发送此消息来取消某种正在进行的摸态（操作） </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_SETCURSOR = $0020; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时，就发消息给某个窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MOUSEACTIVATE = $0021; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_CHILDACTIVATE = $0022; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">发送此消息给MDI子窗口当用户点击此窗口的标题栏，或当窗口被激活，移动，改变大小 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_QUEUESYNC = $0023; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">此消息由基于计算机的训练程序发送，通过WH_JOURNALPALYBACK的hook程序 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">分离出用户输入消息 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_GETMINMAXINFO = $0024; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">此消息发送给窗口当它将要改变大小或位置； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_PAINTICON = $0026; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">发送给最小化窗口当它图标将要被重画 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_ICONERASEBKGND = $0027; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">此消息发送给某个最小化窗口，仅当它在画图标前它的背景必须被重画 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_NEXTDLGCTL = $0028; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">发送此消息给一个对话框程序去更改焦点位置 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_SPOOLERSTATUS = $002A; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">每当打印管理列队增加或减少一条作业时发出此消息 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_DRAWITEM = $002B; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当button，combobox，listbox，menu的可视外观改变时发送 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">此消息给这些空件的所有者 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MEASUREITEM = $002C; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当button, combo box, list box, list view control, or menu item 被创建时 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">发送此消息给控件的所有者 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_DELETEITEM = $002D; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当the list box 或 combo box 被销毁 或 当 某些项被删除通过LB_DELETESTRING, LB_RESETCONTENT, CB_DELETESTRING, or CB_RESETCONTENT 消息 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_VKEYTOITEM = $002E; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">此消息有一个LBS_WANTKEYBOARDINPUT风格的发出给它的所有者来响应WM_KEYDOWN消息 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_CHARTOITEM = $002F; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_SETFONT = $0030; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当绘制文本时程序发送此消息得到控件要用的颜色 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_GETFONT = $0031; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">应用程序发送此消息得到当前控件绘制文本的字体 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_SETHOTKEY = $0032; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">应用程序发送此消息让一个窗口与一个热键相关连 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_GETHOTKEY = $0033; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">应用程序发送此消息来判断热键与某个窗口是否有关联 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_QUERYDRAGICON = $0037; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">此消息发送给最小化窗口，当此窗口将要被拖放而它的类中没有定义图标，应用程序能返回一个图标或光标的句柄，当用户拖放图标时系统显示这个图标或光标 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_COMPAREITEM = $0039; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">发送此消息来判定combobox或listbox新增加的项的相对位置 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_GETOBJECT = $003D; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_COMPACTING = $0041; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">显示内存已经很少了 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_WINDOWPOSCHANGING = $0046; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">发送此消息给那个窗口的大小和位置将要被改变时，来调用setwindowpos函数或其它窗口管理函数 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_WINDOWPOSCHANGED = $0047; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">发送此消息给那个窗口的大小和位置已经被改变时，来调用setwindowpos函数或其它窗口管理函数 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_POWER = $0048;（适用于16位的windows） </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当系统将要进入暂停状态时发送此消息 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_COPYDATA = $004A; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当一个应用程序传递数据给另一个应用程序时发送此消息 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_CANCELJOURNAL = $004B; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当某个用户取消程序日志激活状态，提交此消息给程序 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_NOTIFY = $004E; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当某个控件的某个事件已经发生或这个控件需要得到一些信息时，发送此消息给它的父窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_INPUTLANGCHANGEREQUEST = $0050; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当用户选择某种输入语言，或输入语言的热键改变 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_INPUTLANGCHANGE = $0051; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当平台现场已经被改变后发送此消息给受影响的最顶级窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_TCARD = $0052; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当程序已经初始化windows帮助例程时发送此消息给应用程序 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_HELP = $0053; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">此消息显示用户按下了F1，如果某个菜单是激活的，就发送此消息个此窗口关联的菜单，否则就 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">发送给有焦点的窗口，如果当前都没有焦点，就把此消息发送给当前激活的窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_USERCHANGED = $0054; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当用户已经登入或退出后发送此消息给所有的窗口，当用户登入或退出时系统更新用户的具体 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">设置信息，在用户更新设置时系统马上发送此消息； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_NOTIFYFORMAT = $0055; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">公用控件，自定义控件和他们的父窗口通过此消息来判断控件是使用ANSI还是UNICODE结构 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">在WM_NOTIFY消息，使用此控件能使某个控件与它的父控件之间进行相互通信 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_CONTEXTMENU = $007B; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当用户某个窗口中点击了一下右键就发送此消息给这个窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_STYLECHANGING = $007C; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当调用SETWINDOWLONG函数将要改变一个或多个 窗口的风格时发送此消息给那个窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_STYLECHANGED = $007D; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当调用SETWINDOWLONG函数一个或多个 窗口的风格后发送此消息给那个窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_DISPLAYCHANGE = $007E; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当显示器的分辨率改变后发送此消息给所有的窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_GETICON = $007F; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">此消息发送给某个窗口来返回与某个窗口有关连的大图标或小图标的句柄； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_SETICON = $0080; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">程序发送此消息让一个新的大图标或小图标与某个窗口关联； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_NCCREATE = $0081; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当某个窗口第一次被创建时，此消息在WM_CREATE消息发送前发送； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_NCDESTROY = $0082; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">此消息通知某个窗口，非客户区正在销毁 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_NCCALCSIZE = $0083; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当某个窗口的客户区域必须被核算时发送此消息 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_NCHITTEST = $0084;//移动鼠标，按住或释放鼠标时发生 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_NCPAINT = $0085; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">程序发送此消息给某个窗口当它（窗口）的框架必须被绘制时； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_NCACTIVATE = $0086; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">此消息发送给某个窗口 仅当它的非客户区需要被改变来显示是激活还是非激活状态； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_GETDLGCODE = $0087; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">发送此消息给某个与对话框程序关联的控件，widdows控制方位键和TAB键使输入进入此控件 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">通过响应WM_GETDLGCODE消息，应用程序可以把他当成一个特殊的输入控件并能处理它 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_NCMOUSEMOVE = $00A0; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当光标在一个窗口的非客户区内移动时发送此消息给这个窗口 //非客户区为：窗体的标题栏及窗 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">的边框体 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_NCLBUTTONDOWN = $00A1; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当光标在一个窗口的非客户区同时按下鼠标左键时提交此消息 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_NCLBUTTONUP = $00A2; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当用户释放鼠标左键同时光标某个窗口在非客户区十发送此消息； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_NCLBUTTONDBLCLK = $00A3; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当用户双击鼠标左键同时光标某个窗口在非客户区十发送此消息 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_NCRBUTTONDOWN = $00A4; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当用户按下鼠标右键同时光标又在窗口的非客户区时发送此消息 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_NCRBUTTONUP = $00A5; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当用户释放鼠标右键同时光标又在窗口的非客户区时发送此消息 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_NCRBUTTONDBLCLK = $00A6; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当用户双击鼠标右键同时光标某个窗口在非客户区十发送此消息 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_NCMBUTTONDOWN = $00A7; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当用户按下鼠标中键同时光标又在窗口的非客户区时发送此消息 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_NCMBUTTONUP = $00A8; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当用户释放鼠标中键同时光标又在窗口的非客户区时发送此消息 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_NCMBUTTONDBLCLK = $00A9; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当用户双击鼠标中键同时光标又在窗口的非客户区时发送此消息 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_KEYFIRST = $0100; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_KEYDOWN = $0100; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">//按下一个键 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_KEYUP = $0101; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">//释放一个键 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_CHAR = $0102; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">//按下某键，并已发出WM_KEYDOWN， WM_KEYUP消息 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_DEADCHAR = $0103; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当用translatemessage函数翻译WM_KEYUP消息时发送此消息给拥有焦点的窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_SYSKEYDOWN = $0104; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当用户按住ALT键同时按下其它键时提交此消息给拥有焦点的窗口； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_SYSKEYUP = $0105; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当用户释放一个键同时ALT 键还按着时提交此消息给拥有焦点的窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_SYSCHAR = $0106; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后提交此消息给拥有焦点的窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_SYSDEADCHAR = $0107; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后发送此消息给拥有焦点的窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_KEYLAST = $0108; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_INITDIALOG = $0110; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">在一个对话框程序被显示前发送此消息给它，通常用此消息初始化控件和执行其它任务 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_COMMAND = $0111; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口，一个快捷键被翻译 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_SYSCOMMAND = $0112; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当用户选择窗口菜单的一条命令或当用户选择最大化或最小化时那个窗口会收到此消息 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_TIMER = $0113; //发生了定时器事件 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_HSCROLL = $0114; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当一个窗口标准水平滚动条产生一个滚动事件时发送此消息给那个窗口，也发送给拥有它的控件 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_VSCROLL = $0115; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当一个窗口标准垂直滚动条产生一个滚动事件时发送此消息给那个窗口也，发送给拥有它的控件 WM_INITMENU = $0116; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当一个菜单将要被激活时发送此消息，它发生在用户菜单条中的某项或按下某个菜单键，它允许程序在显示前更改菜单 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_INITMENUPOPUP = $0117; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当一个下拉菜单或子菜单将要被激活时发送此消息，它允许程序在它显示前更改菜单，而不要改变全部 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MENUSELECT = $011F; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当用户选择一条菜单项时发送此消息给菜单的所有者（一般是窗口） </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MENUCHAR = $0120; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当菜单已被激活用户按下了某个键（不同于加速键），发送此消息给菜单的所有者； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_ENTERIDLE = $0121; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当一个模态对话框或菜单进入空载状态时发送此消息给它的所有者，一个模态对话框或菜单进入空载状态就是在处理完一条或几条先前的消息后没有消息它的列队中等待 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MENURBUTTONUP = $0122; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MENUDRAG = $0123; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MENUGETOBJECT = $0124; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_UNINITMENUPOPUP = $0125; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MENUCOMMAND = $0126; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_CHANGEUISTATE = $0127; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_UPDATEUISTATE = $0128; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_QUERYUISTATE = $0129; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_CTLCOLORMSGBOX = $0132; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">在windows绘制消息框前发送此消息给消息框的所有者窗口，通过响应这条消息，所有者窗口可以通过使用给定的相关显示设备的句柄来设置消息框的文本和背景颜色 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_CTLCOLOREDIT = $0133; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当一个编辑型控件将要被绘制时发送此消息给它的父窗口；通过响应这条消息，所有者窗口可以通过使用给定的相关显示设备的句柄来设置编辑框的文本和背景颜色 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_CTLCOLORLISTBOX = $0134; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当一个列表框控件将要被绘制前发送此消息给它的父窗口；通过响应这条消息，所有者窗口可以通过使用给定的相关显示设备的句柄来设置列表框的文本和背景颜色 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_CTLCOLORBTN = $0135; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当一个按钮控件将要被绘制时发送此消息给它的父窗口；通过响应这条消息，所有者窗口可以通过使用给定的相关显示设备的句柄来设置按纽的文本和背景颜色 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_CTLCOLORDLG = $0136; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当一个对话框控件将要被绘制前发送此消息给它的父窗口；通过响应这条消息，所有者窗口可以通过使用给定的相关显示设备的句柄来设置对话框的文本背景颜色 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_CTLCOLORSCROLLBAR= $0137; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当一个滚动条控件将要被绘制时发送此消息给它的父窗口；通过响应这条消息，所有者窗口可以通过使用给定的相关显示设备的句柄来设置滚动条的背景颜色 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_CTLCOLORSTATIC = $0138; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当一个静态控件将要被绘制时发送此消息给它的父窗口；通过响应这条消息，所有者窗口可以通过使用给定的相关显示设备的句柄来设置静态控件的文本和背景颜色 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MOUSEFIRST = $0200; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MOUSEMOVE = $0200; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">// 移动鼠标 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_LBUTTONDOWN = $0201; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">//按下鼠标左键 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_LBUTTONUP = $0202; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">//释放鼠标左键 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_LBUTTONDBLCLK = $0203; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">//双击鼠标左键 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_RBUTTONDOWN = $0204; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">//按下鼠标右键 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_RBUTTONUP = $0205; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">//释放鼠标右键 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_RBUTTONDBLCLK = $0206; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">//双击鼠标右键 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MBUTTONDOWN = $0207; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">//按下鼠标中键 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MBUTTONUP = $0208; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">//释放鼠标中键 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MBUTTONDBLCLK = $0209; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">//双击鼠标中键 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MOUSEWHEEL = $020A; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当鼠标轮子转动时发送此消息个当前有焦点的控件 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MOUSELAST = $020A; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_PARENTNOTIFY = $0210; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当MDI子窗口被创建或被销毁，或用户按了一下鼠标键而光标在子窗口上时发送此消息给它的父窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_ENTERMENULOOP = $0211; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">发送此消息通知应用程序的主窗口that已经进入了菜单循环模式 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_EXITMENULOOP = $0212; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">发送此消息通知应用程序的主窗口that已退出了菜单循环模式 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_NEXTMENU = $0213; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_SIZING = 532; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当用户正在调整窗口大小时发送此消息给窗口；通过此消息应用程序可以监视窗口大小和位置也可以修改他们 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_CAPTURECHANGED = 533; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">发送此消息 给窗口当它失去捕获的鼠标时； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MOVING = 534; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当用户在移动窗口时发送此消息，通过此消息应用程序可以监视窗口大小和位置也可以修改他们； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_POWERBROADCAST = 536; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">此消息发送给应用程序来通知它有关电源管理事件； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_DEVICECHANGE = 537; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当设备的硬件配置改变时发送此消息给应用程序或设备驱动程序 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_IME_STARTCOMPOSITION = $010D; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_IME_ENDCOMPOSITION = $010E; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_IME_COMPOSITION = $010F; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_IME_KEYLAST = $010F; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_IME_SETCONTEXT = $0281; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_IME_NOTIFY = $0282; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_IME_CONTROL = $0283; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_IME_COMPOSITIONFULL = $0284; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_IME_SELECT = $0285; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_IME_CHAR = $0286; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_IME_REQUEST = $0288; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_IME_KEYDOWN = $0290; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_IME_KEYUP = $0291; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MDICREATE = $0220; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">应用程序发送此消息给多文档的客户窗口来创建一个MDI 子窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MDIDESTROY = $0221; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">应用程序发送此消息给多文档的客户窗口来关闭一个MDI 子窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MDIACTIVATE = $0222; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">应用程序发送此消息给多文档的客户窗口通知客户窗口激活另一个MDI子窗口，当客户窗口收到此消息后，它发出WM_MDIACTIVE消息给MDI子窗口（未激活）激活它； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MDIRESTORE = $0223; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">程序 发送此消息给MDI客户窗口让子窗口从最大最小化恢复到原来大小 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MDINEXT = $0224; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">程序 发送此消息给MDI客户窗口激活下一个或前一个窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MDIMAXIMIZE = $0225; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">程序发送此消息给MDI客户窗口来最大化一个MDI子窗口； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MDITILE = $0226; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">程序 发送此消息给MDI客户窗口以平铺方式重新排列所有MDI子窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MDICASCADE = $0227; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">程序 发送此消息给MDI客户窗口以层叠方式重新排列所有MDI子窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MDIICONARRANGE = $0228; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">程序 发送此消息给MDI客户窗口重新排列所有最小化的MDI子窗口 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MDIGETACTIVE = $0229; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">程序 发送此消息给MDI客户窗口来找到激活的子窗口的句柄 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MDISETMENU = $0230; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">程序 发送此消息给MDI客户窗口用MDI菜单代替子窗口的菜单 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_ENTERSIZEMOVE = $0231; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_EXITSIZEMOVE = $0232; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_DROPFILES = $0233; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MDIREFRESHMENU = $0234; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MOUSEHOVER = $02A1; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_MOUSELEAVE = $02A3; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_CUT = $0300; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">程序发送此消息给一个编辑框或combobox来删除当前选择的文本 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_COPY = $0301; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">程序发送此消息给一个编辑框或combobox来复制当前选择的文本到剪贴板 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_PASTE = $0302; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">程序发送此消息给editcontrol或combobox从剪贴板中得到数据 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_CLEAR = $0303; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">程序发送此消息给editcontrol或combobox清除当前选择的内容； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_UNDO = $0304; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">程序发送此消息给editcontrol或combobox撤消最后一次操作 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_RENDERFORMAT = $0305； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%"></p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_RENDERALLFORMATS = $0306; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_DESTROYCLIPBOARD = $0307; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当调用ENPTYCLIPBOARD函数时 发送此消息给剪贴板的所有者 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_DRAWCLIPBOARD = $0308; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当剪贴板的内容变化时发送此消息给剪贴板观察链的第一个窗口；它允许用剪贴板观察窗口来 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">显示剪贴板的新内容； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_PAINTCLIPBOARD = $0309; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区需要重画； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_VSCROLLCLIPBOARD = $030A; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_SIZECLIPBOARD = $030B; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区域的大小已经改变是此消息通过剪贴板观察窗口发送给剪贴板的所有者； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_ASKCBFORMATNAME = $030C; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">通过剪贴板观察窗口发送此消息给剪贴板的所有者来请求一个CF_OWNERDISPLAY格式的剪贴板的名字 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_CHANGECBCHAIN = $030D; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当一个窗口从剪贴板观察链中移去时发送此消息给剪贴板观察链的第一个窗口； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_HSCROLLCLIPBOARD = $030E; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">此消息通过一个剪贴板观察窗口发送给剪贴板的所有者 ；它发生在当剪贴板包含CFOWNERDISPALY格式的数据并且有个事件在剪贴板观察窗的水平滚动条上；所有者应滚动剪贴板图象并更新滚动条的值； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_QUERYNEWPALETTE = $030F; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">此消息发送给将要收到焦点的窗口，此消息能使窗口在收到焦点时同时有机会实现他的逻辑调色板 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_PALETTEISCHANGING= $0310; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当一个应用程序正要实现它的逻辑调色板时发此消息通知所有的应用程序 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_PALETTECHANGED = $0311; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">此消息在一个拥有焦点的窗口实现它的逻辑调色板后发送此消息给所有顶级并重叠的窗口，以此来改变系统调色板 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_HOTKEY = $0312; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">当用户按下由REGISTERHOTKEY函数注册的热键时提交此消息 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_PRINT = 791; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">应用程序发送此消息仅当WINDOWS或其它应用程序发出一个请求要求绘制一个应用程序的一部分； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_PRINTCLIENT = 792; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_HANDHELDFIRST = 856; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_HANDHELDLAST = 863; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_PENWINFIRST = $0380; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_PENWINLAST = $038F; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_COALESCE_FIRST = $0390; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_COALESCE_LAST = $039F; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_DDE_FIRST = $03E0; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_DDE_INITIATE = WM_DDE_FIRST + 0; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">一个DDE客户程序提交此消息开始一个与服务器程序的会话来响应那个指定的程序和主题名； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_DDE_TERMINATE = WM_DDE_FIRST + 1; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">一个DDE应用程序（无论是客户还是服务器）提交此消息来终止一个会话； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_DDE_ADVISE = WM_DDE_FIRST + 2; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">一个DDE客户程序提交此消息给一个DDE服务程序来请求服务器每当数据项改变时更新它 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_DDE_UNADVISE = WM_DDE_FIRST + 3; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">一个DDE客户程序通过此消息通知一个DDE服务程序不更新指定的项或一个特殊的剪贴板格式的项 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_DDE_ACK = WM_DDE_FIRST + 4; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">此消息通知一个DDE（动态数据交换）程序已收到并正在处理WM_DDE_POKE, WM_DDE_EXECUTE, WM_DDE_DATA, WM_DDE_ADVISE, WM_DDE_UNADVISE, or WM_DDE_INITIAT消息 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_DDE_DATA = WM_DDE_FIRST + 5; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">一个DDE服务程序提交此消息给DDE客户程序来传递个一数据项给客户或通知客户的一条可用数据项 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_DDE_REQUEST = WM_DDE_FIRST + 6; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">一个DDE客户程序提交此消息给一个DDE服务程序来请求一个数据项的值； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_DDE_POKE = WM_DDE_FIRST + 7; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">一个DDE客户程序提交此消息给一个DDE服务程序，客户使用此消息来请求服务器接收一个未经同意的数据项；服务器通过答复WM_DDE_ACK消息提示是否它接收这个数据项； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_DDE_EXECUTE = WM_DDE_FIRST + 8; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">一个DDE客户程序提交此消息给一个DDE服务程序来发送一个字符串给服务器让它象串行命令一样被处理，服务器通过提交WM_DDE_ACK消息来作回应； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_DDE_LAST = WM_DDE_FIRST + 8; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_APP = $8000; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">WM_USER = $0400; </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">此消息能帮助应用程序自定义私有消息； </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">///////////////////////////////////////////////////////////////////// </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">通知消息(Notification message)是指这样一种消息，一个窗口内的子控件发生了一些事情，需要通知父窗口。通知消息只适用于标准的窗口控件如按钮、列表框、组合框、编辑框，以及Windows 95公共控件如树状视图、列表视图等。例如，单击或双击一个控件、在控件中选择部分文本、操作控件的滚动条都会产生通知消息。 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">按扭 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">B N _ C L I C K E D //用户单击了按钮 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">B N _ D I S A B L E //按钮被禁止 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">B N _ D O U B L E C L I C K E D //用户双击了按钮 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">B N _ H I L I T E //用户加亮了按钮 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">B N _ PA I N T按钮应当重画 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">B N _ U N H I L I T E加亮应当去掉 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">组合框 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">C B N _ C L O S E U P组合框的列表框被关闭 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">C B N _ D B L C L K用户双击了一个字符串 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">C B N _ D R O P D O W N组合框的列表框被拉出 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">C B N _ E D I T C H A N G E用户修改了编辑框中的文本 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">C B N _ E D I T U P D AT E编辑框内的文本即将更新 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">C B N _ E R R S PA C E组合框内存不足 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">C B N _ K I L L F O C U S组合框失去输入焦点 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">C B N _ S E L C H A N G E在组合框中选择了一项 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">C B N _ S E L E N D C A N C E L用户的选择应当被取消 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">C B N _ S E L E N D O K用户的选择是合法的 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">C B N _ S E T F O C U S组合框获得输入焦点 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">编辑框 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">E N _ C H A N G E编辑框中的文本己更新 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">E N _ E R R S PA C E编辑框内存不足 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">E N _ H S C R O L L用户点击了水平滚动条 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">E N _ K I L L F O C U S编辑框正在失去输入焦点 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">E N _ M A X T E X T插入的内容被截断 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">E N _ S E T F O C U S编辑框获得输入焦点 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">E N _ U P D AT E编辑框中的文本将要更新 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">E N _ V S C R O L L用户点击了垂直滚动条消息含义 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">列表框 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">L B N _ D B L C L K用户双击了一项 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">L B N _ E R R S PA C E列表框内存不够 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">L B N _ K I L L F O C U S列表框正在失去输入焦点 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">L B N _ S E L C A N C E L选择被取消 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">L B N _ S E L C H A N G E选择了另一项 </p><p style="MARGIN: 5px; TEXT-INDENT: 26px; LINE-HEIGHT: 150%">L B N _ S E T F O C U S列表框获得输入焦点 </p></div>
<img src ="http://www.cppblog.com/zgysx/aggbug/16946.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zgysx/" target="_blank">warrior</a> 2006-12-28 16:39 <a href="http://www.cppblog.com/zgysx/archive/2006/12/28/16946.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]windows消息机制</title><link>http://www.cppblog.com/zgysx/archive/2006/12/28/16945.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Thu, 28 Dec 2006 08:36:00 GMT</pubDate><guid>http://www.cppblog.com/zgysx/archive/2006/12/28/16945.html</guid><wfw:comment>http://www.cppblog.com/zgysx/comments/16945.html</wfw:comment><comments>http://www.cppblog.com/zgysx/archive/2006/12/28/16945.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zgysx/comments/commentRss/16945.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zgysx/services/trackbacks/16945.html</trackback:ping><description><![CDATA[
		<h2>
				<a id="viewpost1_TitleUrl" href="/mzty/archive/2006/11/24/15619.html">windows消息机制</a>
		</h2>
		<div class="postbody">
				<p>一 Windows中有一个系统消息队列，对于每一个正在执行的Windows应用程序,系统为其建立一个“消息队列”，即应用程序队列，用来存放该程序可能创建的各种窗口的消息。应用程序中含有一段称作“消息循环”的代码，用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中。</p>
				<p>
						<img height="211" alt="o_windowsmessage2.jpg" src="http://www.cppblog.com/images/cppblog_com/mzty/2021/o_windowsmessage2.jpg" width="450" border="0" />
						<br />
						<br />二 Windows为当前执行的每个Windows程序维护一个「消息队列」。在发生输入事件之后，Windows将事件转换为一个「消息」并将消息放入程序的消息队列中。程序通过执行一块称之为「消息循环」的程序代码从消息队列中取出消息：<br />while(GetMessage (&amp;msg, NULL, 0, 0))        <br />{        <br />    TranslateMessage (&amp;msg) ;        <br />    DispatchMessage (&amp;msg) ;        <br />}</p>
				<p>msg变量是型态为MSG的结构，型态MSG在WINUSER.H中定义如下：<br />typedef struct tagMSG        <br />{        <br />    HWND   hwnd ;        <br />    UINT   message ;        <br />    WPARAM wParam ;        <br />    LPARAM lParam ;        <br />    DWORD  time ;        <br />    POINT  pt ;        <br />}        <br />MSG, * PMSG ;<br />      <br />POINT数据型态也是一个结构，它在WINDEF.H中定义如下：<br />typedef struct tagPOINT        <br />{        <br />    LONG  x ;        <br />    LONG  y ;        <br />}        <br />POINT, * PPOINT;<br />TranslateMessage(&amp;msg); 将msg结构传给Windows，进行一些键盘转换。（关于这一点，我们将在第六章中深入讨论。）<br />DispatchMessage(&amp;msg);又将msg结构回传给Windows。然后，Windows将该消息发送给适当的窗口消息处理程序，让它进行处理。这也就是说，Windows将呼叫窗口消息处理程序。在HELLOWIN中，这个窗口消息处理程序就是WndProc函数。处理完消息之后，WndProc传回到Windows。此时，Windows还停留在DispatchMessage呼叫中。在结束DispatchMessage呼叫的处理之后，Windows回到HELLOWIN程序中，并且接着从下一个GetMessage呼叫开始消息循环。<br />        <br />三 队列化消息与非队列化消息<br />    <br />消息能够被分为「队列化的」和「非队列化的」。队列化的消息是由Windows放入程序消息队列中的。在程序的消息循环中，重新传回并分配给窗口消息处理程序。非队列化的消息在Windows呼叫窗口时直接送给窗口消息处理程序。也就是说，队列化的消息被「发送」给消息队列，而非队列化的消息则「发送」给窗口消息处理程序。任何情况下，窗口消息处理程序都将获得窗口所有的消息--包括队列化的和非队列化的。窗口消息处理程序是窗口的「消息中心」。</p>
				<p>队列化消息基本上是使用者输入的结果，以击键（如WM_KEYDOWN和WM_KEYUP消息）、击键产生的字符（WM_CHAR）、鼠标移动（WM_MOUSEMOVE）和鼠标按钮（WM_LBUTTONDOWN）的形式给出。队列化消息还包含时钟消息（WM_TIMER）、更新消息（WM_PAINT）和退出消息（WM_QUIT）。</p>
				<p>非队列化消息则是其它消息。在许多情况下，非队列化消息来自呼叫特定的Windows函数。例如，当WinMain呼叫CreateWindow时，Windows将建立窗口并在处理中给窗口消息处理程序发送一个WM_CREATE消息。当WinMain呼叫ShowWindow时，Windows将给窗口消息处理程序发送WM_SIZE和WM_SHOWWINDOW消息。当WinMain呼叫UpdateWindow时，Windows将给窗口消息处理程序发送WM_PAINT消息。键盘或鼠标输入时发出的队列化消息信号，也能在非队列化消息中出现。例如，用键盘或鼠标选择了一个菜单项时，键盘或鼠标消息就是队列化的，而说明菜单项已选中的WM_COMMAND消息则可能就是非队列化的。</p>
				<p>四 SendMessage()与PostMessage()之间的区别是什么？<br />它们两者是用于向应用程序发送消息的。PostMessagex()将消息直接加入到应用程序的消息队列中，不等程序返回就退出；而SendMessage()则刚好相反，应用程序处理完此消息后，它才返回。我想下图能够比较好的体现这两个函数的关系：<br /><br /><img height="407" alt="o_postmessage.gif" src="http://www.cppblog.com/images/cppblog_com/mzty/2021/o_postmessage.gif" width="609" border="0" /></p>
				<p>
						<br />五 函数peekmessage和getmessage的区别？</p>
				<p>两个函数主要有以下两个区别:<br />1.GetMessage将等到有合适的消息时才返回,而PeekMessage只是撇一下消息队列。<br />2.GetMessage会将消息从队列中删除,而PeekMessage可以设置最后一个参数wRemoveMsg来决定是否将消息保留在队列中。</p>
		</div>
<img src ="http://www.cppblog.com/zgysx/aggbug/16945.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zgysx/" target="_blank">warrior</a> 2006-12-28 16:36 <a href="http://www.cppblog.com/zgysx/archive/2006/12/28/16945.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>禁止程序多开,并将原程序带到前台</title><link>http://www.cppblog.com/zgysx/archive/2006/12/15/16483.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Fri, 15 Dec 2006 08:18:00 GMT</pubDate><guid>http://www.cppblog.com/zgysx/archive/2006/12/15/16483.html</guid><wfw:comment>http://www.cppblog.com/zgysx/comments/16483.html</wfw:comment><comments>http://www.cppblog.com/zgysx/archive/2006/12/15/16483.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zgysx/comments/commentRss/16483.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zgysx/services/trackbacks/16483.html</trackback:ping><description><![CDATA[
		<p>CString strMutexName = "MySingleInstance"; <br />HANDLE hMutex = CreateMutex(NULL,FALSE,strMutexName);  <br /> if (  hMutex )<br /> {<br />  if ( ERROR_ALREADY_EXISTS == ::GetLastError() )<br />  {//如果已有先前的实例,则退出<br />    <br />      HWND hWnd= ::FindWindow([程序窗口类名], [程序窗口名称]);<br />      if( hWnd)<br />      {<br />       ::ShowWindow( hWnd, SW_SHOWNORMAL);<br />       ::SetForegroundWindow( hWnd);<br />       ::BringWindowToTop( hWnd);<br />       ::FlashWindow( hWnd, TRUE );<br />      }<br />      exit(0);<br />   }<br />}</p>
<img src ="http://www.cppblog.com/zgysx/aggbug/16483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zgysx/" target="_blank">warrior</a> 2006-12-15 16:18 <a href="http://www.cppblog.com/zgysx/archive/2006/12/15/16483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>打开文件对话框与目录选择对话框</title><link>http://www.cppblog.com/zgysx/archive/2006/12/06/16053.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Wed, 06 Dec 2006 08:17:00 GMT</pubDate><guid>http://www.cppblog.com/zgysx/archive/2006/12/06/16053.html</guid><wfw:comment>http://www.cppblog.com/zgysx/comments/16053.html</wfw:comment><comments>http://www.cppblog.com/zgysx/archive/2006/12/06/16053.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zgysx/comments/commentRss/16053.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zgysx/services/trackbacks/16053.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#ff0000">打开文件对话框<br /></font>const char pszFilter[] = _T("EXE File (*.txt)|*.txt|All Files (*.*)|*.*||");<br />CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,<br />  pszFilter, this);<br /><br />dlg.m_ofn.lpstrInitialDir = "c:\\WINDOWS\\";  //设置对话框默认呈现的路径<br /><br />if(dlg.DoModal() == IDOK)<br />{<br />CString strFilePath = dlg.GetPathName();<br />/*如果有多个文件,则<br />for(POSITION pos = dlg.GetStartPosition(); pos!=NULL; )<br />  {<br />   CString strFilePathName = dlg.GetNextPathName(pos);<br />*/<br />}</p>
		<p>
				<font color="#ff0000">保存文件对话框<br /></font>const char pszFilter[] = _T("EXE Files (*.txt)|*.txt||");<br />CFileDialog dlgSave( FALSE,   //FALSE为保存<br />  _T(".txt"), //自动加上的扩展名<br />  _T("Output.txt"),  //默认保存的文件名<br />  OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,<br />  pszFilter, this);<br /><br /><br /><br /><font style="BACKGROUND-COLOR: #ffffff" color="#ffff00"><font color="#ff0000">目录选择对话框</font><br /></font><br /> BROWSEINFO bi;<br /> char szPathName[MAX_PATH];<br /> char szTitle[] = "选择路径";<br /> ZeroMemory(&amp;bi, sizeof(BROWSEINFO));<br /> <br /> bi.hwndOwner = GetSafeHwnd();<br /> bi.pszDisplayName = szPathName;<br /> bi.lpszTitle = szTitle;<br /> bi.ulFlags = 0x0040 ; <br /> CString str;<br />CString strDir;  //选择的目录</p>
		<p> LPITEMIDLIST idl = SHBrowseForFolder(&amp;bi);<br /> if(idl == NULL)<br /> {<br />  strDir= "";<br />  return;<br /> }<br /> <br /> SHGetPathFromIDList(idl, str.GetBuffer(MAX_PATH * 2));<br /> str.ReleaseBuffer();<br /> if(str != "" &amp;&amp; str.GetAt(str.GetLength() - 1) != '\\')<br />  str += "\\";<br /> strDir = str;<br /></p>
<img src ="http://www.cppblog.com/zgysx/aggbug/16053.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zgysx/" target="_blank">warrior</a> 2006-12-06 16:17 <a href="http://www.cppblog.com/zgysx/archive/2006/12/06/16053.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在对话框上以路径形式显示字符串(当字符串长度过长时,中间的字符串用省略号代替)</title><link>http://www.cppblog.com/zgysx/archive/2006/12/06/16052.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Wed, 06 Dec 2006 08:13:00 GMT</pubDate><guid>http://www.cppblog.com/zgysx/archive/2006/12/06/16052.html</guid><wfw:comment>http://www.cppblog.com/zgysx/comments/16052.html</wfw:comment><comments>http://www.cppblog.com/zgysx/archive/2006/12/06/16052.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zgysx/comments/commentRss/16052.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zgysx/services/trackbacks/16052.html</trackback:ping><description><![CDATA[
		<p>在对话框上以路径形式显示字符串(当字符串长度过长时,中间的字符串用省略号代替)<br /><br />CPaintDC dc(this);<br />CFont NewFont, * pOldFont;<br />NewFont.CreatePointFont(90, _T("宋体"), NULL);<br />pOldFont = dc.SelectObject(&amp;NewFont);<br />dc.SetBkMode(TRANSPARENT);</p>
		<p>CRect rect;<br />//IDC_STATIC_PATH是显示字符串的static控件的ID, 注意控件的要设为不可见<br />GetDlgItem(IDC_STATIC_PATH)-&gt;GetWindowRect(rect); <br />ScreenToClient(rect);</p>
		<p>dc.DrawText(m_strCorePath, -1, rect, DT_LEFT | DT_PATH_ELLIPSIS | DT_VCENTER | DT_SINGLELINE);<br />dc.SelectObject(pOldFont);</p>
<img src ="http://www.cppblog.com/zgysx/aggbug/16052.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zgysx/" target="_blank">warrior</a> 2006-12-06 16:13 <a href="http://www.cppblog.com/zgysx/archive/2006/12/06/16052.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使窗口透明</title><link>http://www.cppblog.com/zgysx/archive/2006/11/07/14808.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Tue, 07 Nov 2006 10:16:00 GMT</pubDate><guid>http://www.cppblog.com/zgysx/archive/2006/11/07/14808.html</guid><wfw:comment>http://www.cppblog.com/zgysx/comments/14808.html</wfw:comment><comments>http://www.cppblog.com/zgysx/archive/2006/11/07/14808.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zgysx/comments/commentRss/14808.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zgysx/services/trackbacks/14808.html</trackback:ping><description><![CDATA[
		<p>#define LWA_COLORKEY 0x00000001  // Use color as the transparency color.<br />#define WS_EX_LAYERED 0x00080000<br />#define LWA_ALPHA 2   // Use bAlpha to determine the opacity of the layer<br />typedef BOOL (WINAPI *lpfnSetLayeredWindowAttributes)(HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);<br />lpfnSetLayeredWindowAttributes MySetLayeredWindowAttributes;</p>
		<p>窗口半透明<br />HMODULE hUser32 = GetModuleHandle("user32.dll");<br />MySetLayeredWindowAttributes = (lpfnSetLayeredWindowAttributes)GetProcAddress(hUser32,"SetLayeredWindowAttributes");<br />if(MySetLayeredWindowAttributes == NULL)<br />{<br /> AfxMessageBox("载入系统dll失败,程序即将退出!");<br /> exit(0);<br />}</p>
		<p>::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE) ^ WS_EX_LAYERED);<br />MySetLayeredWindowAttributes(GetSafeHwnd(), 0, <br /> 130, //这个参数是控制窗口透明的层度, 为0时窗口全透明,包括标题栏. 为255时,不透明<br /> LWA_ALPHA);//LWA_COLORKEY<br />FreeLibrary(hUser32);</p>
		<p>
				<br />使对话框窗口的客户区全透明<br />COLORREF maskColor= 14215660; 这是颜色掩码,与这个颜色相同的将不被显示出来<br />SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE) | WS_EX_LAYERED);<br />MySetLayeredWindowAttributes(GetSafeHwnd(), maskColor, 10, LWA_COLORKEY);</p>
		<p>
				<br /> </p>
<img src ="http://www.cppblog.com/zgysx/aggbug/14808.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zgysx/" target="_blank">warrior</a> 2006-11-07 18:16 <a href="http://www.cppblog.com/zgysx/archive/2006/11/07/14808.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC 中使用自定义资源</title><link>http://www.cppblog.com/zgysx/archive/2006/10/31/14419.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Tue, 31 Oct 2006 04:10:00 GMT</pubDate><guid>http://www.cppblog.com/zgysx/archive/2006/10/31/14419.html</guid><wfw:comment>http://www.cppblog.com/zgysx/comments/14419.html</wfw:comment><comments>http://www.cppblog.com/zgysx/archive/2006/10/31/14419.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zgysx/comments/commentRss/14419.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zgysx/services/trackbacks/14419.html</trackback:ping><description><![CDATA[
		<p>举例: 将一个文件做为资源导入到VC工程的*.rc文件中,程序运行时再将资源释放出来写到文件中去.</p>
		<p>bool DeliverResource(const CString&amp; strDestPath, const char * pszID, const char * pszType)<br />{<br /> HRSRC hRsrc = FindResource(NULL, pszID, pszType);<br /> if(NULL == hRsrc)<br />  return false;<br /> DWORD dwSize = SizeofResource(NULL, hRsrc);<br /> if(0 == dwSize)<br />  return false;<br /> HGLOBAL hGlobal = LoadResource(NULL, hRsrc);<br /> if(NULL == hGlobal)<br />  return false;<br /> LPVOID pBuffer = LockResource(hGlobal);<br /> if(NULL == pBuffer)<br />  return false;</p>
		<p> tool::CreateMidDir(strDestPath);<br /> FILE *fp = fopen(strDestPath, "wb");<br /> DWORD dwRemain = dwSize;<br /> while(dwRemain &gt; 0)<br /> {<br />  dwRemain -= fwrite(pBuffer, sizeof(char), dwRemain, fp);<br /> }<br /> fclose(fp);<br /> return true;<br />}</p>
<img src ="http://www.cppblog.com/zgysx/aggbug/14419.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zgysx/" target="_blank">warrior</a> 2006-10-31 12:10 <a href="http://www.cppblog.com/zgysx/archive/2006/10/31/14419.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows 内存映射文件的使用</title><link>http://www.cppblog.com/zgysx/archive/2006/10/31/14414.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Tue, 31 Oct 2006 03:35:00 GMT</pubDate><guid>http://www.cppblog.com/zgysx/archive/2006/10/31/14414.html</guid><wfw:comment>http://www.cppblog.com/zgysx/comments/14414.html</wfw:comment><comments>http://www.cppblog.com/zgysx/archive/2006/10/31/14414.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zgysx/comments/commentRss/14414.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zgysx/services/trackbacks/14414.html</trackback:ping><description><![CDATA[
		<p>举例:像操作字符串一样地操作一个文件中的内容<br /><br /><br />bool OperateFileJustLikeToString(const char * pszFileName)<br />{<br /> const HANDLE hFile = CreateFile(pszFileName, \<br />  GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, \<br />  NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);<br /> if(hFile == INVALID_HANDLE_VALUE)<br />  return false;</p>
		<p> DWORD dwLength = GetFileSize(hFile, NULL);<br /> //创建内存映射对象,内存映射文件的大小 = 文件长度 + (WCHAR)'\0'<br /> //因为我们要在文件的末尾加上一个字符串的结束符'\0', 当我们将这个文件映射到内存中时,我们就可以像操作字符串一样地来操作文件了<br /> const HANDLE hFileMap = CreateFileMapping(<br />  hFile, NULL, PAGE_READWRITE, 0, <br />  dwLength + sizeof(WCHAR), <br />  NULL);<br /> <br /> char * pFile = (char *)MapViewOfFile(hFileMap, FILE_MAP_WRITE, 0, 0, 0);<br /> pFile[dwLength / sizeof(char)] = '\0';<br /> <br /> //现在对文件的操作就变成了对一字符串pFile的操作了,所有的字符串函数都能<br /> //对pFile这个字符串进行操作, 而操作的结果则会被保存到文件中去(但是并不<br />是改变pFile<br /> //中的内容后会立刻写到文件中去,但是在调用UnmapViewOfFile()后,保证先前对pFile的修改全部保存到文件中了)<br /> //...........<br /> //statement();<br /> //............</p>
		<p> UnmapViewOfFile(pFile);<br /> CloseHandle(hFileMap);</p>
		<p> //我们改变了文件的长度,因此要重新设置文件的结束符以删除留在文件尾部的多余内容(比如删除我们先前加到文件末尾的'\0'字符)<br /> SetFilePointer(hFile,dwLength , NULL, FILE_BEGIN);<br /> SetEndOfFile(hFile);  //设定当前文件指针所在处为文件结束处.该处后面的内容将被删除<br /> CloseHandle(hFile);<br /> return true;<br />}</p>
<img src ="http://www.cppblog.com/zgysx/aggbug/14414.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zgysx/" target="_blank">warrior</a> 2006-10-31 11:35 <a href="http://www.cppblog.com/zgysx/archive/2006/10/31/14414.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使程序界面具有XP风格(在VS2003和VS2005中)</title><link>http://www.cppblog.com/zgysx/archive/2006/10/31/14413.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Tue, 31 Oct 2006 02:52:00 GMT</pubDate><guid>http://www.cppblog.com/zgysx/archive/2006/10/31/14413.html</guid><wfw:comment>http://www.cppblog.com/zgysx/comments/14413.html</wfw:comment><comments>http://www.cppblog.com/zgysx/archive/2006/10/31/14413.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/zgysx/comments/commentRss/14413.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zgysx/services/trackbacks/14413.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#ff0000" size="5">在VS 2003 环境中<br /></font>1.在工程的目录下建一个名为 xpapp.manifest的文件. 把下面的内容拷到这个文件中:<br />&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;<br />&lt;assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"&gt; <br />&lt;assemblyIdentity <br />    version="1.0.0.0" <br />    processorArchitecture="X86" <br />    name="Microsoft.Windows.ViPod"<br />    type="win32" <br />/&gt; <br />&lt;description&gt;Your app description here&lt;/description&gt; <br />&lt;dependency&gt; <br />    &lt;dependentAssembly&gt; <br />        &lt;assemblyIdentity <br />            type="win32" <br />            name="Microsoft.Windows.Common-Controls" <br />            version="6.0.0.0" <br />            processorArchitecture="X86" <br />            publicKeyToken="6595b64144ccf1df" <br />            language="*" <br />        /&gt; <br />    &lt;/dependentAssembly&gt; <br />&lt;/dependency&gt; <br />&lt;/assembly&gt;</p>
		<p>
				<br />2.将工程的*.rc文件打开, 加上这样一句话(注意要加上#endif前):</p>
		<p>//这名话是告诉工程使用刚才我们创建的那个文件,使程序界面变成XP风格<br />CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "xpapp.manifest"</p>
		<p>
				<br />3.在工程的C*App文件中加上<br />#pragma comment(lib, "ComCtl32.lib")      //3步是选做</p>
		<p>4.如果你的代码是用V6的向导生成的,那必须将工程转成vc.net下,然后在C*App的InitInstance()最开始出加上<br />InitCommonControls();这个函数,V6的向导不会自动添加这个函数.<br />//4步是选做<br /><br /><br /><font style="BACKGROUND-COLOR: #ffffff" color="#ff0000" size="5">如果是VS 2005 则有所不同</font><br />VS 2005中,如果Project-&gt;Property  -- General -- Character Set 为Use Unicode Character Set,那么程序的界面自然就是XP风格,不需要手动添加任何东西。但是如果这里是Use Multi-Byte Character Set，那么就要自己动手加东西了，和上面操作差不多。<br /><br />1、建一个名为XPStyle.manifest的文件<br />2、把下面的内容拷到这个文件中<br />&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;<br />&lt;assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"&gt;<br />  &lt;assemblyIdentity <br />      version="1.0.0.0" <br />      processorArchitecture="X86" <br />      name="Microsoft.Windows.WorkSapceName"<br />      type="win32" <br />/&gt;<br />  &lt;description&gt;Your app description here&lt;/description&gt;<br />  &lt;dependency&gt;<br />    &lt;dependentAssembly&gt;<br />      &lt;assemblyIdentity <br />          type="win32" <br />          name="Microsoft.Windows.Common-Controls" <br />          version="6.0.0.0" <br />          processorArchitecture="X86" <br />          publicKeyToken="6595b64144ccf1df" <br />          language="*" <br />        /&gt;<br />    &lt;/dependentAssembly&gt;<br />  &lt;/dependency&gt;<br />&lt;/assembly&gt;<br /><br />3、Project-&gt;Add Existing Item...将XPStyle.manifest添加到工程中。<br /><br />4、打开工程中的Resource.h文件，加上：<br /><span class="bodycopy"><span class="codeKeyword">#define</span> IDR_MANIFEST  1 <br /><span class="codeKeyword">#define</span> RT_MANIFEST 24 </span><br /><br />5、将工程的res\*.rc2文件打开, 加上:<br /><span class="bodycopy"><span class="codeComment">// Add manually edited resources here...</span><br />IDR_MANIFEST RT_MANIFEST MOVEABLE PURE   "res\\XPStyle.manifest"<br /></span><br /><br />6、Rebuild.....就可以了。<br />(源自:http://blog.csdn.net/limigy/archive/2006/04/04/650008.aspx)</p>
<img src ="http://www.cppblog.com/zgysx/aggbug/14413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zgysx/" target="_blank">warrior</a> 2006-10-31 10:52 <a href="http://www.cppblog.com/zgysx/archive/2006/10/31/14413.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用键盘钩子(不用DLL)</title><link>http://www.cppblog.com/zgysx/archive/2006/10/30/14376.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Mon, 30 Oct 2006 06:10:00 GMT</pubDate><guid>http://www.cppblog.com/zgysx/archive/2006/10/30/14376.html</guid><wfw:comment>http://www.cppblog.com/zgysx/comments/14376.html</wfw:comment><comments>http://www.cppblog.com/zgysx/archive/2006/10/30/14376.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zgysx/comments/commentRss/14376.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zgysx/services/trackbacks/14376.html</trackback:ping><description><![CDATA[
		<p>#define WH_KEYBOARD_LL     13<br /><br />定义一个钩子函数<br />LRESULT CALLBACK HookFun(int nCode, WPARAM wParam, LPARAM lParam);</p>
		<p>HHOOK g_hHook = NULL;</p>
		<p>首先要安装钩子<br />g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, HookFun, GetModuleHandle(NULL), NULL);<br />if(g_hHook == NULL)<br /> AfxMessageBox("hook failure!");</p>
		<p>
				<br />在程序结束时要卸载钩子<br />UnhookWindowsHookEx(g_hHook);</p>
		<p>钩子函数的实现<br />LRESULT CALLBACK HookFun(int nCode, WPARAM wParam, LPARAM lParam)<br />{<br />  CWPSTRUCT* p = (CWPSTRUCT*) lParam;<br /> if (nCode == HC_ACTION) <br /> { <br />  switch (wParam) //wParam中是消息ID<br />  { <br />  case WM_KEYDOWN: <br />   {  <br />      if(p-&gt;lParam == 'l' || p-&gt;lParam == 'L') <br />      {<br />           // 'l' 键被按下 <br />            //do somthing<br />       }<br />    <br />    if(p-&gt;lParam == VK_ESCAPE)<br />    {//用户按下了Esc<br />      //do somthing<br />    }  <br />  } <br /> }<br /> return CallNextHookEx(NULL, nCode, wParam, lParam);<br />}</p>
<img src ="http://www.cppblog.com/zgysx/aggbug/14376.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zgysx/" target="_blank">warrior</a> 2006-10-30 14:10 <a href="http://www.cppblog.com/zgysx/archive/2006/10/30/14376.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows中用鼠标拖放文件</title><link>http://www.cppblog.com/zgysx/archive/2006/10/19/13851.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Thu, 19 Oct 2006 00:47:00 GMT</pubDate><guid>http://www.cppblog.com/zgysx/archive/2006/10/19/13851.html</guid><wfw:comment>http://www.cppblog.com/zgysx/comments/13851.html</wfw:comment><comments>http://www.cppblog.com/zgysx/archive/2006/10/19/13851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zgysx/comments/commentRss/13851.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zgysx/services/trackbacks/13851.html</trackback:ping><description><![CDATA[
		<p>添加对WM_DROPFILES响应的函数<br />void CMyDlg::OnDropFiles(HDROP hDropInfo) <br />{<br /> char szFilePath[MAX_PATH];<br /> int nFileCount;<br />//取得拖放的文件个数<br /> nFileCount = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, MAX_PATH);<br /><br /> //获取拖放的文件路径<br /> UINT nCharNum = DragQueryFile(hDropInfo, 0, szFilePath, MAX_PATH);<br /> //szFilePath中保存着文件路径或者一个目录<br />//doSomething();<br /> <br /> DragFinish(hDropInfo);<br /> CDialog::OnDropFiles(hDropInfo);<br />}</p>
<img src ="http://www.cppblog.com/zgysx/aggbug/13851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zgysx/" target="_blank">warrior</a> 2006-10-19 08:47 <a href="http://www.cppblog.com/zgysx/archive/2006/10/19/13851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序中显示与隐示的调用 dll</title><link>http://www.cppblog.com/zgysx/archive/2006/10/13/13619.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Fri, 13 Oct 2006 00:39:00 GMT</pubDate><guid>http://www.cppblog.com/zgysx/archive/2006/10/13/13619.html</guid><wfw:comment>http://www.cppblog.com/zgysx/comments/13619.html</wfw:comment><comments>http://www.cppblog.com/zgysx/archive/2006/10/13/13619.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zgysx/comments/commentRss/13619.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zgysx/services/trackbacks/13619.html</trackback:ping><description><![CDATA[
		<p>//===================================<br />//MyAlg.h<br />//===================================<br />/*<br />隐示装载的dll</p>
		<p>从dll中导出一个类,  使用这个dll中类的可执行代码工程必须和这个dll工程用的是同一编译器<br />否则这个dll将不可用<br />*/</p>
		<p>class CMyAlg<br />{<br />public:<br /> __declspec(dllimport) int Add(int a, int b);<br />};<br /><br /><br />//===================================<br />//MyAlg.cpp<br />//===================================<br />#include "MyAlg.h"<br />int CMyAlg::Add(int a, int b)<br />{<br /> return (a + b);<br />}<br /><br /><br /><br /><br /><br />//===================================<br />//alg.h<br />//===================================<br /><br />/*<br />显示装载的dll</p>
		<p>从dll中导出一人函数和一个变量, 这个不会出现像导出类所碰到的问题, 要以C<br />风格的型式导出<br />*/<br />extern "C" __declspec(dllimport) int Add(int a, int b);<br />extern "C" __declspec(dllimport) int g_nValue;<br /><br /><br /><br /><br /><br /><br /><br />//===================================<br />//test.cpp  测试前面写好的dll<br />//===================================<br /><br />#include &lt;stdio.h&gt;</p>
		<p>#define   EXPLICIT_LOAD<br /><br />#ifdef EXPLICIT_LOAD //定义了显示方法加载DLL<br />#include &lt;windows.h&gt;<br />#endif</p>
		<p>#ifdef IMPLICIT_LOAD //定义了隐示方法加载DLL<br />#include "MyAlg.h"<br />#include "alg.h"<br />#pragma comment(lib, "Class.lib") //dll中导出一个类<br />#pragma comment(lib, "Win32Dll.lib")//dll中导出一个函数和变量<br />#endif</p>
		<p>
				<br />void main(void)<br />{<br />#ifdef IMPLICIT_LOAD <br />//使用隐示方法加载DLL,可以调用dll中导出的函数、变量和类<br /> CMyAlg alg;<br /> printf("使用隐示方法加载DLL\n");<br /> printf("CMyAlg::Add(%d, %d) = %d, \n", 1, 2, alg.Add(1, + 2));<br /> printf("Add(%d, %d) = %d, g_nValue = %d\n\n", 1, 2, Add(1, 2), g_nValue);<br />#endif</p>
		<p>
				<br />#ifdef EXPLICIT_LOAD <br />//使用显示的方法加载DLL，只能调用dll中以C风格导出的函数<br /> printf("使用显示的方法加载DLL\n");<br /> HINSTANCE hIns = LoadLibrary("Win32Dll.dll");<br /> if(hIns = NULL)<br /> {<br />  printf("Load dll failure!\n");<br />  return;<br /> }<br /> <br /> typedef int(* pAdd)(int, int);<br /> pAdd pfun = (pAdd)GetProcAddress(hIns, "Add");<br /> printf("pfun(1, 2) = %d, pfun(1,2)\n");</p>
		<p> FreeLibrary(hIns);<br />#endif</p>
		<p> getchar();<br />}</p>
<img src ="http://www.cppblog.com/zgysx/aggbug/13619.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zgysx/" target="_blank">warrior</a> 2006-10-13 08:39 <a href="http://www.cppblog.com/zgysx/archive/2006/10/13/13619.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>获取系统当前时间</title><link>http://www.cppblog.com/zgysx/archive/2006/10/09/13475.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Mon, 09 Oct 2006 01:10:00 GMT</pubDate><guid>http://www.cppblog.com/zgysx/archive/2006/10/09/13475.html</guid><wfw:comment>http://www.cppblog.com/zgysx/comments/13475.html</wfw:comment><comments>http://www.cppblog.com/zgysx/archive/2006/10/09/13475.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zgysx/comments/commentRss/13475.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zgysx/services/trackbacks/13475.html</trackback:ping><description><![CDATA[ time_t ltime;<br /> time(&amp;ltime);<br /> char t[50];<br /> strftime(t, 50, "%Y%m%d%H%M%S\0", localtime(&amp;ltime));<img src ="http://www.cppblog.com/zgysx/aggbug/13475.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zgysx/" target="_blank">warrior</a> 2006-10-09 09:10 <a href="http://www.cppblog.com/zgysx/archive/2006/10/09/13475.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>