﻿<?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++博客-Cass/* C++蓝草莓日记-文章分类-Windows程序设计</title><link>http://www.cppblog.com/Cass/category/16518.html</link><description>漂浮在水面上的冰山，只不过是它庞大体积的一小部分，C++,也是一样。不深入挖掘，永远都只是认识冰山一角。



</description><language>zh-cn</language><lastBuildDate>Sat, 17 Sep 2011 01:10:46 GMT</lastBuildDate><pubDate>Sat, 17 Sep 2011 01:10:46 GMT</pubDate><ttl>60</ttl><item><title>键盘与鼠标总结</title><link>http://www.cppblog.com/Cass/articles/155677.html</link><dc:creator>Yu</dc:creator><author>Yu</author><pubDate>Tue, 13 Sep 2011 08:23:00 GMT</pubDate><guid>http://www.cppblog.com/Cass/articles/155677.html</guid><wfw:comment>http://www.cppblog.com/Cass/comments/155677.html</wfw:comment><comments>http://www.cppblog.com/Cass/articles/155677.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Cass/comments/commentRss/155677.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cass/services/trackbacks/155677.html</trackback:ping><description><![CDATA[<p>一、击键与字符消息：<br />处理按键和字元讯息的基本规则是：如果需要读取输入到视窗的键盘字元，那么您可以处理WM_CHAR 讯息。如果需要读取游标键、功能键、Delete、Insert、Shift、Ctrl 以及Alt 键，那么您可以处理WM_KEYDOWN 讯息。<br />但是Tab 键，Enter、Backspace 和Escape 键可以处理击键或字符消息都可以、<br />按键 &nbsp;&nbsp;字元代码 &nbsp;产生方法 &nbsp;ANSI C 控制字元<br />Backspace &nbsp;0x08 &nbsp;&nbsp;Ctrl-H &nbsp;&nbsp;\b<br />Tab &nbsp;&nbsp;0x09 &nbsp;&nbsp;Ctrl-I &nbsp;&nbsp;\t<br />Ctrl-Enter&nbsp;0x0A &nbsp;&nbsp;Ctrl-J &nbsp;&nbsp;\n<br />Enter &nbsp;&nbsp;0x0D &nbsp;&nbsp;Ctrl-M &nbsp;&nbsp;\r<br />Esc &nbsp;&nbsp;0x1B &nbsp;&nbsp;Ctrl-[<br />现在一般处理字符消息。</p>
<p>二、//////////////创建插入符<br />主要有五个插入符号函式：<br />CreateCaret 建立与视窗有关的插入符号<br />SetCaretPos 在视窗中设定插入符号的位置<br />ShowCaret 显示插入符号<br />HideCaret 隐藏插入符号<br />DestroyCaret 撤消插入符号<br />另外：<br />GetCaretPos&nbsp;&nbsp;取得插入符号目前位置<br />GetCaretBlinkTime &nbsp;取得插入符号闪烁时间<br />SetCaretBlinkTime&nbsp;设定插入符号闪烁时间</p>
<p>使用插入符号的主要规则很简单：<br />1、视窗讯息处理程式在WM_SETFOCUS 讯息理期间呼叫CreateCaret，在WM_KILLFOCUS讯息处理期间呼叫DestroyCaret。<br />2、插入符号刚建立时是隐蔽的。想使插入符号可见，CreateCaret ，ShowCaret<br />3、当视窗讯息处理程式处理一条非WM_PAINT 讯息而且希望在视窗内绘制某些东西时，它必须呼叫HideCaret 隐藏插入符号。在绘制完毕後，再呼叫ShowCaret显示插入符号。HideCaret 的影响具有累积效果，相同次数时，才能看到插入符号。</p>
<p>&nbsp;</p>
<p>三、捕获鼠标：是鼠标移出客户区时依然需要鼠标鼠标的位置。这是捕获<br />SetCapture (hwnd) ;Windows 将所有滑鼠讯息发给视窗代号为hwnd 的视窗讯息处理程式。<br />ReleaseCapture () ;释放</p><br />
<p>WPARAM的参数&nbsp; <br />符号常量 &nbsp;十六进制值 &nbsp;指定的鼠标或键盘按键<br />　　VK_LBUTTON &nbsp;01 &nbsp;&nbsp;鼠标左键（一般不用）<br />　　VK_RBUTTON &nbsp;02 &nbsp;&nbsp;鼠标右键（一般不用）<br />　　VK_CANCEL &nbsp;03 &nbsp;&nbsp;Control-break 过程<br />　　VK_MBUTTON &nbsp;04 &nbsp;&nbsp;鼠标中键（一般不用）<br />　　VK_BACK &nbsp;08 &nbsp;&nbsp;BACKSPACE 键<br />　　VK_TAB &nbsp;09 &nbsp;&nbsp;TAB 键 <br />　　VK_CLEAR &nbsp;0C &nbsp;&nbsp;CLEAR 键（Num Lock关闭时的数字键盘5）<br />　　VK_RETURN &nbsp;0D &nbsp;&nbsp;ENTER 键（回车键）<br />　　VK_SHIFT &nbsp;10 &nbsp;&nbsp;SHIFT 键<br />　　VK_CONTROL &nbsp;11 &nbsp;&nbsp;CTRL 键<br />　　VK_MENU &nbsp;12 &nbsp;&nbsp;ALT 键<br />　　VK_PAUSE &nbsp;13 &nbsp;&nbsp;PAUSE 键&nbsp; //？？？<br />　　VK_CAPITAL &nbsp;14 &nbsp;&nbsp;CAPS LOCK 键（大写锁定键）<br />　　VK_ESCAPE &nbsp;1B &nbsp;&nbsp;ESC 键<br />　　VK_SPACE &nbsp;20 &nbsp;&nbsp;SPACEBAR（空格键）<br />　　VK_PRIOR &nbsp;21 &nbsp;&nbsp;PAGE UP 键（上页）<br />　　VK_NEXT &nbsp;22 &nbsp;&nbsp;PAGE DOWN 键（下页）<br />　　VK_END &nbsp;23 &nbsp;&nbsp;END 键<br />　　VK_HOME &nbsp;24 &nbsp;&nbsp;HOME 键（一般用来做开始）<br />　　VK_LEFT &nbsp;25 &nbsp;&nbsp;LEFT ARROW 键<br />　　VK_UP &nbsp;26 &nbsp;&nbsp;UP ARROW 键<br />　　VK_RIGHT &nbsp;27 &nbsp;&nbsp;RIGHT ARROW 键<br />　　VK_DOWN &nbsp;28 &nbsp;&nbsp;DOWN ARROW 键<br />　　VK_SELECT &nbsp;29 &nbsp;&nbsp;SELECT 键&nbsp; //？？？？<br />　　VK_EXECUTE &nbsp;2B &nbsp;&nbsp;EXECUTE 键&nbsp; //？？？？<br />　　VK_SNAPSHOT 2C &nbsp;&nbsp;PRINT SCREEN键（用于Windows 3.0及以后版本）<br />　　VK_INSERT &nbsp;2D &nbsp;&nbsp;INS 键（Insert键）<br />　　VK_DELETE &nbsp;2E &nbsp;&nbsp;DEL 键（Delete键）<br />　　VK_HELP &nbsp;2F &nbsp;&nbsp;HELP 键&nbsp; //？？？找不到<br />　　///////////////////////////////////////////////////<br />　　对于字母键和非小键盘上的数字键,直接在单引号中加入该键就行.<br />　　比如:a键:'A'<br />　　 1键:'1'<br />　　//////////////////////////////////////////////</p>
<p>　　VK_LWIN &nbsp;5B &nbsp;Left Windows 键 (Microsoft自然键盘)<br />　　VK_RWIN &nbsp;5C &nbsp;Right Windows 键 (Microsoft自然键盘)<br />　　VK_APPS &nbsp;5D &nbsp;Applications 键 (Microsoft自然键盘)<br />　　VK_NUMPAD0 &nbsp;60 &nbsp;数字小键盘上的 0 键<br />　　VK_NUMPAD1 &nbsp;61 &nbsp;数字小键盘上的 1 键<br />　　VK_NUMPAD2 &nbsp;62 &nbsp;数字小键盘上的 2 键<br />　　VK_NUMPAD3 &nbsp;63 &nbsp;数字小键盘上的 3 键<br />　　VK_NUMPAD4 &nbsp;64 &nbsp;数字小键盘上的 4 键<br />　　VK_NUMPAD5 &nbsp;65 &nbsp;数字小键盘上的 5 键<br />　　VK_NUMPAD6 &nbsp;66 &nbsp;数字小键盘上的 6 键<br />　　VK_NUMPAD7 &nbsp;67 &nbsp;数字小键盘上的 7 键<br />　　VK_NUMPAD8 &nbsp;68 &nbsp;数字小键盘上的 8 键<br />　　VK_NUMPAD9 &nbsp;69 &nbsp;数字小键盘上的 9 键<br />　　VK_MULTIPLY &nbsp;6A &nbsp;Multiply 键 （*键）<br />　　VK_ADD &nbsp;6B &nbsp;Add 键（+）<br />　　VK_SEPARATOR 6C &nbsp;Separator 键<br />　　VK_SUBTRACT 6D &nbsp;Subtract 键 （&#8212;）<br />　　VK_DECIMAL &nbsp;6E &nbsp;Decimal 键（.）<br />　　VK_DIVIDE &nbsp;6F &nbsp;Divide 键(/)<br />　　VK_F1 &nbsp;70 &nbsp;F1 键<br />　　VK_F2 &nbsp;71 &nbsp;F2 键<br />　　VK_F3 &nbsp;72 &nbsp;F3 键<br />　　VK_F4 &nbsp;73 &nbsp;F4 键<br />　　VK_F5 &nbsp;74 &nbsp;F5 键<br />　　VK_F6 &nbsp;75 &nbsp;F6 键<br />　　VK_F7 &nbsp;76 &nbsp;F7 键<br />　　VK_F8 &nbsp;77 &nbsp;F8 键<br />　　VK_F9 &nbsp;78 &nbsp;F9 键<br />　　VK_F10 &nbsp;79 &nbsp;F10 键<br />　　VK_F11 &nbsp;7A &nbsp;F11 键<br />　　VK_F12 &nbsp;7B &nbsp;F12 键<br />　　VK_F13 &nbsp;7C &nbsp;F13 键<br />　　VK_F14 &nbsp;7D &nbsp;F14 键<br />　　VK_F15 &nbsp;7E &nbsp;F15 键<br />　　VK_F16 &nbsp;7F &nbsp;F16 键<br />　　VK_F17 &nbsp;80H &nbsp;F17 键<br />　　VK_F18 &nbsp;81H &nbsp;F18 键<br />　　VK_F19 &nbsp;82H &nbsp;F19 键<br />　　VK_F20 &nbsp;83H &nbsp;F20 键<br />　　VK_F21 &nbsp;84H &nbsp;F21 键<br />　　VK_F22 &nbsp;85H &nbsp;F22 键<br />　　VK_F23 &nbsp;86H &nbsp;F23 键<br />　　VK_F24 &nbsp;87H &nbsp;F24 键<br />　　VK_NUMLOCK &nbsp;90 &nbsp;NUM LOCK 键<br />　　VK_SCROLL &nbsp;91 &nbsp;SCROLL LOCK 键<br />/////下面的键盘找不到<br />　　VK_ATTN &nbsp;F6 &nbsp;Attn 键<br />　　VK_CRSEL &nbsp;F7 &nbsp;CrSel 键<br />　　VK_EXSEL &nbsp;F8 &nbsp;ExSel 键<br />　　VK_EREOF &nbsp;F9 &nbsp;Erase EOF 键<br />　　VK_PLAY &nbsp;FA &nbsp;Play 键<br />　　VK_ZOOM &nbsp;FB &nbsp;Zoom 键<br />　　VK_OEM_CLEAR FE &nbsp;Clear 键<br /></p><img src ="http://www.cppblog.com/Cass/aggbug/155677.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cass/" target="_blank">Yu</a> 2011-09-13 16:23 <a href="http://www.cppblog.com/Cass/articles/155677.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>剪贴板的使用</title><link>http://www.cppblog.com/Cass/articles/155676.html</link><dc:creator>Yu</dc:creator><author>Yu</author><pubDate>Tue, 13 Sep 2011 08:21:00 GMT</pubDate><guid>http://www.cppblog.com/Cass/articles/155676.html</guid><wfw:comment>http://www.cppblog.com/Cass/comments/155676.html</wfw:comment><comments>http://www.cppblog.com/Cass/articles/155676.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Cass/comments/commentRss/155676.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cass/services/trackbacks/155676.html</trackback:ping><description><![CDATA[<p>//重要函数<br />1、分配内存：<br />GLOBALHANDLE hGlobal = GlobalReAlloc (hGlobal, dwSize, uiFlags) ;</p>
<p>uiFlags：<br />GMEM_FIXED&nbsp;&nbsp;&nbsp; //初始化每一位为0<br />#define GPTR (GMEM_FIXED | GMEM_ZEROINIT)&nbsp;&nbsp;&nbsp; //<br />#define GHND (GMEM_MOVEABLE | GMEM_ZEROINIT)&nbsp;&nbsp; //返回一个虚拟地址</p>
<p>2、访问内存块：<br />&nbsp;int *p = (int *) GlobalLock (hGlobal) ;</p>
<p>解锁内存块：GlobalUnlock (hGlobal) ;</p>
<p>释放内存;hGlobal = GlobalHandle (p) ;</p>
<p>3、把文本送到剪贴板<br />（1）、分配内存，后面是以NULL结尾的，故要加一<br />hGlobal = GlobalAlloc (GHND | GMEM_SHARE, iLength + 1) ;</p>
<p>（2）、锁定并获得指针：<br />pGlobal = GlobalLock (hGlobal) ;</p>
<p>（3）、复制：<br />for (i = 0 ; i &lt; wLength ; i++)<br />&nbsp;*pGlobal++ = *pString++ ;</p>
<p>（4）、由于不用hGlobal 了，可以解锁：<br />GlobalUnlock (hGlobal);&nbsp; //可以防止泄漏</p>
<p>（5）、打开剪贴板并清空<br />OpenClipboard (hwnd) ;<br />EmptyClipboard () ;</p>
<p>（6）、设置剪贴板数据，并关闭剪贴板：<br />SetClipboardData (CF_TEXT, hGlobal) ;<br />CloseClipboard () ;</p>
<p>//注意：不要将锁定的句柄送给剪贴板。<br />//当从程序读出数据时需要锁定hGlobal 句柄以访问内存</p>
<p><br />4、从剪贴板获取文本：<br />（1）确定剪贴板是否含有数据：bAvailable = IsClipboardFormatAvailable (CF_TEXT) ;</p>
<p>（2）、先打开剪贴板：OpenClipboard (hwnd) ;<br />（3）获得句柄：hGlobal = GetClipboardData (CF_TEXT) ;</p>
<p>（4）把数据复制到程序前先分配内存：pText = (char *) malloc (GlobalSize (hGlobal)) ;<br />获得数据大小GlobalSize (hGlobal)<br />（5）、锁定句柄获取指向剪贴板的指针：pGlobal = GlobalLock (hGlobal) ;<br />（6）、复制数据：strcpy (pText, pGlobal) ;或者while (*pText++ = *pGlobal++) ;</p>
<p>（7）、解锁后关闭剪贴板<br />GlobalUnlock (hGlobal) ;<br />CloseClipboard ();</p>
<p><br />(5)、逐次获得数据iFormat，<br />iFormat = 0 ;<br />OpenClipboard (hwnd) ;<br />while (iFormat = EnumClipboardFormats (iFormat))<br />｛<br />&nbsp;//<br />｝<br />CloseClipboard () ;<br />您剪贴板不同格式的个数： //iCount = CountClipboardFormats () ;<br /><br /><br />//过程<br /></p>
<p>一、写入数据到剪贴板<br />1、打开<br />BOOL OpenClipboard( 　　__in HWND hWndNewOwner 　); 　如果函数执行成功,返回非零值. 　如果函数执行失败,返回零,为了获得更多的错误信息，调用GetLastError. </p>
<p>2、清空<br />　BOOL EmptyClipboard(&nbsp; VOID );该函数清空剪切板并释放剪切板内数据的句柄。函数在之后会将剪切板的所有权指派给当前打开剪切板的窗口。 </p>
<p>3、设置数据<br />HANDLE SetClipboardData(<br />&nbsp; UINT uFormat,&nbsp;&nbsp; //数据的格式<br />&nbsp; HANDLE hMem&nbsp;&nbsp;//数据指定的内存形式<br />); <br />&#9312;、使用 <br />HGLOBAL GlobalAlloc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 分配内存<br />( 　　UINT uFlags, // 分配属性(方式) 　　<br />DWORD dwBytes // 分配的字节数 　　<br />);<br />//注意要使用GMEM_MOVEABLE 标志<br />&#9313;、锁定&nbsp;&nbsp; 锁定内存中指定的内存块，并返回一个地址值，令其指向内存块的起始处<br />LPVOID GlobalLock( 　　HGLOBAL hMem // handle to global memory object 　　); <br />&#9314;解锁<br />GlobalUnlock函数解除锁定的内存块，使指向该内存块的指针无效，GlobalLock锁定的内存，一定要用GlobalUnlock解锁。</p>
<p>4、关闭<br />　　BOOL CloseClipboard(VOID);&nbsp;&nbsp; //关闭剪贴板,这使其他窗口能访问剪贴板。</p>
<p>二、读取<br />1、打开 并检查IsClipboardFormatAvailable_<br />2、获取&nbsp; GetClipboardData<br />注意使用<br />用GlobalLock锁定剪贴板那内存块 　　<br />GlobalSize可以用来获取该内存块的大小 　　<br />使用GlobalUnlock解除锁定<br />3、关闭</p>
<p>&nbsp;</p><img src ="http://www.cppblog.com/Cass/aggbug/155676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cass/" target="_blank">Yu</a> 2011-09-13 16:21 <a href="http://www.cppblog.com/Cass/articles/155676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows GDI 设备描述表对象---------位图、画笔、字体、文本、元文件</title><link>http://www.cppblog.com/Cass/articles/155673.html</link><dc:creator>Yu</dc:creator><author>Yu</author><pubDate>Tue, 13 Sep 2011 08:16:00 GMT</pubDate><guid>http://www.cppblog.com/Cass/articles/155673.html</guid><wfw:comment>http://www.cppblog.com/Cass/comments/155673.html</wfw:comment><comments>http://www.cppblog.com/Cass/articles/155673.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Cass/comments/commentRss/155673.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cass/services/trackbacks/155673.html</trackback:ping><description><![CDATA[一、位图<br />
<p>1、三大函数<br />从源写到目标　　<br />BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop)；</p>
<p>从源写到目标　，可以拉伸<br />BOOL StretchBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeighDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop)；</p>
<p>选定刷子。<br />函数原型：BOOL PatBlt(HDC hdc, int nXLeft, int nYLeft, int nWidth, int nHeight, DWORD dwRop)；</p>
<p>2、加载位图资源：<br />（1）、加载&nbsp; hBitmap=LoadBitmap(hinst,MAKEINTRESOURCE(IDB_BITMAP2));<br />（2）、得到对象&nbsp; GetObject(hBitmap,sizeof(BITMAP),&amp;bitmap);<br />（3）创建内存DC&nbsp;&nbsp;&nbsp;&nbsp; hdcMem=CreateCompatibleDC(hdc);&nbsp;&nbsp; //创建内存dc<br />(4)把位图对象选中到内存dc上&nbsp;&nbsp;&nbsp;&nbsp; SelectObject(hdcMem,hBitmap);&nbsp; <br />(5)用 BitBlt、StretchBlt、PatBlt画图：<br />注意要删除DC,和对象<br />DeleteDC(hdcMem);<br />DeleteObject(hBitmap);</p>
<p>3、填充bitmap创建单色小位图。<br />先用数据填充bitmap。然后调用CreateBitmap(&amp;bitmap);</p>
<p><br />4、用位图做画刷&nbsp;&nbsp; HBRUSH CreatePatternBrush(HBITMAP hbmp)；　<br />该函数可以创建具有指定位图模式的逻辑刷子，该位图不能是DIB类型的位图，DIB位图是由CreateDIBSection函数创建的。<br /><br /><br />二、透明位图/透明窗口<br /></p>
<p>//改变扩展风格<br />DWORD dwStyle=GetWindowLong(hwnd,GWL_EXSTYLE);<br />SetWindowLong(hwnd,GWL_EXSTYLE,dwStyle^0x80000);<br />//动态链接库<br />hinst=LoadLibrary("User32.DLL");<br />if(hinst)<br />{<br />typedef BOOL (WINAPI *MYFUNC)(HWND ,COLORREF,BYTE,DWORD);<br />MYFUNC fun=NULL;<br />//获得指针<br />fun=(MYFUNC)GetProcAddress(hinst,"SetLayeredWindowAttributes");<br />if (fun)<br />{<br />&nbsp;fun(hwnd,0,180,2);&nbsp;&nbsp;&nbsp; //设置<br />}<br />}</p>
<p>//扩展风格WS_EX_LAYERED</p>
<p>&nbsp;</p><br />三、元文件<br />
<p>一、创建：<br />CreateMetaFile（）； NULL表示存储在内存中<br />CloseMetaFile&nbsp;&nbsp;&nbsp; //返回元文件句柄<br />PlayMetaFile&nbsp;&nbsp;&nbsp;&nbsp; //在指定的设备场景中回放一个图元文件。与原元文件的坐标有关，故要定义原点在哪里。。。<br />DeleteMetaFile&nbsp;&nbsp; //删除<br />hmf=GetMetaFile（szFileName）；&nbsp;&nbsp;&nbsp; //获得句柄<br />CopyMetaFile&nbsp;&nbsp; //为元文件制定一个副本<br />EnumMetaFile &nbsp;//为一个标准的windows图元文件枚举单独的图元文件记录<br />PlayMetaFileRecord&nbsp;&nbsp;&nbsp; //回放来自图元文件的单条记录（每条记录都包含了单个GDI绘图命令）<br />//EnumMetaFileProc&nbsp; <br />int CALLBACK EnumMetaFileProc(<br />&nbsp; HDC hDC,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // handle to device context<br />&nbsp; HANDLETABLE FAR *lpHTable,&nbsp; // pointer to metafile handle table<br />&nbsp; METARECORD FAR *lpMFR,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // pointer to metafile record<br />&nbsp; int nObj,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // count of objects<br />&nbsp; LPARAM lpClientData&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // pointer to optional data<br />);</p>
<p>GetMetaFileBitsEx&nbsp; </p>
<p>SetMetaFileBitsEx </p>
<p>//增强型元文件<br />CreateEnhMetaFile //创建增强型元文件<br />CloseEnhMetaFile&nbsp; //返回元文件句柄。<br />PlayEnhMetaFile&nbsp;&nbsp; //显示元文件<br />GetEnhMetaFileHeader(hemf,cbsize,&amp;emh);&nbsp;&nbsp;&nbsp; //获得ENHMETAHEADER信息。<br />GetEnhMetaFile&nbsp;&nbsp;&nbsp; //取得磁盘文件中包含的一个增强型图元文件的图元文件句柄<br />EnumEnhMetaFile <br />PlayEnhMetaFileRecord&nbsp;&nbsp;&nbsp;&nbsp; //　回放单独一条增强型图元文件记录<br />//<br />CopyEnhMetaFile&nbsp;&nbsp; <br />DeleteEnhMetaFile&nbsp; <br />EnhMetaFileProc&nbsp; <br />&nbsp; <br />GdiComment&nbsp; <br />GetEnhMetaFileBits&nbsp; <br />GetEnhMetaFileDescription&nbsp; <br />GetEnhMetaFilePaletteEntries&nbsp; <br />GetWinMetaFileBits&nbsp;&nbsp; <br />&nbsp; <br />SetEnhMetaFileBits&nbsp; <br />SetWinMetaFileBits </p>
<p>&nbsp; 记录数据的元文件：<br />ENHMETAHEADER<br />typedef struct tagENHMETAHEADER { // enmh <br />&nbsp;&nbsp;&nbsp; DWORD iType;&nbsp;&nbsp;&nbsp; //类型<br />&nbsp;&nbsp;&nbsp; DWORD nSize; &nbsp;//大小<br />&nbsp;&nbsp;&nbsp; RECTL rclBounds;&nbsp;&nbsp;&nbsp;&nbsp; //指出图像大小<br />&nbsp;&nbsp;&nbsp; RECTL rclFrame; &nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp; DWORD dSignature; &nbsp;//字符串&#8220;EMF&#8221;<br />&nbsp;&nbsp;&nbsp; DWORD nVersion; &nbsp;//0X00010000<br />&nbsp;&nbsp;&nbsp; DWORD nBytes; &nbsp;//总字节数<br />&nbsp;&nbsp;&nbsp; DWORD nRecords; &nbsp;//指出记录数。（头记录，GDI函数调用等记录）<br />&nbsp;&nbsp;&nbsp; WORD&nbsp; nHandles; &nbsp;//指出元文件使用图形对象的非默认句柄数量。<br />&nbsp;&nbsp;&nbsp; WORD&nbsp; sReserved; <br />&nbsp;&nbsp;&nbsp; DWORD nDescription;&nbsp;&nbsp;//描述串的大小&nbsp; <br />&nbsp;&nbsp;&nbsp; DWORD offDescription; &nbsp;//描述串在文件中的偏移量<br />&nbsp;&nbsp;&nbsp; DWORD nPalEntries; &nbsp;&nbsp;//调试板中条目的个数<br />&nbsp;&nbsp;&nbsp; SIZEL szlDevice; &nbsp;&nbsp;//指出以像素为单位的输出设备大小<br />&nbsp;&nbsp;&nbsp; SIZEL szlMillimeters;&nbsp;//以mm为单位输出的设备大小<br />&nbsp;&nbsp;&nbsp; DWORD cbPixelFormat;&nbsp;//描述串<br />&nbsp;&nbsp;&nbsp; DWORD offPixelFormat;<br />&nbsp;&nbsp;&nbsp; DWORD bOpenGL;<br />} ENHMETAHEADER; </p><br /><br />四、字体<br />
<p>一、用于文本输出的函数：<br />1、TextOut (hdc, xStart, yStart, pString, iCount) ;<br />2、TabbedTextOut ( hdc, xStart, yStart, pString, iCount,iNumTabs, piTabStops, xTabOrigin) ;iNumTabs制表位数，piTabStops以像素为单位的制表位数。xTabOrigin平均字符宽度设置。<br />3、BOOL ExtTextOut(HDC hdc, int X, int Y, UINT fuOptions, CONST RECT *lprc, LPCTSTR lpString, UINT cbCount, CONST INT *lpDx)；lpDx指定字符串中连续字符的间隔、NULL为默认。<br />4、int DrawText(HDC hDC, LPCTSTR lpString,int nCount, LPRECT lpRect, UINT uFormat )；<br />5、int DrawTextEx(HDC, hdc, LPTSTR lpchText, int cchText, LPRECT lprc, UINT dwDTFormat, LPDRAWTEXTPARAMS lpDTParams)；</p>
<p>二、逻辑字体<br />1、CreateFont 或CreateFontIndirect建立逻辑字体<br />2、GetTextFace (hdc, sizeof (szFaceName) / sizeof (TCHAR), szFaceName) ;获得字体名<br />3、GetTextMetrics (hdc, &amp;textmetric) ;获得字体信息</p>
<p>三、<br />该函数为指定的设备环境设置图形模式。int SetGraphicsMode(HDC hdc, int iMode)；<br />该函数用指定的方式修改与设备环境有关的全局转换。BOOL ModifyWorldTransform(HDc hdc, CONST XFORM *lpXform, DWORD iMode)；</p>
<p>四、hPen = ExtCreatePen (iStyle, iWidth, &amp;lBrush, 0, NULL) ;使用该函数正常地绘制线段。</p>
<p>五：轨迹<br />BeginPath&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {路径开始}<br />EndPath&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {路径结束}<br />StrokePath&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {绘制路径}<br />FillPath&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {填充路径}<br />StrokeAndFillPath {绘制并填充路径}<br />SelectClipPath&nbsp;&nbsp;&nbsp;&nbsp; 路径的运算<br />//在路径中可以使用的图形命令有:<br />AngleArc<br />Arc<br />ArcTo<br />Chord<br />CloseFigure<br />Ellipse<br />ExtTextOut<br />LineTo<br />MoveToEx<br />Pie<br />PolyBezier<br />PolyBezierTo<br />PolyDraw<br />Polygon<br />Polyline<br />PolylineTo<br />PolyPolygon<br />PolyPolyline<br />Rectangle<br />RoundRect<br />TextOut<br /><br /><br />六、字体效果<br /></p>
<p>一、设置字体大小<br />LOGFONT lf;<br />ZeroMemory(&amp;lf,sizeof(lf));<br />lf.lfCharSet=DEFAULT_CHARSET;<br />lf.lfHeight=m_iMineLength;<br />lf.lfWidth=m_iMineLength;<br />lf.lfWeight=1000;<br />HFONT hFont=CreateFontIndirect(&amp;lf);<br />HFONT hOldFont=(HFONT)SelectObject(m_hMemDC,hFont);<br />DeleteObject(hFont);</p>
<p>二、输出透明底色字体<br />SetBkMode(hMemDc,TRANSPARENT);<br />TextOut(hMemDc,0,0,sNum,strlen(sNum));</p>
<p><br />三、居中输出<br />DrawText(hdc,str,&amp;rt,DT_CENTER|DT_VCENTER|DT_SINGLELINE);<br />//注意要同时DT_VCENTER|DT_SINGLELINE才能居中</p>
<p>&nbsp;</p><img src ="http://www.cppblog.com/Cass/aggbug/155673.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cass/" target="_blank">Yu</a> 2011-09-13 16:16 <a href="http://www.cppblog.com/Cass/articles/155673.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows GDI使用大全 -----画图基础</title><link>http://www.cppblog.com/Cass/articles/155671.html</link><dc:creator>Yu</dc:creator><author>Yu</author><pubDate>Tue, 13 Sep 2011 08:12:00 GMT</pubDate><guid>http://www.cppblog.com/Cass/articles/155671.html</guid><wfw:comment>http://www.cppblog.com/Cass/comments/155671.html</wfw:comment><comments>http://www.cppblog.com/Cass/articles/155671.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Cass/comments/commentRss/155671.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cass/services/trackbacks/155671.html</trackback:ping><description><![CDATA[一、Windows可以画直线、椭圆线（椭圆圆周上的曲线）和贝塞尔曲线。<br />////////////7 个画线函式是：<br />(1)画直线<br />LineTo&nbsp;&nbsp;&nbsp; BOOL LineTo(HDC hdc,int nXEnd,int nYEnd);<br />结合MoveToEx函数使用BOOL MoveToEx(HDC hdc,int X,int Y,LPPOINT lpPoint);Point记录了旧的坐标点（先前的当前位置）。<br />///注意：GetCurrentPositionEx (hdc, &amp;pt) ;获得当前位置。 
<p>（2）画一系列相连的直线。<br />Polyline&nbsp;&nbsp;&nbsp; 把Point数组的点连接成线。不用当前点做开始点，<br />PolylineTo&nbsp; 使用当前点做开始点，并将当前的位置设置成最后一根线的终点。<br />PolyPolyline 画多组相连的线。</p>
<p>(3)填充矩形<br />Rectangle 画一个矩形，并用白色刷子填充、Rectangle（hdc,xleft,ytop,xright,ybottom）<br />Ellipse&nbsp;&nbsp; 画一椭圆，并用白色的刷子填充。Ellipse （hdc,xleft,ytop,xright,ybottom）<br />RoundRect 画圆角矩形。并用白色的刷子填充 RoundRect（hdc,xL,yT,xR,yB,xC,yC）<br />&nbsp;xC,yC是圆角矩形的圆角。<br />Arc&nbsp; 画椭圆线。Arc (hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd,yEnd) <br />Chord 画弦弓形Chord(hdc,xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd) <br />Pie 画饼形图 Pie(hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd);<br />ArcTo 和AngleArc 画椭圆线。</p>
<p>//////多边形<br />Polygon(hdc,apt，iCount)；&nbsp; //画一个多边形，最后一点与第一点相连。<br />PolyPolygon(hdc，apt，aiCount,iPolyCount);&nbsp; //画多个多边形。</p>
<p><br />&nbsp;</p>
<p>&nbsp;<br />（4）贝塞尔曲线,画贝塞尔曲线<br />POINY&nbsp; apt【4】=（起点，第一控制点，第二控制点，终点）<br />需要注意的是：：曲线是起点到终点的连线曲线，控制点（调整点）不在其中、<br />PolyBezier （hdc,apt,icount）<br />PolyBezierTo （hdc,apt,icount）。使用当前点为起点<br />PolyDraw 画一系列相连的线以及贝塞尔曲线。<br />对于多条贝塞尔曲线，后一条的起点是前一条的终点。</p>
<p>(5)矩形函数<br />FillRect(hdc,&amp;rect,hBrush);&nbsp; //使用指定的画刷来填充矩形，（不包含（Right，buttom）FrameRect(hdc,&amp;rect,hBrush);//使用画刷来填充矩形框，不填充矩形，<br />InvertRect(hdc,&amp;rect);&nbsp; //使像素翻转，白变黑，黑变白，绿变红。</p>
<p>///////对Rect的操作<br />SetRect(&amp;rect,xLeft,yTop,xRight,yButtom);//赋值<br />OffsetRect(&amp;rect,x,y);&nbsp; //沿x，y移动<br />InflateRect(&amp;rect,x,y); //增减矩形的尺寸。<br />SetRectEmpty(&amp;rect);&nbsp; //置0<br />CopyRect(&amp;A,&amp;B);把B复制到A.<br />IntersectRect(&amp;A,&amp;B1,&amp;B2);//把B1和B2的交集复制到A.<br />UnionRect(&amp;A,&amp;B1,&amp;B2);&nbsp; //取并集<br />bEmpty=IsRectEmpty(&amp;Rect);//判断矩形是否为空。<br />blnRect=PtlnRect(&amp;Rect,point); //判断点是否在矩形中。<br /><br /><br />二、映像坐标<br /></p>
<p>1）、视口：设备坐标（像素）<br />窗口：逻辑坐标，像素、mm、英寸<br />视口（设备）坐标转换为窗口（逻辑）坐标：<br />公式：一般不用记，有专门的函数。<br />xWindow=(xViewport - xViewOrg) * xWinExt/xViewExt +xWinOrg<br />yWindow=(yViewport - yViewOrg) * yWinExt/yViewExt +yWinOrg</p>
<p>(xWindow,yWindow) 转换后的窗口坐标<br />（xViewport，yViewport）待转换的视口坐标<br />(xWinExt,yWinExt)是逻辑座标的视窗范围；<br />(xViewExt,yViewExt)是装置座标的视窗范围。<br />(xWinOrg，yWinOrg)是逻辑座标的窗口原点；<br />(xViewOrg,yViewOrg)是装置座标的视口原点</p>
<p>2）、设备点转化为逻辑点<br />DPtoLP (hdc, pPoints, iNumber);pPoints 结构阵列的指标，而iNumber 是要转换的点的个数<br />例如：<br />GetClientRect (hwnd, &amp;rect) ;<br />DPtoLP (hdc, (PPOINT) &amp;rect, 2) ;</p>
<p>将逻辑点转换为装置点：<br />LPtoDP (hdc, pPoints, iNumber) ;</p>
<p><br />3):<br />SetMapMode(hdc,iMapMode);&nbsp;&nbsp; //设置映射方式。<br />默认：MM_TEXT：每个逻辑单位转换为一个图素，X正方向向右，Y正方向向下。<br />原点可以改变，范围不可改变<br />SetWindowOrgEx();&nbsp; //设置设备环境的原点<br />SetViewprocOrgEx();&nbsp;//设置客户区中心<br />//<br />//原点和范围都可以改变、<br />MM_ANISOTROPIC：逻辑单位转换成具有任意比例轴的任意单位，用SetWindowExtExSetViewportExtEx函数可指定单位、方向和比例。</p>
<p>//原点可以改变，范围不可以改变，X的正方面向右，Y的正方向向上。<br />MM_HIENGLISH：每个逻辑单位转换为0.001英寸，X的正方面向右，Y的正方向向上。<br />MM_HIMETRIC：每个逻辑单位转换为0.01毫米，X正方向向右，Y的正方向向上。<br />MM_ISOTROPIC：逻辑单位转换成具有均等比例轴的任意单位，即沿X轴的一个单位等于沿Y轴的一个单位，用和函数可以指定该轴的单位和方向。图形设备界面（GDI）需要进行调整，以保证X和Y的单位保持相同大小（当设置窗口范围时，视口将被调整以达到单位大小相同）。<br />MM_LOENGLISH：每个逻辑单位转换为0.01英寸，X正方向向右，Y正方向向上。<br />MM_LOMETRIC：每个逻辑单位转换为0.1毫米，X正方向向右，Y正方向向上。<br />MM_TWIPS；每个逻辑单位转换为打印点的1／20（即1／1400英寸），X正方向向右，Y方向向上。<br /></p>
<p>&nbsp;</p><br />三、GDI&nbsp; 对象<br />
<p>画笔、刷子、位图、区域、字体、调色板是可以创建的6种GDI对象。<br />GetStockObject(obj);获取对象的句柄。<br />DeleteObject(obj);&nbsp; 删除对象。（注意不能在有效的设备描述表中删除。）<br />除调色板外，其他对象都是通过SelectObject(hdc,obj);选入设备描述表中。<br />GetObject(HOBJ,size,lpObj); lpObj可以是下列的结构体。获取对象信息、<br />BITMAP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //位图<br />DIBSECTION&nbsp; //位图 <br />EXTLOGPEN&nbsp;&nbsp; //画笔<br />LOGBRUSH&nbsp;&nbsp;&nbsp; //刷 <br />LOGFONT&nbsp;&nbsp;&nbsp;&nbsp; //字体<br />LOGPEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //画笔<br />（1）画笔（Pen） windows的默认值：BLACK_PEN<br />创建：<br />方法一：hPen=CreatePen（iPenStyle,iWidth,crColor）;<br />iPenStyle的参数：PS_SOLID&nbsp;&nbsp;&nbsp; 实心画笔<br />&nbsp;&nbsp; PS_DASH&nbsp;&nbsp;&nbsp;&nbsp; 破折号画笔（在iWidth&lt;1有效，否则系统会用实心笔替代）<br />&nbsp;&nbsp; PS_DOT&nbsp;&nbsp;&nbsp;&nbsp; 虚线（在iWidth&lt;1有效，否则系统会用实心笔替代）<br />&nbsp;&nbsp;PS_DASHDOT&nbsp; 点划线（在iWidth&lt;1有效，否则系统会用实心笔替代）<br />&nbsp;&nbsp;PS_DASHDOTDOT 双重点划线（在iWidth&lt;1有效，否则系统会用实心笔替代）<br />&nbsp;&nbsp;PS_NULL&nbsp;&nbsp; 空白笔<br />&nbsp;&nbsp;PS_INSIDEFRAME&nbsp; 粗实线，当iWidth&gt;1可以使用抖动色（不只是纯色）</p>
<p>方法二：LOGPEN logpen&nbsp;&nbsp; //指定笔颜色、大小、类型的结构体。同上。<br />&nbsp;hPen=CreatePenIndirect(&amp;logpen);</p>
<p>（2）字体（Font） 默认值：SYSTEM_FONT<br />创建：<br />一：CreateFont<br />只用到2个参数，其他都为0，例：CreateFont (0, 0, 0, 0, 0, 0, 0, 0, dwCharSet, 0, 0, 0, FIXED_PITCH, NULL)<br />HFONT CreateFont(<br />&nbsp; int nHeight,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 字符宽度，逻辑单位<br />&nbsp; int nWidth,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // <br />&nbsp; int nEscapement,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 斜放置字符串<br />&nbsp; int nOrientation,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 字符倾斜的角度，影响单个字符<br />&nbsp; int fnWeight,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 粗体。0&#8212;400标准，700粗体<br />&nbsp; DWORD fdwItalic,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 斜体<br />&nbsp; DWORD fdwUnderline,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 下划线<br />&nbsp; DWORD fdwStrikeOut,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 删除线<br />&nbsp; DWORD fdwCharSet,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 1为默认值。指定字体字符集一个字节的值（*不用理会）<br />&nbsp; DWORD fdwOutputPrecision,&nbsp; // 输出精度*<br />&nbsp; DWORD fdwClipPrecision,&nbsp; // 裁剪精度*<br />&nbsp; DWORD fdwQuality,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 期望匹配字体*<br />&nbsp; DWORD fdwPitchAndFamily,&nbsp; // 字体族*<br />&nbsp; LPCTSTR lpszFace&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 字样*<br />);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />字体：<br />SYSTEM_FONT <br />SYSTEM_FIXED_FONT <br />OEM_FIXED_FONT</p>
<p>ANSI_FIXED_FONT、<br />ANSI_VAR_FONT <br />DEVICE_DEFAULT_FONT</p>
<p>其中: WM_INPUTLANGCHANGE: dwCharSet = wParam ;<br />二：LOGFONT logfont；<br />&nbsp;&nbsp;&nbsp; CreateFontIndirect（&amp;logfont）；</p>
<p>（3）刷子（Brush） 默认值::WHITE_BRUSH <br />系统的刷子：&nbsp;WHITE_BRUSH&nbsp; <br />&nbsp;&nbsp;LTGRAY_BRUSH&nbsp;&nbsp;&nbsp; 亮灰<br />&nbsp;&nbsp;GRAY_BRUSH&nbsp;灰<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DKGRAY_BRUSH&nbsp;黑灰<br />&nbsp;&nbsp;BLACK_BRUSH <br />创建：<br />一：hBrush=CreateSolidBrush(crColor);<br />二：hBrush=CreateHatchBrush(iHatchStyle,crColor);//创建有影线的刷子填充部分为阴影<br />其中：iHatchStyle的参数如下：<br />&nbsp;HS_BDIAGONAL&nbsp;&nbsp; 45度的斜线、<br />&nbsp;HS_CROSS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 十字型的线、<br />&nbsp;HS_DIAGCROSS&nbsp;&#215;型<br />&nbsp;HS_FDIAGONAL &nbsp;135度斜线<br />&nbsp;HS_HORIZONTAL&nbsp;&nbsp; 水平<br />&nbsp;HS_VERTICAL &nbsp;垂直&nbsp;<br />三：LOGBRUSH&nbsp; logbrush<br />&nbsp;&nbsp;&nbsp; CreateBrushIndirect（&amp;logbrush）；<br />四： hBrush=CreatePatternBrush(HBITMAP hbmp);//创建位图的刷子、<br />五：hBrush=CreateDIBPatternBrushPt；//创建DIB位图的刷子。<br />&nbsp;&nbsp;&nbsp; CreateDIBPatternBrush, </p>
<p>&nbsp;</p>
<p><br />（4）位图（Bitmap）默认值：None（无）；<br />&nbsp;<br />CreateBitmap, <br />CreateBitmapIndirect, <br />CreateCompatibleBitmap, <br />CreateDIBitmap, <br />CreateDIBSection <br />CreateSolidBrush<br />第一种：：<br />HBITMAP CreateBitmap(<br />&nbsp; int nWidth,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 宽<br />&nbsp; int nHeight,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 高<br />&nbsp; UINT cPlanes,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 颜色板的数目<br />&nbsp; UINT cBitsPerPel,&nbsp;&nbsp; // 没像素的位数。<br />&nbsp; CONST VOID *lpvBits // 指向颜色数据数组指针。这些颜色数据用来设置矩形区域内像素的颜色。矩形区域中的每一扫描线必须是双字节的整数倍（不足部分以0填充）。如果该参数为NULL，那么就表示没有定义新位图。<br />);</p>
<p>//简化版<br />HBITMAP CreateCompatibleBitmap( HDC hdc,&nbsp;&nbsp;&nbsp;&nbsp; int nWidth,&nbsp;&nbsp; int nHeight&nbsp; );</p>
<p><br />//第二种<br />HBITMAP CreateBitmapIndirect(&amp;bitmap);bitmap是BITMAP结构体</p>
<p>（5）区域（Region）区域是对显示器上一个范围的描述，这个范围是矩形、多边形和椭圆的组合，把区域选进设备描述表，区域可以用于绘制和剪裁。<br />作用：iRgnType=CombineRgn(hRgn,hRgn1,hRgn2,iCombine);<br />iCombine的参数：<br />RGN_AND&nbsp; 两个源区域的公共部分<br />RGN_OR&nbsp;&nbsp; 全部<br />RGN_XOR&nbsp; 除去公共部分。<br />RGN_DIFF hRgn1不在hRgn2的部分<br />RGN_COPY hRgn1的全部。（忽略hRgn2）；<br />iRgnType的参数：<br />NULLREGION&nbsp;&nbsp;&nbsp;&nbsp; 得到空区域<br />SIMPLEREGION&nbsp;&nbsp; 得到简单的矩形、椭圆或多边形<br />COMPLEXREGION&nbsp;&nbsp; 多个多边形、矩形、椭圆的组合<br />ERROR&nbsp;&nbsp;出错<br />创建：<br />一：创建矩形区域：<br />&nbsp;&nbsp;&nbsp; hRgn = CreateRectRgn (xLeft, yTop, xRight, yBottom) ;<br />&nbsp;&nbsp;&nbsp; hRgn = CreateRectRgnIndirect (&amp;rect) ;<br />二： 创建椭圆剪裁区域;<br />&nbsp;&nbsp; hRgn = CreateEllipticRgn (xLeft, yTop, xRight, yBottom) ;//<br />&nbsp;&nbsp; hRgn = CreateEllipticRgnIndirect (&amp;rect) ;<br />三；创建多边形剪裁区域<br />&nbsp;hRgn = CreatePolygonRgn (&amp;point, iCount, iPolyFillMode) ;</p>
<p>///////////////////////////////////////////////////////////<br />矩形与区域的剪裁<br />对于矩形;<br />InvalidateRect (hwnd, NULL, TRUE) ;//使矩形无效<br />GetUpdateRect 来取得失效矩形的座标或WM_PAINT中从PAINTSTRUCT结构中得到<br />ValidateRect使有效<br />对于区域:<br />InvalidateRgn (hwnd, hRgn, bErase) ;<br />ValidateRgn (hwnd, hRgn) ;</p>
<p><br />SelectObject(hdc,hRgn);&nbsp; 或SelectClipRgn(hdc,hRgn);选进设备描述表<br />ExcludeClipRect用於将一个矩形从剪裁区域里排除掉，<br />IntersectClipRect 用於建立一个新的剪裁区域，它是前一个剪裁区域与一个矩形的交，OffsetClipRgn 用於将剪裁区域移动到显示区域的另一部分。<br /></p><br />四、设备描述表<br />
<p>理解1：设备描述表中包含许多确定的GDI函数如何在设备上工作的当前属性。这些属性允许传递给GDI函数的参数只包含其实坐标或者尺寸信息，而不包含Windows在设备上显示对象时需要的所以其他信息、</p>
<p>理解2：一个设备描述表通常指一个物理显示设备。如视频显示器或打印机。</p>
<p>理解3：设备描述表（简称DC）实际上是GDI内部保存的数据结构。有些值是图形化的&#8220;属性&#8221;，这些属性定义了一些GDI绘图函数的工作，例如：文本颜色，文本的背景、TextOut函数的X坐标，y坐标映射到窗口客户区的方式，还有windows显示的字体、</p>
<p>//////////////////////////////////获取句柄hdc</p>
<p>(1)注意这不能使无效区域变的有效<br />hdc=GetDC(hwnd);<br />//////<br />ReleaseDC(hwnd,hdc);</p>
<p>(2)在处理WM_PAINT消息使使用。能使无效区域变的有效、重绘。<br />hdc=BeginPaint(hwnd,&amp;ps);<br />/////////<br />EndPaint(hwnd,&amp;ps);</p>
<p>（3）能获得非客户区的绘制消息。包括窗口的标题栏，菜单栏，和滚动条、框架等。<br />在WM_NCPAINT中处理、<br />hdc=GetWindowDC(hwnd);<br />//////<br />ReleaseDC(hwnd,hdc);</p>
<p>（4）通用获得DC的方法。视频显示器或者打印机上的DC.<br />hdc=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);&nbsp;&nbsp; //获得整个屏幕的dc<br />//////////////<br />DeleteDC(hdc);</p>
<p>（5）获得一个dc，其参数与CreateDC的参数相同。但是不能用这个信息环境句柄往设备描述表上写东西。////特别 注意。<br />hdc=CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL);<br />/////////<br />DeleteDC (hdc);</p>
<p><br />（6）可以把位图选进内部设备描述表。然后用GDI 函数在位图上绘画。<br />hdcMem=CreateCompatibleDC(hdc); //位图选进内部设备描述表<br />///////////<br />DeleteDC (hdcMem);</p>
<p>（7）获取元文件的设备描述表来创建元文件。<br />hdcMeta=CreateMetaFile(pszFilename);<br />//////////<br />hmf=ColseMetaFile(hdcMeta)</p>
<p>/////////////////////获取信息<br />（8）获取视频显示器的尺寸，色彩等信息。<br />int iValue=GetDeviceCaps(hdc,ilndex);</p>
<p>///////////////////保存设备描述表。<br />(9)<br />SaveDC(hdc);可以保存多次<br />RestoreDC(hdc,-1);恢复DC</p><br /><br />五、设备描述表属性<br />
<p>1\一些空间隔的填充。如点和虚线之间的间隔填充。<br />背景模式：使用SetBkMode(hdc,iBkMode)修改<br />（1）OPAQUE(系统默认值)，间隔使用背景颜色填充。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 修改：SetBkColor(hdc,crColor);&nbsp; //修改背景色<br />&nbsp;&nbsp;GetBkColor(hdc);&nbsp; 获取背景色<br />（2）TRANSPARENT&nbsp; 不填充间隔 ,不擦除背景，透明模式<br />&nbsp;&nbsp;</p>
<p>2\绘图方式：<br />用画笔进行绘图实际是画笔像素与目标位置处原来像素之间的某种布尔值运算。<br />默认值：：R2_COPYPEN;<br />修改：<br />SetROP2(hdc,iDrawMode);<br />获取：<br />iDrawMode=GetROP2(hdc);</p><br /><img src ="http://www.cppblog.com/Cass/aggbug/155671.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cass/" target="_blank">Yu</a> 2011-09-13 16:12 <a href="http://www.cppblog.com/Cass/articles/155671.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OpenGL 基础</title><link>http://www.cppblog.com/Cass/articles/155666.html</link><dc:creator>Yu</dc:creator><author>Yu</author><pubDate>Tue, 13 Sep 2011 08:00:00 GMT</pubDate><guid>http://www.cppblog.com/Cass/articles/155666.html</guid><wfw:comment>http://www.cppblog.com/Cass/comments/155666.html</wfw:comment><comments>http://www.cppblog.com/Cass/articles/155666.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Cass/comments/commentRss/155666.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cass/services/trackbacks/155666.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 工作原理（1）、OpenGL流水线&nbsp;命名约定：（2）、显示形状函数功能：设置初始显示模式。函数原型：void glutInitDisplayMode(unsigned int mode);　　mode : mode可取以下值或其组合：值&nbsp;&nbsp;&nbsp;&nbsp;&nbs...&nbsp;&nbsp;<a href='http://www.cppblog.com/Cass/articles/155666.html'>阅读全文</a><img src ="http://www.cppblog.com/Cass/aggbug/155666.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cass/" target="_blank">Yu</a> 2011-09-13 16:00 <a href="http://www.cppblog.com/Cass/articles/155666.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>蝴蝶桩仿真模拟驾驶</title><link>http://www.cppblog.com/Cass/articles/147455.html</link><dc:creator>Yu</dc:creator><author>Yu</author><pubDate>Sat, 28 May 2011 00:54:00 GMT</pubDate><guid>http://www.cppblog.com/Cass/articles/147455.html</guid><wfw:comment>http://www.cppblog.com/Cass/comments/147455.html</wfw:comment><comments>http://www.cppblog.com/Cass/articles/147455.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Cass/comments/commentRss/147455.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cass/services/trackbacks/147455.html</trackback:ping><description><![CDATA[<p style="text-align: left; line-height: 150%; text-indent: -18pt; margin: 6pt 0cm 0pt 18pt; layout-grid-mode: char" align="left"><span>题目：仿真驾驶训练</span></p>
<p style="text-align: left; line-height: 150%; margin: 6pt 0cm 0pt; layout-grid-mode: char" align="left"><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">蝴蝶桩是现在机动车驾驶培训的重要内容，一般考试时驾驶者只需要使用方向盘和最基本的档位控制功能（一挡、倒车挡），当然还包括刹车和离合控制器，请采用</span><span style="line-height: 150%; font-size: 12pt">2D</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">或</span><span style="line-height: 150%; font-size: 12pt">3D</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">的图形界面模拟驾驶员基本蝴蝶桩训练时候的全过程。建议采用键盘、鼠标或游戏杆的方式控制模拟机动车操作</span> <span style="line-height: 150%; font-family: 宋体; font-size: 12pt">并通过</span><span style="line-height: 150%; font-size: 12pt">2D</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt">画面反映车辆和车库的平面位置关系。<br />作品介绍：<br /><img style="width: 705px; height: 551px" border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/cass/蝴蝶桩仿真.jpg" width="705" height="551" /><br />程序界面有四大模块：<br />1、操作控制&nbsp;&nbsp;&nbsp;&nbsp;分别对应键盘上的ADWS键，或用鼠标点击<br />2、演示控制&nbsp;&nbsp;&nbsp;&nbsp;设计相应的步骤演示<br />3、车模型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;独立与界面外，却依存在界面运动中<br />4、界面提示&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;步骤提示，和没一步对应相应的轨迹<br /><br />设计要点：<br />1、车的转弯或移动：其实车子本身是一个窗口，分别用了36张图片表示不同角度的移动，车子外使用透明颜色。使用API函数movewindow并不能完全解决问题，主要是不能控制移动的距离。<br />2、演示的步骤：基于判断点位置的移动，设置了32个不可见参考点，当车子刚要接触参考点时改变轨迹。<br />3、目标：当用户使用软件时，免除查找资料</span><br /><br />更多蝴蝶桩仿真，访问：<a href="http://blog.sina.com.cn/s/blog_62ea3be40100trtp.html">http://blog.sina.com.cn/s/blog_62ea3be40100trtp.html</a><br />作品下载：<a href="/Files/Cass/cardrive.rar">/Files/Cass/cardrive.rar</a></p> <img src ="http://www.cppblog.com/Cass/aggbug/147455.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cass/" target="_blank">Yu</a> 2011-05-28 08:54 <a href="http://www.cppblog.com/Cass/articles/147455.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>发布一个音乐盒</title><link>http://www.cppblog.com/Cass/articles/143936.html</link><dc:creator>Yu</dc:creator><author>Yu</author><pubDate>Mon, 11 Apr 2011 04:29:00 GMT</pubDate><guid>http://www.cppblog.com/Cass/articles/143936.html</guid><wfw:comment>http://www.cppblog.com/Cass/comments/143936.html</wfw:comment><comments>http://www.cppblog.com/Cass/articles/143936.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Cass/comments/commentRss/143936.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cass/services/trackbacks/143936.html</trackback:ping><description><![CDATA[学了一段时间windows，做了不小小玩儿。上传一个给大家试玩下。<br>截图：<br><br>简易版<img border=0 src="http://www.cppblog.com/Emoticons/QQ/05.gif" width=20 height=20><br><br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/cass/min.jpg" width=301 height=419><br><br>扩展版：<img border=0 src="http://www.cppblog.com/Emoticons/QQ/14.gif" width=20 height=20><br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/cass/max.jpg" width=497 height=428><br><br><br>正在赶造教程，源代码未能上传。<br>有需要的朋友：Q我 ：497532016（标注c++博客）<br>下载：<a href="http://www.cppblog.com/Files/Cass/butterfly.rar">/Files/Cass/butterfly.rar</a><br>////////////////////////// 
<img src ="http://www.cppblog.com/Cass/aggbug/143936.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cass/" target="_blank">Yu</a> 2011-04-11 12:29 <a href="http://www.cppblog.com/Cass/articles/143936.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc6杂谈 时间与月历控件</title><link>http://www.cppblog.com/Cass/articles/143928.html</link><dc:creator>Yu</dc:creator><author>Yu</author><pubDate>Mon, 11 Apr 2011 03:37:00 GMT</pubDate><guid>http://www.cppblog.com/Cass/articles/143928.html</guid><wfw:comment>http://www.cppblog.com/Cass/comments/143928.html</wfw:comment><comments>http://www.cppblog.com/Cass/articles/143928.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Cass/comments/commentRss/143928.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cass/services/trackbacks/143928.html</trackback:ping><description><![CDATA[<p>IT行业发展迅速，到了vc2010的时候，对时间与月历控件的使用已经推及到属性的设置。但是初学者不应该一开始就接触高级的编译器，学习原理和基础的学者最好是从C++和VC6开始。其实不论从哪里开始也好，&#8220;学好一门语言，精通一个编译器，实现计算机的一通百通&#8221;是我从别人哪里得到的信息，并作为学习的指南。此路走的通，也希望后继者走下去。<br>又或者，困难的本身不在于难懂，而在于你的选择。<br>介绍用法：<br>///////////时间与月历控件<br>风格：<br>DTS_APPCANPARSE&nbsp; // <br>DTS_LONGDATEFORMAT&nbsp; //创建长时间，像 "Friday, April 19, 1996." <br>注意：：：//要获得使用所有的语言环境中，长日期格式EnumDateFormats ， EnumDateFormatsEx ，或EnumDateFormatsExEx 。<br>DTS_SHOWNONE //可选需要用的日期风格，<br>复选框能被DTM_SETSYSTEMTIME或 DTM_GETSYSTEMTIME&nbsp; 获得<br>DTS_SHORTDATEFORMAT&nbsp;&nbsp; //创建短时间。像"4/19/96."&nbsp; <br>DTS_TIMEFORMAT&nbsp; //创建有旋转按钮，显示时间的，可以编辑的"5:31:42 PM."<br>DTS_UPDOWN&nbsp; //创建有旋转按钮，不能拉下的，没复选框的日期风格<br><br>1、DTM_GETMONTHCAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获取日期时间控件的日历子窗口的句柄<br>&nbsp;&nbsp;&nbsp; wParam = 0;<br>&nbsp;&nbsp;&nbsp; lParam = 0;</p>
<p>2、DTM_GETMCCOLOR&nbsp; //获得日历时间控件的日历子窗口的颜色、<br>&nbsp;&nbsp;&nbsp; wParam = (WPARAM)(INT)iColor; //<br>&nbsp;&nbsp;&nbsp; lParam = 0;<br>iColor; 的值：<br>MCSC_BACKGROUND&nbsp; 检索月份之间的背景颜色显示出来。 <br>MCSC_MONTHBK MCSC_MONTHBK&nbsp; 背景颜色检索在本月内显示出来。 <br>MCSC_TEXT MCSC_TEXT&nbsp; 检索用于显示在一个月内文本的颜色。 <br>MCSC_TITLEBK MCSC_TITLEBK 检索背景颜色在日历的标题显示出来。 <br>MCSC_TITLETEXT MCSC_TITLETEXT&nbsp; .检索用来显示在日历的标题文字的颜色。 <br>MCSC_TRAILINGTEXT MCSC_TRAILINGTEXT 检索使用的颜色来显示头一天和后一天的文本头和尾部天数由以前的和随后的几个月里，关于当前月份的日历出现的日子。 <br>&nbsp;<br>返回COLORREF ：<br>3、DTM_GETMCFONT&nbsp;&nbsp;&nbsp; //获得日历时间控件的日历子窗口的字体<br>&nbsp;&nbsp;&nbsp; wParam = 0;<br>&nbsp;&nbsp;&nbsp; lParam = 0;</p>
<p>4、DTM_GETRANGE&nbsp;&nbsp;&nbsp;&nbsp; //取得日历时间控件的最大和最小时间<br>&nbsp;&nbsp;&nbsp; wParam = 0;<br>&nbsp;&nbsp;&nbsp; lParam = (LPARAM) lpSysTimeArray;<br>返回一个DWORD值，它是GDTR_MAX组合GDTR_MIN或。第一个元素SYSTEMTIME数组包含最低限度的时间第二个元素的数组的SYSTEMTIME包含的最大的允许时间。</p>
<p><br>5、DTM_GETSYSTEMTIME&nbsp;&nbsp; //检目前的时间，和填充systime指针<br>&nbsp;&nbsp;&nbsp; wParam = 0;<br>&nbsp;&nbsp;&nbsp; lParam = (LPARAM) lpSysTime;</p>
<p>返回值：</p>
<p>返回一个 DWORD值，等于GDT_VALID如果时间信息被成功结构放置在指定的;<br>或消息可以返回GDT_NONE如果控制被设置为DTS_SHOWNONE风格和控制复选框未被选中。 </p>
<p>6、DTM_SETFORMAT&nbsp;&nbsp;&nbsp;&nbsp; //设置日期时间选择器的格式<br>&nbsp;&nbsp;&nbsp; wParam = 0;<br>&nbsp;&nbsp;&nbsp; lParam = (LPARAM) lpszFormat;</p>
<p>预设的格式有三种可供显示的日期和时间的显示<br>DTS_LONGDATEFORMAT&nbsp; 显示将是这样的：&#8220;星期五，1996年4月19日&#8221;。&nbsp; <br>DTS_SHORTDATEFORMAT 显示将是这样的：&#8220;4/19/96&#8221;。&nbsp; <br>DTS_SHORTDATECENTURYFORMAT 显示将是这样的：&#8220;1996年4月19日&#8221;。&nbsp; <br>DTS_TIMEFORMAT DTS_TIMEFORMAT&nbsp; 显示将是这样的：&#8220;下午五时31分42秒&#8221;。&nbsp; </p>
<p>日期和时间格式元素将被替换为实际的日期和时间他们被定义为以下组的字符。&nbsp; <br>"d"&nbsp; 一个或两个数字的日期。. <br>"dd"&nbsp; 这两个数字的日期。单数天数的前面加一个零。. <br>"ddd"&nbsp; 三个字符的星期几的缩写。 <br>"dddd"&nbsp; 完整的星期名称。<br>"h"&nbsp; &nbsp;在12小时格式的一位或两位数小时。 <br>"hh"&nbsp; &nbsp;在12小时格式的两位数小时.一位数数值前面加一个零。 <br>"H"&nbsp; &nbsp;以24小时格式的一位或两位数小时。<br>"HH"&nbsp; &nbsp;以24小时格式的两位数小时。一位数数值前面加一个零<br>"m"&nbsp; 一个或两位数分钟<br>"mm"&nbsp; 这两个数字的分钟。 一位数数值前面加一个零。<br>"M"&nbsp; 一个或两个数字的月份数。<br>"MM"&nbsp; 这两个数字的月份数。 一位数数值前面加一个零。 <br>"MMM"&nbsp; 这三个字符的月份缩写。 <br>"MMMM"&nbsp; 完整的月份名称。 <br>"t"&nbsp; 单字母AM / PM缩写（即上午为&#8220;A&#8221;显示）。<br>"tt"&nbsp; 这两个字母的AM / PM缩写（即上午为&#8220;AM&#8221;显示）。 <br>"X"&nbsp;&nbsp; //？？<br>"y"&nbsp; 年份的最后一个数字 (即1996年将作为&#8220;6&#8221;显示). <br>"yy"&nbsp; 最后两位数字的年份（即1996年将作为&#8220;96&#8221;显示）。 <br>"yyy"&nbsp; 完整的年份（即1996年将作为&#8220;1996年&#8221;显示）。 </p>
<p><br>7、DTM_SETMCCOLOR&nbsp;&nbsp;&nbsp;&nbsp; //设置日期时间选择器的日历控件颜色，返回先前的颜色<br>&nbsp;&nbsp;&nbsp; wParam = (WPARAM)(INT) iColor;<br>&nbsp;&nbsp;&nbsp; lParam = (LPARAM)(COLORREF) clr;<br>8、DTM_SETMCFONT&nbsp;&nbsp;&nbsp; //设置日期时间选择器的日历控件字体，fRedraw是是否立即重绘<br>&nbsp;&nbsp;&nbsp; wParam = (WPARAM)(HFONT) hFont;<br>&nbsp;&nbsp;&nbsp; lParam = (LPARAM) MAKELONG(fRedraw, 0);<br>9、DTM_SETRANGE&nbsp;&nbsp;&nbsp;&nbsp; //设置时间的最大最小值<br>&nbsp;&nbsp;&nbsp; wParam = (WPARAM) flags;<br>&nbsp;&nbsp;&nbsp; lParam = (LPARAM) lpSysTimeArray;</p>
<p>10DTM_SETSYSTEMTIME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置时间。参考DTM_GETSYSTEMTIME&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; wParam = (WPARAM) flag;<br>&nbsp;&nbsp;&nbsp; lParam = (LPARAM) lpSysTime;<br></p>
<p><br>////////////////////////月历控件<br>1、创建 窗口类MONTHCAL_CLASS&nbsp;&nbsp; 使用SetWindowPos改变大小<br>2、风格：<br>MCS_DAYSTATE&nbsp;&nbsp;&nbsp;&nbsp; //标记选择的日期。有黑体阴影<br>MCS_MULTISELECT&nbsp;&nbsp; //选中范围 <br>MCS_WEEKNUMBERS&nbsp;&nbsp;&nbsp;&nbsp; //显示周数<br>MCS_NOTODAYCIRCLE&nbsp;&nbsp;&nbsp; //不圈今天<br>MCS_NOTODAY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //不显示今天<br>MCS_NOSELCHANGEONNAV<br>MCS_NOTRAILINGDATES <br>MCS_SHORTDAYSOFWEEK <br><br>3、通知消息：</p>
<p>（1）MCM_GETCOLOR&nbsp;&nbsp;&nbsp;&nbsp; //获得颜色<br>&nbsp;&nbsp;&nbsp; wParam = (WPARAM)(INT)iColor;<br>&nbsp;&nbsp;&nbsp; lParam = 0;</p>
<p>iColor的值：<br>MCSC_BACKGROUND&nbsp; //月之间的背景 <br>MCSC_MONTHBK&nbsp; //背景 <br>MCSC_TEXT&nbsp; //字体. <br>MCSC_TITLEBK&nbsp; //标题 <br>MCSC_TITLETEXT //标题<br>MCSC_TRAILINGTEXT&nbsp; //</p>
<p>（2）MCM_GETCURSEL&nbsp;&nbsp;&nbsp; //获得当前选中的日期<br>&nbsp;&nbsp;&nbsp; wParam = 0;<br>&nbsp;&nbsp;&nbsp; lParam = (LPARAM) (LPSYSTEMTIME) lpSysTime;</p>
<p>（3）MCM_GETFIRSTDAYOFWEEK&nbsp;&nbsp;&nbsp;&nbsp; //获得一个月的第一天<br>&nbsp;&nbsp;&nbsp; wParam = 0;<br>&nbsp;&nbsp;&nbsp; lParam = 0;</p>
<p>（4）MCM_GETMAXSELCOUNT&nbsp;&nbsp;&nbsp;&nbsp; //获得最大最小时间的范围<br>&nbsp;&nbsp;&nbsp; wParam = 0;<br>&nbsp;&nbsp;&nbsp; lParam = 0;</p>
<p>（5）MCM_GETMAXTODAYWIDTH&nbsp;&nbsp;&nbsp; //获得今天的宽度<br>&nbsp;&nbsp;&nbsp; wParam = 0;<br>&nbsp;&nbsp;&nbsp; lParam = 0;</p>
<p>（6）<br>MCM_GETMINREQRECT&nbsp;&nbsp;&nbsp;&nbsp; //检索所需的最小尺寸显示在月历控制整整一个月。<br>&nbsp;&nbsp;&nbsp; wParam = 0;<br>&nbsp;&nbsp;&nbsp; lParam = (LPARAM) (LPRECT) lpRectInfo;</p>
<p>（7）MCM_GETMONTHDELTA&nbsp;&nbsp; //检索滚动月历控制率。 滚动速度的月数<br>&nbsp;&nbsp;&nbsp; wParam = 0;<br>&nbsp;&nbsp;&nbsp; lParam = 0;</p>
<p>（8）MCM_GETMONTHRANGE&nbsp;&nbsp; //获取最新的信息（使用SYSTEMTIME结构）表示月历控件的显示的上限和下限的。<br>&nbsp;&nbsp;&nbsp; wParam = (WPARAM)(DWORD) dwFlag;<br>&nbsp;&nbsp;&nbsp; lParam = (LPARAM)(LPSYSTEMTIME) lprgSysTimeArray;</p>
<p>（9）MCM_GETRANGE&nbsp;&nbsp;&nbsp; //检索一个月日历控件设置最小和最大允许的日期。<br>&nbsp;&nbsp;&nbsp; wParam = 0;<br>&nbsp;&nbsp;&nbsp; lParam = (LPARAM)(LPSYSTEMTIME) lprgSysTimeArray;</p>
<p>（10）MCM_GETSELRANGE&nbsp; //获取最新信息，表示日期的上限和下限范围目前由用户选择。<br>&nbsp;&nbsp;&nbsp; wParam = 0;<br>&nbsp;&nbsp;&nbsp; lParam = (LPARAM)(LPSYSTEMTIME) lprgSysTimeArray;</p>
<p>（11） //检索作为&#8220;今天&#8221;指定月历控制日期的信息。<br>MCM_GETTODAY<br>&nbsp;&nbsp;&nbsp; wParam = 0;<br>&nbsp;&nbsp;&nbsp; lParam = (LPARAM)(LPSYSTEMTIME) lpToday;</p>
<p>（12）MCM_GETUNICODEFORMAT&nbsp;&nbsp;&nbsp; //获得格式<br>&nbsp;&nbsp;&nbsp; wParam = 0;<br>&nbsp;&nbsp;&nbsp; lParam = 0;</p>
<p>（13）MCM_HITTEST&nbsp;&nbsp;&nbsp; //决定了一个月历控制部分是在屏幕上的一个特定点<br>&nbsp;&nbsp;&nbsp; wParam = 0;<br>&nbsp;&nbsp;&nbsp; lParam = (LPARAM)(PMCHITTESTINFO) pMCHitTest;</p>
<p>（14）MCM_SETCOLOR&nbsp;&nbsp; //设置颜色<br>&nbsp;&nbsp;&nbsp; wParam = (WPARAM)(INT) iColor;<br>&nbsp;&nbsp;&nbsp; lParam = (LPARAM)(COLORREF) clr;</p>
<p>（15）MCM_SETCURSEL&nbsp;&nbsp; //设置选中<br>&nbsp;&nbsp;&nbsp; wParam = 0;<br>&nbsp;&nbsp;&nbsp; lParam = (LPARAM)(LPSYSTEMTIME) lpSysTime;</p>
<p>（16）MCM_SETDAYSTATE&nbsp;&nbsp;&nbsp;&nbsp; //集目前所有月份的日历控件在一个月内每天可见的状态。<br>&nbsp;&nbsp;&nbsp; wParam = (WPARAM) iMonths;<br>&nbsp;&nbsp;&nbsp; lParam = (LPARAM)(LPMONTHDAYSTATE) lpDayStateArray;</p>
<p>（17）MCM_SETFIRSTDAYOFWEEK&nbsp;&nbsp; //设置第一天<br>&nbsp;&nbsp;&nbsp; wParam = 0;<br>&nbsp;&nbsp;&nbsp; lParam = (LPARAM)(INT) iDay;</p>
<p>（18）MCM_SETMAXSELCOUNT&nbsp;&nbsp;&nbsp; //设置可以选择的最大天数<br>&nbsp;&nbsp;&nbsp; wParam = (WPARAM)(INT) iMax;<br>&nbsp;&nbsp;&nbsp; lParam = 0;</p>
<p>（19）MCM_SETMONTHDELTA&nbsp;&nbsp; //设置滚动的月数<br>&nbsp;&nbsp;&nbsp; wParam = (WPARAM)(INT) iDelta;<br>&nbsp;&nbsp;&nbsp; lParam = 0;</p>
<p>（20）MCM_SETRANGE&nbsp;&nbsp; //设置最大最小的选择范围<br>&nbsp;&nbsp;&nbsp; wParam = (WPARAM)(SHORT) fWhichLimit;<br>&nbsp;&nbsp;&nbsp; lParam = (LPARAM)(LPSYSTEMTIME) lprgSysTimeArray;</p>
<p>(21)MCM_SETSELRANGE&nbsp;&nbsp; //设置了一个月的日历控件到一个指定日期范围内选择<br>&nbsp;&nbsp;&nbsp; wParam = 0;<br>&nbsp;&nbsp;&nbsp; lParam = (LPARAM)(LPSYSTEMTIME) lprgSysTimeArray;</p>
<p><br>(22)MCM_SETTODAY&nbsp;&nbsp;&nbsp; //设置今天<br>&nbsp;&nbsp;&nbsp; wParam = 0;<br>&nbsp;&nbsp;&nbsp; lParam = (LPARAM)(LPSYSTEMTIME) lpSysTime;</p>
<p>（23）MCM_SETUNICODEFORMAT&nbsp;&nbsp;&nbsp; //设置格式<br>&nbsp;&nbsp;&nbsp; wParam = (WPARAM)(BOOL)fUnicode;<br>&nbsp;&nbsp;&nbsp; lParam = 0;</p>
<p>（24） MCM_GETCALENDARBORDER&nbsp;&nbsp; //获得边框<br></p>
<img src ="http://www.cppblog.com/Cass/aggbug/143928.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cass/" target="_blank">Yu</a> 2011-04-11 11:37 <a href="http://www.cppblog.com/Cass/articles/143928.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有了，先进的 多线程 ！</title><link>http://www.cppblog.com/Cass/articles/143927.html</link><dc:creator>Yu</dc:creator><author>Yu</author><pubDate>Mon, 11 Apr 2011 03:20:00 GMT</pubDate><guid>http://www.cppblog.com/Cass/articles/143927.html</guid><wfw:comment>http://www.cppblog.com/Cass/comments/143927.html</wfw:comment><comments>http://www.cppblog.com/Cass/articles/143927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Cass/comments/commentRss/143927.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cass/services/trackbacks/143927.html</trackback:ping><description><![CDATA[<p><span style="FONT-FAMILY: Comic Sans MS">标题采用《Windows程序设计》精彩的一条名言，多么激动人心的时刻啊。多线程的意义不仅在于开工作业一项费时长的工作，一个进程可以包含一个或多个应用程序域，而一个应用程序域又可以包含一个或多个线程。这样实际上就相当于在进程和线程之间增加了一个新的安全边界。无论在同一个进程之内还是在不同的进程之间，每个应用程序域之间都是相互无关的，这些不同的应用程序域之间只能通过远程通讯来实现消息和对象的传递。<br><span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Simsun; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span><span style="TEXT-ALIGN: left; LINE-HEIGHT: 21px; FONT-FAMILY: simsun; COLOR: rgb(70,70,70); FONT-SIZE: 14px" class=Apple-style-span>使得不同任务之间的协调操作与运行、数据的交互、资源的分配等问题更加易于解决。</span></span><span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Simsun; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span><span style="TEXT-ALIGN: left; LINE-HEIGHT: 21px; FONT-FAMILY: simsun; COLOR: rgb(70,70,70); FONT-SIZE: 14px" class=Apple-style-span>使得不同任务之间的协调操作与运行、数据的交互、资源的分配等问题更加易于解决。</span></span><span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Simsun; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span><span style="TEXT-ALIGN: left; LINE-HEIGHT: 21px; FONT-FAMILY: simsun; COLOR: rgb(70,70,70); FONT-SIZE: 14px" class=Apple-style-span>使得不同任务之间的协调操作与运行、数据的交互、资源的分配等问题更加易于</span></span><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/cass/Thread.gif" width=580 height=201><br><span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Simsun; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span><span style="TEXT-ALIGN: left; LINE-HEIGHT: 21px; FONT-FAMILY: simsun; COLOR: rgb(70,70,70); FONT-SIZE: 14px" class=Apple-style-span>使得不同任务之间的协调操作与运行、数据的交互、资源的分配等问题更加易于解决。<br>下面介绍基于Windows多线程的一些用法：<br>创建：<br>hThread = CreateThread (&amp;security_attributes（忽略NULL）, dwStackSize(初始化堆栈默认O), ThreadProc(处理函数),pParam（额外数据）, dwFlags（挂起线程CREATE_SUSPENDEN）, &amp;idThread(线程ID)) ;</span></span></span></p>
<p><span style="FONT-FAMILY: Comic Sans MS"><span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Simsun; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span><span style="TEXT-ALIGN: left; LINE-HEIGHT: 21px; FONT-FAMILY: simsun; COLOR: rgb(70,70,70); FONT-SIZE: 14px" class=Apple-style-span>简单的创建方法：<br>hThread = _beginthread (ThreadProc, uiStackSize, pParam) ;&nbsp; //创建<br>void __cdecl ThreadProc (void * pParam) ;&nbsp;&nbsp; //处理函数<br>_endthread () ;&nbsp;&nbsp;&nbsp;&nbsp; //结束线程</span></span></span></p>
<p><span style="FONT-FAMILY: Comic Sans MS"><span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Simsun; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span><span style="TEXT-ALIGN: left; LINE-HEIGHT: 21px; FONT-FAMILY: simsun; COLOR: rgb(70,70,70); FONT-SIZE: 14px" class=Apple-style-span>每个进程中访问临界资源的那段代码称为临界区<br>CRITICAL_SECTION cs ;<br>InitializeCriticalSection (&amp;cs) ;&nbsp;&nbsp;&nbsp;&nbsp; //初始化<br>EnterCriticalSection (&amp;cs) ;&nbsp;&nbsp;&nbsp;&nbsp; //进入临界区<br>LeaveCriticalSection (&amp;cs) ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //离开临界区<br>DeleteCriticalSection (&amp;cs) ;&nbsp;&nbsp;&nbsp;&nbsp; //删除临界区</span></span></span></p>
<p><span style="FONT-FAMILY: Comic Sans MS"><span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Simsun; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span><span style="TEXT-ALIGN: left; LINE-HEIGHT: 21px; FONT-FAMILY: simsun; COLOR: rgb(70,70,70); FONT-SIZE: 14px" class=Apple-style-span>PostMessage<br>该函数将一个消息放入（寄送）到与指定窗口创建的线程相联系消息队列里，不等待线程处理消息就返回，是异步消息模式。消息队列里的消息通过调用GetMessage和PeekMessage取得。<br>函数原型：B00L PostMessage（HWND hWnd，UINT Msg，WPARAM wParam，LPARAM lParam）<br>事件对象：<br>（1）、hEvent = CreateEvent ( &amp;sa, fManual, fInitial, pszName) ;<br>HANDLE CreateEvent(<br>LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性<br>BOOL bManualReset, // 复位方式<br>BOOL bInitialState, // 初始状态<br>LPCTSTR lpName // 对象名称<br>);<br>　bManualReset：<br>　　[输入]指定将事件对象创建成手动复原还是自动复原。如果是TRUE，那么必须用ResetEvent函数来手工将事件的状态复原到无信号状态。如果设置为FALSE，当事件被一个等待线程释放以后，系统将会自动将事件状态复原为无信号状态</span></span></span></p>
<span style="FONT-FAMILY: Comic Sans MS"><span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Simsun; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span><span style="TEXT-ALIGN: left; LINE-HEIGHT: 21px; FONT-FAMILY: simsun; COLOR: rgb(70,70,70); FONT-SIZE: 14px" class=Apple-style-span>
<p><br>bInitialState：<br>　　[输入]指定事件对象的初始状态。如果为TRUE，初始状态为有信号状态；否则为无信号状态。</p>
<p>&nbsp;</p>
<p>（2）、SetEvent (hEvent) ;&nbsp;&nbsp;&nbsp; //设置事件的状态的标记<br>（3）ResetEvent (hEvent) ;&nbsp;&nbsp;&nbsp;&nbsp; //复位事件<br>（4）WaitForSingleObject (hEvent, dwTimeOut) ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //等待</span></span></span></p>
<img src ="http://www.cppblog.com/Cass/aggbug/143927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cass/" target="_blank">Yu</a> 2011-04-11 11:20 <a href="http://www.cppblog.com/Cass/articles/143927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MDI 多文档</title><link>http://www.cppblog.com/Cass/articles/143923.html</link><dc:creator>Yu</dc:creator><author>Yu</author><pubDate>Mon, 11 Apr 2011 03:03:00 GMT</pubDate><guid>http://www.cppblog.com/Cass/articles/143923.html</guid><wfw:comment>http://www.cppblog.com/Cass/comments/143923.html</wfw:comment><comments>http://www.cppblog.com/Cass/articles/143923.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Cass/comments/commentRss/143923.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cass/services/trackbacks/143923.html</trackback:ping><description><![CDATA[<p>虽说现在的应用程序普遍使用标签形式，但是多文档依然作为文档编辑重要形式。例如 ps 、vc6 等。<br>介绍一些用法：<br>1、框架窗口：创建一个客户区窗口。类名：MDICLIENT<br>&nbsp;&nbsp; 文档窗口：创建：CreateWindow（...CLIENTCREATESTRUCT）<br>typedef struct tagCLIENTCREATESTRUCT {&nbsp; <br>&nbsp;&nbsp;&nbsp; HANDLE hWindowMenu;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;//要加入文档列表的子菜单的句柄，文档列表菜单<br>&nbsp;&nbsp;&nbsp; UINT&nbsp;&nbsp; idFirstChild; &nbsp;//与文档列表中的第一个文档窗口相关联的菜单ID<br>} CLIENTCREATESTRUCT;</p>
<p>2、<br>typedef struct tagMDICREATESTRUCT { // mdic <br>&nbsp;&nbsp;&nbsp; LPCTSTR szClass; <br>&nbsp;&nbsp;&nbsp; LPCTSTR szTitle; <br>&nbsp;&nbsp;&nbsp; HANDLE&nbsp; hOwner; <br>&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp; x; <br>&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp; y; <br>&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp; cx; <br>&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp; cy; <br>&nbsp;&nbsp;&nbsp; DWORD&nbsp;&nbsp; style; <br>&nbsp;&nbsp;&nbsp; LPARAM&nbsp; lParam; <br>} MDICREATESTRUCT; </p>
<p>要有一个显示文档列表的菜单<br>3、消息：<br>主窗口：不处理的消息：reurn DelFrameProc(hwnd,hwndClient,message,wParam,lParam);<br>子文档窗口：不处理的消息： return DefMDIChildProc (hwnd, message, wParam, lParam) ;<br>(1)<br>WM_MDICREATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //应用程序通过发送 WM_MDICREATE创建一个文档<br>wParam = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // not used; must be zero <br>lParam = (LPARAM) (LPMDICREATESTRUCT) lpmdic;&nbsp;&nbsp; // creation data <br>(2)<br>WM_MDIGETACTIVE&nbsp;&nbsp; //客户区通过发送WM_MDIGETACTIVE获得活动子窗口的句柄<br>wParam = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // not used; must be zero <br>lParam = (LPBOOL) lpfMaximized;&nbsp; // optional pointer to maximized state flag </p>
<p>(3)<br>WM_QUERYENDSESSION&nbsp;&nbsp;&nbsp;&nbsp; //其lParam参数可以区分是否关闭<br>nSource = (UINT) wParam;&nbsp;&nbsp;&nbsp; // 未用<br>fLogOff = lParam&nbsp;&nbsp;&nbsp; <br>返回true表示终结，false表示未终结</p>
<p>（4）<br>WM_MDIDESTROY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //发送给客户区结束子文档<br>wParam = (WPARAM) (HWND) hwndChild; // handle to child to close <br>lParam = 0;&nbsp;&nbsp; </p>
<p><br>（5）<br>WM_MDITILE&nbsp;&nbsp;&nbsp;&nbsp; //以平铺方式重新排列文档。<br>wParam = (WPARAM) (UINT) fuTile; // tiling flag <br>lParam = 0; </p>
<p>(6)<br>WM_MDICASCADE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //以层叠方式重新排列文档<br>wParam = (WPARAM) (UINT) fuCascade;&nbsp; // cascade flag <br>lParam = 0;&nbsp; </p>
<p>(7)<br>WM_MDIICONARRANGE&nbsp;&nbsp;&nbsp; //重新排列所有最小化的文档<br>wParam = 0; // not used; must be zero <br>lParam = 0; // not used; must be zero</p>
<p>(8)当窗口变成活动或非活动的，都接收此此消息<br>WM_MDIACTIVATE&nbsp;&nbsp; //主窗口接收时：得到一个活动子窗口<br>// Message sent to MDI client <br>wParam = (WPARAM) (HWND) hwndChildAct; // 设定活动子窗口的句柄 <br>lParam = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // not used; must be zero <br>&nbsp;//子文档窗口接收时，<br>// Message received by MDI child <br>hwndChildDeact = (HWND) wParam;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 失去活动的窗口 <br>hwndChildAct = (HWND) lParam;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 接受活动的窗口 </p>
<p><br>（9）<br>WM_MDISETMENU&nbsp;&nbsp;&nbsp; //设置主窗口的菜单。<br>wParam = (WPARAM) (HMENU) hmenuFrame;&nbsp; // handle to frame menu <br>lParam = (LPARAM) (HMENU) hmenuWindow; // handle to Window menu ，加入新文档列表的菜单<br>Windows会在该菜单项上自动添加。</p>
<p>（10）注意：像WM_CHILDACTIVATE 、WM_GETMINMAXINFO 、WM_MENUCHAR 、WM_MOVE 、WM_SETFOCUS 、WM_SIZE 和WM_SYSCOMMAND。要传给DefMDIChildProc处理。故：在这些消息后用break，而不return。</p>
<p>（11）不常用到的<br>WM_MDIRESTORE = $0223;&nbsp; //程序 发送此消息给MDI客户窗口让子窗口从最大最小化恢复到原来大小<br>WM_MDINEXT = $0224;&nbsp;&nbsp; //程序 发送此消息给MDI客户窗口激活下一个或前一个窗口<br>WM_MDIMAXIMIZE = $0225;&nbsp;&nbsp; //程序发送此消息给MDI客户窗口来最大化一个MDI子窗口；</p>
<p><br>4、加速键的消息循环<br>&nbsp;&nbsp;&nbsp; while (GetMessage (&amp;msg, NULL, 0, 0))<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!TranslateMDISysAccel (hwndClient, &amp;msg) &amp;&amp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; !TranslateAccelerator (hwndFrame, hAccel, &amp;msg))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TranslateMessage (&amp;msg) ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DispatchMessage (&amp;msg) ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>/////////才掌握，发现现在大多数公司都弃用啦。可惜啊，可惜啊、</p>
<img src ="http://www.cppblog.com/Cass/aggbug/143923.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cass/" target="_blank">Yu</a> 2011-04-11 11:03 <a href="http://www.cppblog.com/Cass/articles/143923.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>