﻿<?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++博客-Dragon-随笔分类-VC</title><link>http://www.cppblog.com/dragon/category/8157.html</link><description>Dragon</description><language>zh-cn</language><lastBuildDate>Mon, 20 Aug 2012 09:18:41 GMT</lastBuildDate><pubDate>Mon, 20 Aug 2012 09:18:41 GMT</pubDate><ttl>60</ttl><item><title>关于PostMessage在多线程中的内存释放问题</title><link>http://www.cppblog.com/dragon/archive/2012/08/20/187777.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Mon, 20 Aug 2012 09:12:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2012/08/20/187777.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/187777.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2012/08/20/187777.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/187777.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/187777.html</trackback:ping><description><![CDATA[<p>首先，来分析一个假设的场景：<br />如果PostMessage传递的是一些在栈区的变量，PostMessage后把这些数据传到另一个线程的消息队列里，但<br />由于是栈区上的变量在PostMessage所在函数返回时由系统回收，那么另一线程就会访问不了这些数据。<br /><br /></p>
<p>解决办法：在传送线程PostMessage消息前对栈区上的数据new一份放到堆区上，堆区的数据是程序员手动创<br />建和手动回收的，然后把这些数据传送到另一线程，由另一线程去手动释放delete。<br /><br /></p>
<p>问题的产生：由于工作线程处理的繁忙，有一些数据在UI线程退出时还没返回，当UI线程退出后，数据返回<br />由工作线程PostMessage到UI线程，UI线程已经接收不到消息，故未能手动释放工作线程传过来的堆区内存，<br />造成内存泄漏。<br /><br /></p>
<p>后来，查到如下网站：<br /><a href="http://stackoverflow.com/questions/3807945/mfc-data-forwarding-to-main-thread-via-postmessage">http://stackoverflow.com/questions/3807945/mfc-data-forwarding-to-main-thread-via-postmessage</a><br />发现PostMessage是有返回值的，发送失败返回false。<br /><br /></p>
<p>故上面的问题有了解决方法：<br />UI线程（接收线程）退出后工作线程（发送线程）PostMessage是返回false的，故可以利用这个返回值来决定由哪个线程来释放这段<br />PostMessage中传递的内存，如果传送失败，则由当前PostMessage的线程负责手动回收，如果发送成功就由<br />接收线程来负责手动回收。</p><img src ="http://www.cppblog.com/dragon/aggbug/187777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2012-08-20 17:12 <a href="http://www.cppblog.com/dragon/archive/2012/08/20/187777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过进程名杀进程</title><link>http://www.cppblog.com/dragon/archive/2010/04/20/113064.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Tue, 20 Apr 2010 05:07:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2010/04/20/113064.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/113064.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2010/04/20/113064.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/113064.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/113064.html</trackback:ping><description><![CDATA[//记得包含头文件<br>#include&nbsp; "tlhelp32.h"<br><br>void KillProgram(LPCSTR&nbsp;&nbsp; ExeName)&nbsp;&nbsp; <br>{&nbsp;&nbsp; <br>&nbsp;LPCSTR&nbsp;&nbsp; File;&nbsp;&nbsp; <br>&nbsp;HANDLE&nbsp;&nbsp; hProcessSnap;&nbsp;&nbsp; <br>&nbsp;PROCESSENTRY32&nbsp;&nbsp; pe32;&nbsp;&nbsp; <br>&nbsp;if(!ExeName||!ExeName[0])&nbsp;&nbsp; <br>&nbsp;&nbsp;return;&nbsp;&nbsp; <br>&nbsp;File = strrchr(ExeName, '\\');&nbsp;&nbsp; <br>&nbsp;if (File!=0) <br>&nbsp;&nbsp;ExeName = File+1;&nbsp;&nbsp; <br>&nbsp;hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);&nbsp; <br>&nbsp;if(hProcessSnap==(HANDLE)-1)&nbsp; <br>&nbsp;&nbsp;return;<br>&nbsp;memset(&amp;pe32,0,sizeof(pe32));<br>&nbsp;pe32.dwSize=sizeof(PROCESSENTRY32);<br>&nbsp;if(Process32First(hProcessSnap,&amp;pe32))&nbsp;&nbsp; <br>&nbsp;{&nbsp;&nbsp; <br>&nbsp;&nbsp;do <br>&nbsp;&nbsp;{&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;File = strrchr(pe32.szExeFile, '\\');&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;File = File ? File+1 : pe32.szExeFile;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;if (strcmpi(File,ExeName)==0)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;TerminateProcess(OpenProcess(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROCESS_ALL_ACCESS,0,pe32&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.th32ProcessID), 0);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; <br>&nbsp;&nbsp;}&nbsp;&nbsp; <br>&nbsp;&nbsp;while(Process32Next(hProcessSnap,&amp;pe32));&nbsp;&nbsp; <br>&nbsp;}&nbsp;&nbsp; <br>&nbsp;CloseHandle(hProcessSnap);<br>} <br><br>如果是在VS编译器中要更改字符集的类型，具体方法是，右击项目-&gt;项目属性页-&gt;配置属性-&gt;常规-&gt;字符集；更改为&#8220;使用多字节字符集&#8221;。
<img src ="http://www.cppblog.com/dragon/aggbug/113064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2010-04-20 13:07 <a href="http://www.cppblog.com/dragon/archive/2010/04/20/113064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）提升进程权限为debug权限 </title><link>http://www.cppblog.com/dragon/archive/2010/04/20/113063.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Tue, 20 Apr 2010 05:03:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2010/04/20/113063.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/113063.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2010/04/20/113063.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/113063.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/113063.html</trackback:ping><description><![CDATA[GetCurrentProcessID 得到当前进程的ID OpenProcessToken 得到进程的令牌句柄LookupPrivilegeValue 查询进程的权限 AdjustTokenPrivileges 判断令牌权限 <br><br>要对一个任意进程（包括系统安全进程和服务进程）进行指定了写相关的访问权的OpenProcess操作，只要当前进程具有SeDeDebug权限就可以了。要是一个用户是Administrator或是被给予了相应的权限，就可以具有该权限。可是，就算我们用Administrator帐号对一个系统安全进程执行OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcessID)还是会遇到&#8220;访问拒绝&#8221;的错误。什么原因呢？原来在默认的情况下进程的一些访问权限是没有被使能（Enabled）的，所以我们要做的首先是使能这些权限。与此相关的一些API函数有OpenProcessToken、LookupPrivilegevalue、AdjustTokenPrivileges。我们要修改一个进程的访问令牌，首先要获得进程访问令牌的句柄，这可以通过OpenProcessToken得到，函数的原型如下： <br><br>BOOL OpenProcessToken( <br>HANDLE ProcessHandle, <br>DWORD DesiredAccess, <br>PHANDLE TokenHandle <br>)； <br>第一参数是要修改访问权限的进程句柄；第三个参数就是返回的访问令牌指针；第二个参数指定你要进行的操作类型，如要修改令牌我们要指定第二个参数为TOKEN_ADJUST_PRIVILEGES（其它一些参数可参考Platform SDK）。通过这个函数我们就可以得到当前进程的访问令牌的句柄（指定函数的第一个参数为GetCurrentProcess()就可以了）。接着我们可以调用AdjustTokenPrivileges对这个访问令牌进行修改。AdjustTokenPrivileges的原型如下： <br>BOOL AdjustTokenPrivileges( <br>HANDLE TokenHandle, // handle to token <br>BOOL DisableAllPrivileges, // disabling option <br>PTOKEN_PRIVILEGES NewState, // privilege information <br>DWORD BufferLength, // size of buffer <br>PTOKEN_PRIVILEGES PreviousState, // original state buffer <br>PDWORD ReturnLength // required buffer size <br>); <br>第一个参数是访问令牌的句柄；第二个参数决定是进行权限修改还是除能（Disable）所有权限；第三个参数指明要修改的权限，是一个指向TOKEN_PRIVILEGES结构的指针，该结构包含一个数组，数据组的每个项指明了权限的类型和要进行的操作; 第四个参数是结构PreviousState的长度，如果PreviousState为空，该参数应为NULL；第五个参数也是一个指向TOKEN_PRIVILEGES结构的指针，存放修改前的访问权限的信息，可空；最后一个参数为实际PreviousState结构返回的大小。在使用这个函数前再看一下TOKEN_PRIVILEGES这个结构，其声明如下： <br><br>typedef struct _TOKEN_PRIVILEGES { <br>DWORD PrivilegeCount; <br>LUID_AND_ATTRIBUTES Privileges[]; <br>} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES; <br>PrivilegeCount指的数组原素的个数，接着是一个LUID_AND_ATTRIBUTES类型的数组，再来看一下LUID_AND_ATTRIBUTES这个结构的内容，声明如下： <br><br>typedef struct _LUID_AND_ATTRIBUTES { <br>LUID Luid; <br>DWORD Attributes; <br>} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES <br><br>第二个参数就指明了我们要进行的操作类型，有三个可选项： SE_PRIVILEGE_ENABLED、SE_PRIVILEGE_ENABLED_BY_DEFAULT、SE_PRIVILEGE_USED_FOR_ACCESS。要使能一个权限就指定Attributes为SE_PRIVILEGE_ENABLED。第一个参数就是指权限的类型，是一个LUID的值，LUID就是指locally unique identifier，我想GUID大家是比较熟悉的，和GUID的要求保证全局唯一不同，LUID只要保证局部唯一，就是指在系统的每一次运行期间保证是唯一的就可以了。另外和GUID相同的一点，LUID也是一个64位的值，相信大家都看过GUID那一大串的值，我们要怎么样才能知道一个权限对应的LUID值是多少呢？这就要用到另外一个API函数LookupPrivilegevalue，其原形如下： <br><br>BOOL LookupPrivilegevalue( <br>LPCTSTR lpSystemName, // system name <br>LPCTSTR lpName, // privilege name <br>PLUID lpLuid // locally unique identifier <br>); <br>第一个参数是系统的名称，如果是本地系统只要指明为NULL就可以了，第三个参数就是返回LUID的指针，第二个参数就是指明了权限的名称，如&#8220;SeDebugPrivilege&#8221;。在Winnt.h中还定义了一些权限名称的宏，如： <br><br>#define SE_BACKUP_NAME TEXT("SeBackupPrivilege") <br><br>#define SE_RESTORE_NAME TEXT("SeRestorePrivilege") <br><br>#define SE_SHUTDOWN_NAME TEXT("SeShutdownPrivilege") <br><br>#define SE_DEBUG_NAME TEXT("SeDebugPrivilege") <br><br>这样通过这三个函数的调用，我们就可以用OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcessID)来打获得任意进程的句柄，并且指定了所有的访问权。 <br><br>==微尘附加：完整源代码, 出自Windows核心编程<br>BOOL EnableDebugPrivilege(BOOL bEnable)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Enabling the debug privilege allows the application to see <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //information about service application<br>&nbsp;&nbsp;&nbsp;&nbsp; BOOL fOK = FALSE;&nbsp;&nbsp;&nbsp;&nbsp; //Assume function fails<br>&nbsp;&nbsp;&nbsp;&nbsp; HANDLE hToken;<br>&nbsp;&nbsp;&nbsp;&nbsp; //Try to open this process's acess token<br>&nbsp;&nbsp;&nbsp;&nbsp; if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &amp;hToken))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Attempt to modify the "Debug" privilege<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TOKEN_PRIVILEGES tp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tp.PrivilegeCount = 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &amp;tp.Privileges[0].Luid);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tp.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AdjustTokenPrivileges(hToken, FALSE, &amp;tp, sizeof(tp), NULL, NULL);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fOK&nbsp; = (GetLastError() ==&nbsp; ERROR_SUCCESS);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CloseHandle(hToken);<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; return fOK;<br>}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在我写的程序中，用VS编译平台运行可以杀进程，但Release后杀不了进程，后来加了这代码就可以对指定进程进行写操作。<br>转自：<a href="http://www.cppblog.com/tyt2008cn/archive/2008/02/17/42849.html">http://www.cppblog.com/tyt2008cn/archive/2008/02/17/42849.html</a>
<img src ="http://www.cppblog.com/dragon/aggbug/113063.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2010-04-20 13:03 <a href="http://www.cppblog.com/dragon/archive/2010/04/20/113063.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>由CWnd继承来的用户窗口添加加速键</title><link>http://www.cppblog.com/dragon/archive/2008/11/08/66327.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Sat, 08 Nov 2008 06:28:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/11/08/66327.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/66327.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/11/08/66327.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/66327.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/66327.html</trackback:ping><description><![CDATA[<p>由CWnd继承来的用户窗口添加加速键:(非框架窗口缺少CFrameWnd中对加速键的支持)<br>1.给派生类添加一个数据成员m_hAccelTable(类型HACCEL).<br>2.向程序添加加速键资源,添加资源我已经在另一篇文章中讲过,还有加一个具有响应函数的ID对应加速键.然后在应用程序生存期初期,调用API函数::LoadAccelerators加载加速键表.将::LoadAccelerators返回的句柄复制到m_hAccelTable.<br>&nbsp; <br>&nbsp; //In CMainWindow's constructor<br>&nbsp; m_hAccelTable=LoadAccelerators(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1));</p>
<p>3.在窗口类中重载PreTranslateMessage并调用将句柄存储在m_hAccelTable中的::TranslateAccelerator.将::TranslateAccelerator返回的<br>的值作为PreTranslateMessage的返回值.</p>
<p><br>//virtual BOOL PreTranslateMessage(MSG *pMsg);函数原型<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee" twffan="done"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done"><span style="COLOR: #000000" twffan="done">BOOL&nbsp;CMainWindow::PreTranslateMessage(MSG&nbsp;</span><span style="COLOR: #000000" twffan="done">*</span><span style="COLOR: #000000" twffan="done">pMsg)<br><img id=Codehighlighter1_49_191_Open_Image onclick="this.style.display='none'; Codehighlighter1_49_191_Open_Text.style.display='none'; Codehighlighter1_49_191_Closed_Image.style.display='inline'; Codehighlighter1_49_191_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top twffan="done"><img id=Codehighlighter1_49_191_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_49_191_Closed_Text.style.display='none'; Codehighlighter1_49_191_Open_Image.style.display='inline'; Codehighlighter1_49_191_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top twffan="done"></span><span id=Codehighlighter1_49_191_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff" twffan="done"><img src="http://www.cppblog.com/Images/dot.gif" twffan="done"></span><span id=Codehighlighter1_49_191_Open_Text twffan="done"><span style="COLOR: #000000" twffan="done">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top twffan="done">&nbsp;</span><span style="COLOR: #0000ff" twffan="done">if</span><span style="COLOR: #000000" twffan="done">(CWnd::PreTranslateMessage(pMsg))<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top twffan="done">&nbsp;&nbsp;</span><span style="COLOR: #0000ff" twffan="done">return</span><span style="COLOR: #000000" twffan="done">&nbsp;TRUE;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top twffan="done">&nbsp;</span><span style="COLOR: #0000ff" twffan="done">return</span><span style="COLOR: #000000" twffan="done">&nbsp;((m_hAccelTable&nbsp;</span><span style="COLOR: #000000" twffan="done">!=</span><span style="COLOR: #000000" twffan="done">&nbsp;NULL)&nbsp;</span><span style="COLOR: #000000" twffan="done">&amp;&amp;</span><span style="COLOR: #000000" twffan="done">&nbsp;::TranslateAccelerator(m_hWnd,m_hAccelTable,pMsg));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top twffan="done">}</span></span></div>
<img src ="http://www.cppblog.com/dragon/aggbug/66327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-11-08 14:28 <a href="http://www.cppblog.com/dragon/archive/2008/11/08/66327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>位图菜单</title><link>http://www.cppblog.com/dragon/archive/2008/11/06/66178.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Thu, 06 Nov 2008 15:11:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/11/06/66178.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/66178.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/11/06/66178.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/66178.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/66178.html</trackback:ping><description><![CDATA[<p>位图菜单:<br>在网上看到的文章如下:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;看下文章之前你要注意两个问题,一是你加载的位图是*.bmp的图片不是*.ico;二是图片的大小要定为16*16,不然你会看不到位图(我就是犯了这个弄了一天).<br>&nbsp;&nbsp;&nbsp;&nbsp; MFC的CMenu类有一个成员函数SetMenuItemBitmaps,能用于往菜单中增加图标。具体方法如下: <br>在应用程式的资源文件中添加想要增加的位图,并将其ID命名为IDB_OPEN1和IDB_OPEN2;<br>---在应用程式的视图类中添加CBitmap类的对象,不妨取名为bm_open1和bm_open2,<br>在视图类的构造函数中添加以下代码: </p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee" twffan="done"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done"><span style="COLOR: #000000" twffan="done">bm_open1.LoadBitmap(IDB_OPEN1);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done">bm_open2.LoadBitmap(IDB_OPEN2);</span></div>
<p>&nbsp;</p>
<p>(函数LoadBitmap用于加载位图到CBitmap类的对象)在视图类的成员函数OnDraw()中添加以下代码: </p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee" twffan="done"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done"><span style="COLOR: #000000" twffan="done">CWnd&nbsp;</span><span style="COLOR: #000000" twffan="done">*</span><span style="COLOR: #000000" twffan="done">&nbsp;parent</span><span style="COLOR: #000000" twffan="done">=</span><span style="COLOR: #000000" twffan="done">GetParent();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done">CMenu&nbsp;</span><span style="COLOR: #000000" twffan="done">*</span><span style="COLOR: #000000" twffan="done">&nbsp;pmenubar</span><span style="COLOR: #000000" twffan="done">=</span><span style="COLOR: #000000" twffan="done">parent</span><span style="COLOR: #000000" twffan="done">-&gt;</span><span style="COLOR: #000000" twffan="done">GetMenu();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done">CMenu&nbsp;</span><span style="COLOR: #000000" twffan="done">*</span><span style="COLOR: #000000" twffan="done">&nbsp;pmenu</span><span style="COLOR: #000000" twffan="done">=</span><span style="COLOR: #000000" twffan="done">pmenubar</span><span style="COLOR: #000000" twffan="done">-&gt;</span><span style="COLOR: #000000" twffan="done">GetSubMenu(</span><span style="COLOR: #000000" twffan="done">2</span><span style="COLOR: #000000" twffan="done">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done">pmenu</span><span style="COLOR: #000000" twffan="done">-&gt;</span><span style="COLOR: #000000" twffan="done">SetMenuItemBitmaps(</span><span style="COLOR: #000000" twffan="done">1</span><span style="COLOR: #000000" twffan="done">,MF_BYPOSITION,</span><span style="COLOR: #000000" twffan="done">&amp;</span><span style="COLOR: #000000" twffan="done">bm_open1,</span><span style="COLOR: #000000" twffan="done">&amp;</span><span style="COLOR: #000000" twffan="done">bm_open2);</span></div>
<p><br>　　前三行得到指向菜单的指针,第四行调用函数SetMenuItemBitmaps往菜单中增加图标,具体参数的含义可参见有关介绍MFC及其成员函数的书即可.</p>
<p>就是犯了这个错误,我网上走了很久:<br>然后我发现另一篇文章可以实现同样的效果,不记得网页地址了,自己写出来!</p>
<p>在应用程序的框架类CMainFrame添加CBitmap类的对象,不妨取名为bm_open1和bm_open2,</p>
<p>同样在构造函数中添加如下代码:</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee" twffan="done"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done"><span style="COLOR: #000000" twffan="done">bm_open1.LoadBitmap(IDB_OPEN1);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done">bm_open2.LoadBitmap(IDB_OPEN2);</span></div>
<p><br>然后在CMainFrame::OnCreate()中添加如下代码:(注意,这里和上面不同了,不用获得父类的指针了)<br>&nbsp;&nbsp;&nbsp;&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee" twffan="done"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done"><span style="COLOR: #000000" twffan="done">CMenu&nbsp;</span><span style="COLOR: #000000" twffan="done">*</span><span style="COLOR: #000000" twffan="done">&nbsp;pmenubar</span><span style="COLOR: #000000" twffan="done">=</span><span style="COLOR: #000000" twffan="done">GetMenu();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done">CMenu&nbsp;</span><span style="COLOR: #000000" twffan="done">*</span><span style="COLOR: #000000" twffan="done">&nbsp;pmenu</span><span style="COLOR: #000000" twffan="done">=</span><span style="COLOR: #000000" twffan="done">pmenubar</span><span style="COLOR: #000000" twffan="done">-&gt;</span><span style="COLOR: #000000" twffan="done">GetSubMenu(</span><span style="COLOR: #000000" twffan="done">2</span><span style="COLOR: #000000" twffan="done">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done">pmenu</span><span style="COLOR: #000000" twffan="done">-&gt;</span><span style="COLOR: #000000" twffan="done">SetMenuItemBitmaps(</span><span style="COLOR: #000000" twffan="done">1</span><span style="COLOR: #000000" twffan="done">,MF_BYPOSITION,</span><span style="COLOR: #000000" twffan="done">&amp;</span><span style="COLOR: #000000" twffan="done">bm_open1,</span><span style="COLOR: #000000" twffan="done">&amp;</span><span style="COLOR: #000000" twffan="done">bm_open2);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done"></span></div>
<p>最后实现的效果一样,主要困扰我的问题是图片大小没调整好显示不出来.特作此笔记!</p>
<img src ="http://www.cppblog.com/dragon/aggbug/66178.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-11-06 23:11 <a href="http://www.cppblog.com/dragon/archive/2008/11/06/66178.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PreTranslateMessage和GetKeyState的一点理解</title><link>http://www.cppblog.com/dragon/archive/2008/10/28/65344.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Tue, 28 Oct 2008 08:21:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/10/28/65344.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/65344.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/10/28/65344.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/65344.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/65344.html</trackback:ping><description><![CDATA[<p>PreTranslateMessage和GetKeyState的一点理解:<br>&nbsp;&nbsp;&nbsp; MSDN上的:如果消息完全由PreTranslateMessage就返回非零值,并不再进一步处理.如果消息将以正常的方式处理,就返回零值.<br>&nbsp;&nbsp;&nbsp; 当我新建一个基于对话框的工程,并加了OnkeyDown函数,再加如下代码想要实现Ctrl+left组合键,但没有任何反应.<br>&nbsp; <br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee" twffan="done"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done"><span style="COLOR: #000000" twffan="done">&nbsp;</span><span style="COLOR: #0000ff" twffan="done">if</span><span style="COLOR: #000000" twffan="done">(nChar</span><span style="COLOR: #000000" twffan="done">==</span><span style="COLOR: #000000" twffan="done">VK_LEFT&nbsp;</span><span style="COLOR: #000000" twffan="done">&amp;&amp;</span><span style="COLOR: #000000" twffan="done">&nbsp;::GetKeyState(VK_CONTROL)</span><span style="COLOR: #000000" twffan="done">&lt;</span><span style="COLOR: #000000" twffan="done">0</span><span style="COLOR: #000000" twffan="done">)&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_55_99_Open_Image onclick="this.style.display='none'; Codehighlighter1_55_99_Open_Text.style.display='none'; Codehighlighter1_55_99_Closed_Image.style.display='inline'; Codehighlighter1_55_99_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top twffan="done"><img id=Codehighlighter1_55_99_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_55_99_Closed_Text.style.display='none'; Codehighlighter1_55_99_Open_Image.style.display='inline'; Codehighlighter1_55_99_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top twffan="done">&nbsp;</span><span id=Codehighlighter1_55_99_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff" twffan="done"><img src="http://www.cppblog.com/Images/dot.gif" twffan="done"></span><span id=Codehighlighter1_55_99_Open_Text twffan="done"><span style="COLOR: #000000" twffan="done">{&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top twffan="done">&nbsp;&nbsp;MessageBox(</span><span style="COLOR: #000000" twffan="done">"</span><span style="COLOR: #000000" twffan="done">left</span><span style="COLOR: #000000" twffan="done">"</span><span style="COLOR: #000000" twffan="done">,</span><span style="COLOR: #000000" twffan="done">"</span><span style="COLOR: #000000" twffan="done">test</span><span style="COLOR: #000000" twffan="done">"</span><span style="COLOR: #000000" twffan="done">,MB_OK);&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top twffan="done">&nbsp;}</span></span></div>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 上网查了资料都是在PreTranslateMessage对消息进行判断,虽然最好的方法是在这里实现,但我比较喜欢尝试,想在这里实现.<br>网上都说在PreTranslateMessage实现,我就在我的工程中去看看PreTranslateMessage函数,当我查了MSDN后终于明白了,我的消息<br>全由默认的函数处理了,到OnkeyDown函数中就处理不了了,我把PreTranslateMessage函数改成下面的样子就可以了!<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee" twffan="done"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done"><span style="COLOR: #000000" twffan="done">BOOL&nbsp;CTestDlg::PreTranslateMessage(MSG</span><span style="COLOR: #000000" twffan="done">*</span><span style="COLOR: #000000" twffan="done">&nbsp;pMsg)&nbsp;<br><img id=Codehighlighter1_47_169_Open_Image onclick="this.style.display='none'; Codehighlighter1_47_169_Open_Text.style.display='none'; Codehighlighter1_47_169_Closed_Image.style.display='inline'; Codehighlighter1_47_169_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top twffan="done"><img id=Codehighlighter1_47_169_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_47_169_Closed_Text.style.display='none'; Codehighlighter1_47_169_Open_Image.style.display='inline'; Codehighlighter1_47_169_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top twffan="done"></span><span id=Codehighlighter1_47_169_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff" twffan="done"><img src="http://www.cppblog.com/Images/dot.gif" twffan="done"></span><span id=Codehighlighter1_47_169_Open_Text twffan="done"><span style="COLOR: #000000" twffan="done">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top twffan="done">&nbsp;</span><span style="COLOR: #008000" twffan="done">//</span><span style="COLOR: #008000" twffan="done">&nbsp;TODO:&nbsp;Add&nbsp;your&nbsp;specialized&nbsp;code&nbsp;here&nbsp;and/or&nbsp;call&nbsp;the&nbsp;base&nbsp;class</span><span style="COLOR: #008000" twffan="done"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top twffan="done"></span><span style="COLOR: #000000" twffan="done">&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top twffan="done">&nbsp;</span><span style="COLOR: #0000ff" twffan="done">return</span><span style="COLOR: #000000" twffan="done">&nbsp;</span><span style="COLOR: #000000" twffan="done">0</span><span style="COLOR: #000000" twffan="done">;</span><span style="COLOR: #008000" twffan="done">//</span><span style="COLOR: #008000" twffan="done">CDialog::PreTranslateMessage(pMsg);</span><span style="COLOR: #008000" twffan="done"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top twffan="done"></span><span style="COLOR: #000000" twffan="done">}</span></span></div>
<p>&nbsp;</p>
<p><br>&nbsp;&nbsp;&nbsp; 这里还有一个问题,关于GetKeyState的,查MSDN后知道它的返回值有三种状态的,有按下和弹起以及类似于大小写转键的触发态.<br>但在这里我们不用到触发态,按下返回负值,弹起返回正值,如果上面我们没有对GetKeyState的返回值判断正负:<br>当你第一次按左键时,也会弹出一个对话框,原因是GetKeyState返回非零值;<br>若你第一次按Ctrl+left时也会弹出对话框,但第二次不用按Ctrl只按左键也会弹出对话框,因为你那时已经触发了Ctrl键,再按一次<br>Ctrl+left;下次按left就不会弹出对话框了,那时Ctrl失效了!(这里是失效还是弹起分不清代,调试看它的返回值,应该是弹出,因为<br>按下Ctrl的值时它的值都在-127和-128两值变化,即最高位(the high-order bit)是1,最低位(the low-order bit)恒为1)<br>但感觉上还是失效,不然也不用第二次来恢复Ctrl的使用!!!!!!!<br>所以上面的GetKeyState必须判断返回值的正负!</p>
<img src ="http://www.cppblog.com/dragon/aggbug/65344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-10-28 16:21 <a href="http://www.cppblog.com/dragon/archive/2008/10/28/65344.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>向一个Win32 Application添加资源</title><link>http://www.cppblog.com/dragon/archive/2008/10/22/64738.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Wed, 22 Oct 2008 12:33:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/10/22/64738.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/64738.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/10/22/64738.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/64738.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/64738.html</trackback:ping><description><![CDATA[<p>向一个Win32 Application添加资源<br>我是在注册窗口类时添加的,没有加任何东西之前创建的工程代码如下:</p>
<p><a href="http://www.cppblog.com/Files/dragon/Addrctext.rar">/Files/dragon/Addrctext.rar</a><br>最主要是在修改的代码在这里:<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee" twffan="done"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done"><span style="COLOR: #000000" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;strWndClass&nbsp;</span><span style="COLOR: #000000" twffan="done">=</span><span style="COLOR: #000000" twffan="done">&nbsp;AfxRegisterWndClass(<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CS_DBLCLKS,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AfxGetApp&nbsp;()</span><span style="COLOR: #000000" twffan="done">-&gt;</span><span style="COLOR: #000000" twffan="done">LoadStandardCursor(IDC_CROSS),<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(HBRUSH)&nbsp;(COLOR_3DFACE</span><span style="COLOR: #000000" twffan="done">+</span><span style="COLOR: #000000" twffan="done">1</span><span style="COLOR: #000000" twffan="done">),&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AfxGetApp&nbsp;()</span><span style="COLOR: #000000" twffan="done">-&gt;</span><span style="COLOR: #000000" twffan="done">LoadStandardIcon&nbsp;(IDI_WINLOGO)&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;);</span></div>
<p>&nbsp;</p>
<p><br>最后我会用LoadCursor加载自己画的鼠标图标的.</p>
<p>首先,"插入"-&gt;"资源"-&gt;"Cursor"-&gt;"新建"<br>会有一个编辑图标的窗口,然后你随便画个图案</p>
<p><br>然后就按保存文件,注意,这里要把保存的文件保存到你的工程文件夹下,即*.dsw文件所在的位置.<br>保存后,你的工程文件夹下会多出两个文件,一个是*.rc,一个是resourch.h</p>
<p>第三步,在FileView里右击Resource Files选择"添加文件到目录",然后打开你的资源文件*.rc;<br>此时你会多出一个资源视图,这时不要双击*.rc不然它会在右编辑框打开的.应该点击下方的资源视图,<br>再查看视图里文件夹下的文件(点击所有+号),最后在左编辑框会显示你的资源了!双击你自己定义的图<br>标右编辑框会出现它的编辑窗口,这里回到文件视图,你会发现Resource Files多了一个*.cur文件</p>
<p>再把增加的resource.h文件添加到Header Files中.<br>这时你查看resource.h文件,其实它已经帮你定义了你的鼠标ID,你自己手动在工程文件夹下用文本编辑<br>器查看*.rc文件,其实它已经帮你做了好多工作!</p>
<p>最后再把resource.h文件包含到*.cpp文件下修改上面的代码即可!<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee" twffan="done"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done"><span style="COLOR: #000000" twffan="done">#include</span><span style="COLOR: #000000" twffan="done">"</span><span style="COLOR: #000000" twffan="done">resource.h</span><span style="COLOR: #000000" twffan="done">"</span><span style="COLOR: #000000" twffan="done"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;strWndClass&nbsp;</span><span style="COLOR: #000000" twffan="done">=</span><span style="COLOR: #000000" twffan="done">&nbsp;AfxRegisterWndClass&nbsp;(<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CS_DBLCLKS,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AfxGetApp&nbsp;()</span><span style="COLOR: #000000" twffan="done">-&gt;</span><span style="COLOR: #000000" twffan="done">LoadCursor(IDC_CURSOR1),<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(HBRUSH)&nbsp;(COLOR_3DFACE</span><span style="COLOR: #000000" twffan="done">+</span><span style="COLOR: #000000" twffan="done">1</span><span style="COLOR: #000000" twffan="done">),&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AfxGetApp&nbsp;()</span><span style="COLOR: #000000" twffan="done">-&gt;</span><span style="COLOR: #000000" twffan="done">LoadStandardIcon&nbsp;(IDI_WINLOGO)&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done"></span></div>
<p>&nbsp;</p>
<p>最后代码(里面有另一篇文章,我看了那篇自己再总结这篇的):<br><a href="http://www.cppblog.com/Files/dragon/Addretext1.rar">/Files/dragon/Addretext1.rar</a></p>
<img src ="http://www.cppblog.com/dragon/aggbug/64738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-10-22 20:33 <a href="http://www.cppblog.com/dragon/archive/2008/10/22/64738.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对SetViewportOrg和SetWindowOrg的理解</title><link>http://www.cppblog.com/dragon/archive/2008/10/15/64005.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Wed, 15 Oct 2008 02:01:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/10/15/64005.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/64005.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/10/15/64005.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/64005.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/64005.html</trackback:ping><description><![CDATA[<p>对SetViewportOrg和SetWindowOrg的理解:<br>void CMainWindow::OnLButtonDown(UINT nFlags,CPoint point)<br>{<br>&nbsp;CRect rect;<br>&nbsp;GetClientRect(&amp;rect);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CClientDC dc(this);<br>&nbsp;dc.SetViewportOrg(0,rect.Height());//把原点移至视口的左下角<br>&nbsp;dc.Rectangle(0,0,200,-200);<br>&nbsp;<br>&nbsp;dc.SetViewportOrg(rect.Width(),rect.Height());//把原点移至视口的右下角<br>&nbsp;dc.Rectangle(0,0,-200,-200);</p>
<p><br>&nbsp;dc.SetViewportOrg(rect.Width(),0);//把原点移至视口的右上角<br>&nbsp;dc.Rectangle(0,0,-200,200);</p>
<p>&nbsp;dc.SetViewportOrg(0,0);//移回原来的位置<br>&nbsp;dc.Rectangle(0,0,200,200);<br>}<br>&nbsp;&nbsp;&nbsp;&nbsp; 由于SetViewportOrg的参数是设备坐标,与逻辑坐标无关,所以当它移动坐标轴时与上一次的坐标轴的位置无<br>关的,并且GetClientDC获得的是设备坐标,更加可以相信它每一次设置的坐标的正确性,它的主要作用是:<span style="COLOR: red" twffan="done">将原点<br>(左上角)移至参数指定的点.</span></p>
<p><br>&nbsp;&nbsp;&nbsp; 至于SetWindowOrg是采用逻辑坐标进行设置坐标原点的,它可以在对应的逻辑映射模式下进行设置原点,除了<br>默认的坐标系是原点在左上角,向为正,向右为正外,其它非自定义模式都是原点在左上角,向下为负,向右为正的,<br>和我们数学的二维坐标系一样,为了更好的体现出SetWindowOrg我将窗口分别变成我们数学上四个像限!它的<br>作用是这样的:<span style="COLOR: red" twffan="done">有一点point1,先将它从设备坐标变成该映射模式下的逻辑坐标(注意:一般设备坐标点是+,+ 逻辑<br>坐标转换后是+,-的,由映射模式决定),然后它移动它的奇对称点使得坐标系跟着移动,当它的奇对称点到达原点<br>时,原来的原点就到达point1的位置!(SetWindowOrg的参数就是point1的奇对称点)</span></p>
<p>&nbsp;</p>
<p>&nbsp;CRect rect;<br>&nbsp;GetClientRect(&amp;rect);<br>没设置前已经是第四象限了!</p>
<p>第一象限:<br>&nbsp;CClientDC dc(this);<br>&nbsp;dc.SetMapMode(MM_LOENGLISH);<br>&nbsp;CPoint point1(0,rect.Height());//把原点移到左下角<br>&nbsp;dc.DPtoLP(&amp;point1);//先将设备坐标变成逻辑坐标!SetWindowOrg要求的!<br>&nbsp;dc.SetWindowOrg(-point1.x,-point1.y);//两个负号取奇对称点!移对称点使得整个坐标跟着移使对称点移到原点<br>&nbsp;CRect rect1(0,0,200,200);<br>&nbsp;dc.Rectangle(&amp;rect1);<br>第二象限:<br>&nbsp;CClientDC dc(this);<br>&nbsp;dc.SetMapMode(MM_LOENGLISH);<br>&nbsp;CPoint point1(rect.Width(),rect.Height());//把原点移到右下角<br>&nbsp;dc.DPtoLP(&amp;point1);//逻辑坐标是相对于MM_LOENGLISH进行转换的,得到的坐标肯定是(+,-)<br>&nbsp;dc.SetWindowOrg(-point1.x,-point1.y);<br>&nbsp;dc.Rectangle(0,0,-200,200);<br>第三象限:<br>&nbsp;CClientDC dc(this);<br>&nbsp;dc.SetMapMode(MM_LOENGLISH);<br>&nbsp;CPoint point1(rect.Width(),0);//把原点移到右上角<br>&nbsp;dc.DPtoLP(&amp;point1);<br>&nbsp;dc.SetWindowOrg(-point1.x,-point1.y);<br>&nbsp;dc.Rectangle(0,0,-200,-200);</p>
<p><br>上面的SetWindowOrg分开画的,我要的效果是要像上面的SetViewportOrg这样连着画:<br>其实在移完一个原点后,把原点移回(0,0)再移过就可以做到了:(第四象限忽略)<br>&nbsp;CRect rect;<br>&nbsp;GetClientRect(&amp;rect);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int width=rect.Width();<br>&nbsp;int height=rect.Height();<br>&nbsp;<br>&nbsp;CClientDC dc(this);<br>&nbsp;dc.SetMapMode(MM_LOENGLISH);<br>&nbsp;CPoint point1(0,height);<br>&nbsp;dc.DPtoLP(&amp;point1);<br>&nbsp;dc.SetWindowOrg(-point1.x,-point1.y);<br>&nbsp;CRect rect1(0,0,200,200);<br>&nbsp;dc.Rectangle(&amp;rect1);<br>&nbsp;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dc.SetWindowOrg(0,0);<br>&nbsp;point1=CPoint(width,height);<br>&nbsp;dc.DPtoLP(&amp;point1);<br>&nbsp;dc.SetWindowOrg(-point1.x,-point1.y);<br>&nbsp;dc.Rectangle(0,0,-200,200);</p>
<p>&nbsp;dc.SetWindowOrg(0,0);<br>&nbsp;point1=CPoint(width,0);<br>&nbsp;dc.DPtoLP(&amp;point1);<br>&nbsp;dc.SetWindowOrg(-point1.x,-point1.y);<br>&nbsp;dc.Rectangle(0,0,-200,-200);</p>
<p><br>如果我中间没有用dc.SetWindowOrg(0,0);就要思考了!<br>&nbsp;CClientDC dc(this);<br>&nbsp;dc.SetMapMode(MM_LOENGLISH);<br>&nbsp;CPoint point1(0,height);<br>&nbsp;dc.DPtoLP(&amp;point1);<br>&nbsp;dc.SetWindowOrg(-point1.x,-point1.y);<br>&nbsp;CRect rect1(0,0,200,200);<br>&nbsp;dc.Rectangle(&amp;rect1);<br>&nbsp;<br>&nbsp;//先明确上一步我们的坐标原点在左下角,要把原点移到右下角,此时右下角相对当时的坐标系是(width,0)<br>&nbsp;point1=CPoint(width,0);//移至(width,0)<br>&nbsp;dc.DPtoLP(&amp;point1);//变换成为逻辑坐标,但符号变为(+,-),因为在MM_LOENGLISH映射模式下<br>&nbsp;dc.SetWindowOrg(-point1.x,point1.y);//(width,0)为(+,0)则它的对称点应为(-,0)才对,<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;&nbsp;&nbsp;&nbsp; //只要将point1前一个变号即可,第二个为0不用变!<br>&nbsp;dc.Rectangle(0,0,-200,200);</p>
<p>&nbsp;<img height=480 alt="" src="http://www.cppblog.com/images/cppblog_com/dragon/11.JPG" width=637 border=0><br>&nbsp;//先明确上一步我们的坐标原点在右下角,要把原点移到右上角,此时右上角相对当时的坐标系是(0,height)<br>&nbsp;point1=CPoint(0,height);//移至(0,height)<br>&nbsp;dc.DPtoLP(&amp;point1);//变换成为逻辑坐标,但符号变为(+,-),因为在MM_LOENGLISH映射模式下<br>&nbsp;dc.SetWindowOrg(point1.x,point1.y);//(0,height)为(0,+)则它的对称点应为(0,-)才对,和逻辑坐标同号,不用变!<br>&nbsp;dc.Rectangle(0,0,-200,-200);<br><img height=480 alt="" src="http://www.cppblog.com/images/cppblog_com/dragon/12.JPG" width=637 border=0></p>
<p>可以看出SetWindowOrg每一次执行都改变一次坐标系的位置!!</p>
<img src ="http://www.cppblog.com/dragon/aggbug/64005.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-10-15 10:01 <a href="http://www.cppblog.com/dragon/archive/2008/10/15/64005.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>手动创建控件的tab顺序</title><link>http://www.cppblog.com/dragon/archive/2008/10/13/63861.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Mon, 13 Oct 2008 02:10:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/10/13/63861.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/63861.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/10/13/63861.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/63861.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/63861.html</trackback:ping><description><![CDATA[<p>手动创建控件的tab顺序:<br>&nbsp;&nbsp;&nbsp; 一般手动创建的控件(在其它可视化控件存在的情况下)按tab键是不会有焦点的!只要在创建控件的函数Create时<br>加WS_TABSTOP属性就会有了!(这个一定要记得要加)<br>&nbsp;&nbsp;&nbsp; 若你想令它成为当窗口弹出来时成为第一个拥有焦点的控件,只要你用下面的函数就可以:<br>&nbsp;&nbsp;&nbsp; myButton.SetWindowPos(&amp;wndTop,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);<br>SetWindowPos函数的介绍:<br>BOOL SetWindowPos ( <br>const CWnd* pWndInsertAfter, <br>int x, <br>int y, <br>int cx, <br>int cy, <br>UINT nFlags );</p>
<p>这个方法改变子窗口,(右击)弹出窗口,顶级窗口的大小,位置和Z顺序!<br>从我的看法来觉得,Z顺序是相对显示器平面的垂直方向窗口显示的顺序!</p>
<p>参数:<br>pWndInsertAfter<br>在z序中的位于被置位的窗口前一个窗口句柄。该参数必须为一个CWnd指针，或下列值的地址(因为参数是指针)之一：<br>wndBottom 将窗口置于Z序的底部;如果CWnd是一个顶层窗口,这个窗口将失去顶级位置,它将放在所有窗口的底部!<br>wndTop 将窗口置于Z序的顶部<br>wndTopMost 将窗口置于所有非顶层窗口之上。即使窗口未被激活窗口也将保持顶级位置。<br>wndNoTopMost 将窗口置于所有非顶层窗口之上（即在所有顶层窗口之后）。如果窗口已经是非顶层窗口则该标志不起作用。<br>wndTop就是要将它放到Z顺序的首位置;</p>
<p><br>x: 以客户坐标指定窗口新位置的左边界.<br>Y: 以客户坐标指定窗口新位置的顶边界.<br>cx:以像素指定窗口的新的宽度.<br>cy:以像素指定窗口的新的高度.</p>
<p>uFlags:窗口尺寸和定位的标志。该参数可以是下列值的组合：<br>　　SWP_ASNCWINDOWPOS：如果调用进程不拥有窗口，系统会向拥有窗口的线程发出需求。这就防止调用线程在其他线程处理需求的时候发生死锁。<br>　　SWP_DEFERERASE：防止产生WM_SYNCPAINT消息。<br>　　SWP_DRAWFRAME：在窗口周围画一个边框（定义在窗口类描述中）。<br>　　SWP_FRAMECHANGED：给窗口发送WM_NCCALCSIZE消息，即使窗口尺寸没有改变也会发送该消息。如果未指定这个标志，只有在改变了窗口尺寸时才发送WM_NCCALCSIZE。<br>　　SWP_HIDEWINDOW;隐藏窗口。<br>　　SWP_NOACTIVATE：不激活窗口。如果未设置标志，则窗口被激活，并被设置到其他最高级窗口或非最高级组的顶部（根据参数hWndlnsertAfter设置）。<br>　　SWP_NOCOPYBITS：清除客户区的所有内容。如果未设置该标志，客户区的有效内容被保存并且在窗口尺寸更新和重定位后拷贝回客户区。<br>　　SWP_NOMOVE：维持当前位置（忽略X和Y参数）。<br>　　SWP_NOOWNERZORDER：不改变z序中的所有者窗口的位置。<br>　　SWP_NOREDRAW:不重画改变的内容。如果设置了这个标志，则不发生任何重画动作。适用于客户区和非客户区（包括标题栏和滚动条）和任何由于窗回移动而露出的父窗口的所有部分。如果设置了这个标志，应用程序必须明确地使窗口无效并区重画窗口的任何部分和父窗口需要重画的部分。<br>　　SWP_NOREPOSITION；与SWP_NOOWNERZORDER标志相同。<br>　　SWP_NOSENDCHANGING：防止窗口接收WM_WINDOWPOSCHANGING消息。<br>　　SWP_NOSIZE：维持当前尺寸（忽略cx和cy参数）。<br>　　SWP_NOZORDER：维持当前Z序（忽略pWndInsertAfter参数）。<br>　　SWP_SHOWWINDOW：显示窗口。<br>　　返回值：如果函数成功，返回值为非零；如果函数失败，返回值为零。若想获得更多错误消息，请调用GetLastError函数。<br>　　备注：如果设置了SWP_SHOWWINDOW和SWP_HIDEWINDOW标志，则窗口不能被移动和改变大小。如果使用SetWindowLoog改变了窗口的某些数据，则必须调用函数SetWindowPos来作真正的改变。使用下列的组合标志：SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED。<br>　　有两种方法将窗口设为最顶层窗口：一种是将参数pWndInsertAfter设置为wndTopMost并确保没有设置SWP_NOZORDER标志；另一种是设置窗口在Z序中的位置以使其在其他存在的窗口之上。当一个窗口被置为最顶层窗口时，属于它的所有窗口均为最顶层窗口，而它的所有者的z序并不改变。<br>　　如果wndTopMost和wndNoTopMost标志均未指定，即应用程序要求窗口在激活的同时改变其在Z序中的位置时，在参数hWndinsertAfter中指定的值只有在下列条件中才使用：<br>　　在hWndlnsertAfter参数中没有设定wndNoTopMost和wndTopMost标志。<br>　　由hWnd参数标识的窗口不是激活窗口。<br>　　如果未将一个非激活窗口设定到z序的顶端，应用程序不能激活该窗口。应用程序可以无任何限制地改变被激活窗口在Z序中的位置，或激活一个窗口并将其移到最高级窗口的顶部或非最高级窗口的顶部。<br>　　如果一个顶层窗口被重定位到z序的底部（wndBottom）或在任何非最高序的窗口之后，该窗口就不再是最顶层窗口。当一个最顶层窗口被置为非最顶级，则它的所有者窗口和所属者窗口均为非最顶层窗口。<br>　　一个非最顶端窗口可以拥有一个最顶端窗口，但反之则不可以。任何属于顶层窗口的窗口（例如一个对话框）本身就被置为顶层窗口，以确保所有被属窗口都在它们的所有者之上。<br>　　如果应用程序不在前台，但应该位于前台，就应调用SetForegroundWindow函数来设置。</p>
<p><br>我手动创建了几个控件,然后调用下面的函数进行设置tab顺序!未设置之前是按控件的创建顺序为tab顺序:<br>void CTest4Dlg::OnSetOrder()<br>{<br>&nbsp;CWnd * pNum1=GetDlgItem(IDC_NUM1);<br>&nbsp;CWnd * pNum2=GetDlgItem(IDC_NUM2);<br>&nbsp;CWnd * pResult=GetDlgItem(IDC_RESULT);<br>&nbsp;CWnd * pEqual=GetDlgItem(IDC_EQUAL);<br>&nbsp;CWnd * pClear=GetDlgItem(IDC_CLEAR);<br>&nbsp;CWnd * pSetOrder=GetDlgItem(IDC_SETORDER);<br>&nbsp;EquBtn.SetWindowPos(&amp;wndTop,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);//wndTop是设置为Z顺序的最顶部!<br>&nbsp;Num2.SetWindowPos(pEqual,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);<br>&nbsp;SetOrder.SetWindowPos(pNum2,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);<br>&nbsp;Result.SetWindowPos(pSetOrder,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);<br>&nbsp;Clear.SetWindowPos(pResult,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);<br>}</p>
<p>开始时它的tab顺序是这样的,如下图:<br><img height=331 alt="" src="http://www.cppblog.com/images/cppblog_com/dragon/tab1.JPG" width=485 border=0></p>
<p>当按了设置按钮(OnSetOrder)后,如下图:<br><img height=331 alt="" src="http://www.cppblog.com/images/cppblog_com/dragon/tab2.JPG" width=485 border=0></p>
<img src ="http://www.cppblog.com/dragon/aggbug/63861.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-10-13 10:10 <a href="http://www.cppblog.com/dragon/archive/2008/10/13/63861.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>两种方法实现回车响应tab键</title><link>http://www.cppblog.com/dragon/archive/2008/10/12/63822.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Sun, 12 Oct 2008 10:13:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/10/12/63822.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/63822.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/10/12/63822.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/63822.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/63822.html</trackback:ping><description><![CDATA[<p>两种方法实现回车响应tab键:<br>第一种比较简单:<br>只要在你的对话框类C**Dlg中右击添加虚函数PreTranslateMessage然后加如下代码即可:<br>BOOL CTest2Dlg::PreTranslateMessage(MSG* pMsg) <br>{<br>&nbsp;// TODO: Add your specialized code here and/or call the base class<br>&nbsp;if(pMsg-&gt;message==WM_KEYDOWN)<br>&nbsp;{<br>&nbsp;&nbsp;if(pMsg-&gt;wParam==VK_RETURN)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;pMsg-&gt;wParam=VK_TAB;<br>&nbsp;&nbsp;}<br>&nbsp;}<br>&nbsp;return CDialog::PreTranslateMessage(pMsg);<br>}</p>
<p>第二种方法好一点,但实现起来也比较难一点:<br>1.新建一个基于对话框的工程test3;我把"确定"和"取消"都删除了!<br>2.在对话框中插入如图的控件(其中Button1的ID是IDOK)<br><img height=331 alt="" src="http://www.cppblog.com/images/cppblog_com/dragon/return.jpg" width=484 border=0><br>3.右击工程添加一个MFC类,类名为CMyEdit<br>4.然后右击这个新类添加WM_KEYDOWN消息函数OnKeyDown;并加如下代码:<br>void CMyEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) <br>{<br>&nbsp;// TODO: Add your message handler code here and/or call default<br>&nbsp;if(nChar==VK_RETURN)<br>&nbsp;{<br>&nbsp;&nbsp;CTest3Dlg * pwnd=(CTest3Dlg *)GetParent();//为个是主对话框类,所以在CPP文件中加#include "test3Dlg.h"<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;&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>&nbsp;&nbsp;pwnd-&gt;NextDlgCtrl();<br>&nbsp;}<br>&nbsp;CEdit::OnKeyDown(nChar, nRepCnt, nFlags);<br>}</p>
<p>5.然后将主对话框中的两个编辑框定义关联变量:<br>在classwizard中选择 member variables 选项，class name选择对话框类，control ids中选择编辑框的id号，然后选择add variable按扭。在对话框中 categary选择control， variable type 刚才定义的类m_myedit1,m_myedit2;那时它会提示你加头文件<br>"MyEdit.h" 你此时就在头文件Test3Dlg.h加#include "MyEdit.h"</p>
<p>6.为了让焦点落在按钮1时,若按下回车响应按钮1的函数,我加了两个函数:<br>void CTest3Dlg::OnOK()//其中这个就是按钮1的响应函数<br>{<br>&nbsp;// TODO: Add extra validation here<br>&nbsp;MessageBox("dragon");<br>&nbsp;//CDialog::OnOK();//我为了不让默认的OnOK函数执行,将它屏蔽了!<br>}</p>
<p>void CTest3Dlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)//右击类添加的! <br>{<br>&nbsp;// TODO: Add your message handler code here and/or call default<br>&nbsp;if(nChar==VK_RETURN)<br>&nbsp;&nbsp;OnOK();<br>&nbsp;CDialog::OnKeyDown(nChar, nRepCnt, nFlags);<br>}<br></p>
<img src ="http://www.cppblog.com/dragon/aggbug/63822.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-10-12 18:13 <a href="http://www.cppblog.com/dragon/archive/2008/10/12/63822.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CIPAddressCtrl控件的用法</title><link>http://www.cppblog.com/dragon/archive/2008/09/25/62744.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Thu, 25 Sep 2008 02:28:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/09/25/62744.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/62744.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/09/25/62744.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/62744.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/62744.html</trackback:ping><description><![CDATA[<p>CIPAddressCtrl控件的用法:</p>
<p>1.通过Create函数手动创建一个IP控件.<br>开始时我在OnInitDialog()函数中这样写的:<br>CIPAddressCtrl IPAddress;<br>UINT nID=101;<br>IPAddress.Create(WS_CHILD |WS_VISIBLE ,CRect(20,20,300,43),this,nID);<br>但运行之后看不到有IP控件出来,后来才发现原来我的IPAddress是一个局部变量,当OnInitDialog()函数返回时,这个变量就撤销了.<br>所以不会有控件出来!!<br>只要把CIPAddressCtrl IPAddress;放到头文件中定义为成员变量就OK了!</p>
<p>如果上面的Create函数的第一个参数没有|WS_VISIBLE;我们可以Create函数后加这一句:IPAddress.ShowWindow(SW_SHOW);<br>感觉上Create函数在每一个控件里都有,创建的方法也是大同小异了吧!</p>
<p>2.下面的是我在基于一个对话框的工程中添加一个IP控件中所写的:<br>先获得控件的指针:<br>CIPAddressCtrl * pIP=(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS);</p>
<p>void ClearAddress( );<br>这个函数将IP控件里的内容清空.<br>BOOL IsBlank( ) const;<br>这个函数是当IP控件里一个数字都没有才返回真的,全为0都返回假,0也是数字!调用ClearAddress( )后刚好可以使IsBlank()反回真.<br>测试代码如下:<br>pIP-&gt;ClearAddress();<br>if(pIP-&gt;IsBlank())<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; MessageBox("IP全为空");<br>}</p>
<p>&nbsp;</p>
<p>int GetAddress(BYTE&amp; nField0, BYTE&amp; nField1, BYTE&amp; nField2, BYTE&amp; nField3);<br>int GetAddress(DWORD&amp; dwAddress);<br>当控件内容为空时,即没有数字,连0也没有,返回0,0,0,0.和控件全为0的情况一样!<br>获得IP地址:(两种方法,选其一)</p>
<p><br>&nbsp;BYTE nf1,nf2,nf3,nf4;<br>&nbsp;pIP-&gt;GetAddress(nf1,nf2,nf3,nf4);<br>&nbsp;CString str;<br>&nbsp;str.Format("%d.%d.%d.%d",nf1,nf2,nf3,nf4);//这里的nf得到的值是IP值了.<br>&nbsp;MessageBox(str);<br>&nbsp;</p>
<p>&nbsp;/*<br>&nbsp;DWORD dw;<br>&nbsp;pIP-&gt;GetAddress(dw);<br>&nbsp;CString str;<br>&nbsp;WORD hiWord=HIWORD(dw);<br>&nbsp;WORD loWord=LOWORD(dw);<br>&nbsp;BYTE nf1=HIBYTE(hiWord);<br>&nbsp;BYTE nf2=LOBYTE(hiWord);<br>&nbsp;BYTE nf3=HIBYTE(loWord);<br>&nbsp;BYTE nf4=LOBYTE(loWord);<br>&nbsp;str.Format("%d.%d.%d.%d",nf1,nf2,nf3,nf4);<br>&nbsp;MessageBox(str);<br>&nbsp;*/</p>
<p><br>void SetAddress(BYTE nField0, BYTE nField1, BYTE nField2, BYTE nField3);<br>void SetAddress(DWORD dwAddress);<br>设置IP地址:(两种方法,选其一)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pIP-&gt;SetAddress(127,0,0,1);</p>
<p>&nbsp;pIP-&gt;SetAddress((DWORD)0x7F000001);//这两行的效果都是一样的!</p>
<p><br>void SetFieldRange(int nField, BYTE nLower, BYTE nUpper);<br>设置每一个域的范围:(nField是0到3的值,nLower和nUpper的范围都是0到255.可以超出范围,但控件也还是默认设置回0到255的!</p>
<p>&nbsp;pIP-&gt;SetFieldRange(0,5,127);//设置每一个域的范围,第一个参数是域的下标,第二和第三个是范围.<br>&nbsp;pIP-&gt;SetFieldRange(1,5,127);//当输入比5少时,如0,当失去输入焦点时,它会重置为5.<br>&nbsp;pIP-&gt;SetFieldRange(2,5,127);//当输入比127大时,如128,它会自动变回127<br>&nbsp;pIP-&gt;SetFieldRange(3,5,127);</p>
<p><br>void SetFieldFocus(WORD nField);<br>nField的值为0到3;表示域的下标!该函数是使输入焦点落在四个域的指定域上;<br>这个函数要在消息响应时才能体现出来!<br>测试代码:<br>void CTestDlg::OnButton2() <br>{<br>&nbsp;// TODO: Add your control notification handler code here<br>&nbsp;CIPAddressCtrl * pIP=(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS);<br>&nbsp;pIP-&gt;SetFieldFocus(2);<br>}</p>
<img src ="http://www.cppblog.com/dragon/aggbug/62744.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-09-25 10:28 <a href="http://www.cppblog.com/dragon/archive/2008/09/25/62744.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GetLogicalDriveStrings函数</title><link>http://www.cppblog.com/dragon/archive/2008/09/24/62664.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Wed, 24 Sep 2008 03:33:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/09/24/62664.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/62664.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/09/24/62664.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/62664.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/62664.html</trackback:ping><description><![CDATA[<p>对GetLogicalDriveStrings的理解:<br>函数原形:<br>DWORD GetLogicalDriveStrings(<br>&nbsp; DWORD nBufferLength,&nbsp; // size of buffer<br>&nbsp; LPTSTR lpBuffer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // drive strings buffer<br>);</p>
<p>说明:GetLogicalDriveStrings函数将一个缓冲区lpBuffer填入在计算机上存在的硬盘盘符.</p>
<p>参数说明:<br>nBufferLength是缓冲区lpBuffer的大小,以字节为单位.它的大小不包含最后的空字符.如果它的值为零,缓冲区不可用.</p>
<p>lpBuffer指向一个接收各种以零结尾的字符串缓冲区,一个空字符用来区分各个可用硬盘的,最后在末尾有再以空字符结尾,假如<br>你的电脑上有C,D两个硬盘盘符,则它能得到一个字符串是:<br>'C',':','\',' ','D',':','\',' ',' '<br>即:C:\&lt;null&gt;D:\&lt;null&gt;&lt;null&gt;</p>
<p><br>返回值:<br>如果函数成功结束,返回值是获得的字符串长度,以字节为单位,不包括最后的一个空字符,好像上面的字符串获得的长度就是8;硬盘<br>盘符的个数自乘以4就是了;记住:一个ANSI-ASCII码的空字符是一个字节,而一个Unicode码的空字符是两个字节.如果这个缓冲区不<br>够大,返回值会比nBufferLength大,这是缓冲区要求去获得全部硬盘盘符的原因.</p>
<p>如果函数失败,这个返回值是0;用GetLastError可以捕获这个错误信息!</p>
<img src ="http://www.cppblog.com/dragon/aggbug/62664.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-09-24 11:33 <a href="http://www.cppblog.com/dragon/archive/2008/09/24/62664.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC++加速键的加入方法</title><link>http://www.cppblog.com/dragon/archive/2008/09/16/62014.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Tue, 16 Sep 2008 15:07:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/09/16/62014.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/62014.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/09/16/62014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/62014.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/62014.html</trackback:ping><description><![CDATA[<font color=#993300>一种是直接与菜单项关联的加速键&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另一种就是自定义的加速键.</font>
<p><span style="COLOR: #993300" twffan="done"><strong>&nbsp;第一种:</strong> (如果是基于对话框的工程,我们先添加菜单和加速键资源,然后右击主对话框属性添加菜单)<br>首先在资源文件Accelerator中添加快捷键资源 ID选择你要关联菜单项的名称 然后再设置你的快捷键.什么?下一步?在.h文件中加入一个&nbsp;&nbsp;&nbsp; HACCEL&nbsp;&nbsp; hAccel;变量 然后在OnInitDialog或初始化中加入hAccel=::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1));&nbsp; 后面的参数是加速键资源文件名.</span></p>
<p><span style="COLOR: #993300" twffan="done">最后在PreTranslateMessage(MSG* pMsg) 中加入:<br>&nbsp;&nbsp;&nbsp; if(::TranslateAccelerator(GetSafeHwnd(),hAccel,pMsg))&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; true; <br></span></p>
<p><span style="COLOR: #993300" twffan="done">这样 以后只要在Accelerator资源文件中添加快捷键就可以了 <br><strong>注意： </strong><span style="COLOR: #0000ff" twffan="done">添</span><span style="COLOR: #0000ff" twffan="done">加快捷键的ID一定要与菜单ID一样</span> 这样才能响应.现在只需要在此菜单项中加入OnCommand消息的处理就可以了.</span></p>
<p><span style="COLOR: #993300" twffan="done"><br></span></p>
<p><span style="COLOR: #993300" twffan="done"><strong>第二种:</strong> 还是在资源文件Accelerator中添加快捷键资源 ID自己定义一个.然后再设置你的快捷键.下一步...就是在.h文件中定义一个快捷键对象<br>HACCEL m_hAccel;</span></p>
<p><span style="COLOR: #993300" twffan="done">然后在.cpp文件中初始<br>&nbsp;m_hAccel = ::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1));<br>IDR_ACCELERATOR1为你的加速资源名称.注意不是刚刚定义的加速键ID.<br><br>再添加PreTranslateMessage消息处理 在里面加入以下代码:<br>&nbsp;//保存快捷键被启用<br>&nbsp;if(m_hAccel&nbsp;&nbsp; !=&nbsp;&nbsp; NULL)&nbsp;&nbsp; <br>&nbsp;{&nbsp;&nbsp; <br>&nbsp;&nbsp;if (TranslateAccelerator(m_hWnd, m_hAccel, pMsg))<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp; TRUE;&nbsp; <br>&nbsp;&nbsp;<br>&nbsp;}&nbsp;&nbsp; </span></p>
<p><span style="COLOR: #993300" twffan="done">再添加OnCommand消息处理 加入以下代码:</span></p>
<p><span style="COLOR: #993300" twffan="done">//响应加速键<br>&nbsp; switch(LOWORD(wParam))&nbsp;&nbsp; <br>&nbsp; {&nbsp;&nbsp; <br>&nbsp; case&nbsp; SHOW_DIAL0G:&nbsp;&nbsp; //加速键ID&nbsp;&nbsp; <br>//...添加处理语句<br>&nbsp; break;&nbsp;&nbsp;&nbsp;<br>&nbsp; case&nbsp;&nbsp; SHOW_DIALOG_02:&nbsp;&nbsp; //加速键ID&nbsp;&nbsp; <br>//...添加处理语句<br>&nbsp; break;&nbsp;&nbsp;&nbsp;<br><br>&nbsp; }<br><br>自己加的:在我看的代码中,它是利用对话框加菜单的,当加了菜单后,把菜单挂到对话框,然后响应一个菜单项.再在对话框类中加虚函数PreTranslateMessage,在些数里的代码如下:<br>&nbsp;if(&nbsp;pMsg-&gt;message==WM_KEYDOWN)<br>&nbsp;{<br>&nbsp;&nbsp;if(pMsg-&gt;wParam==VK_F2)<br>&nbsp;&nbsp;&nbsp;this-&gt;PostMessage(WM_COMMAND,IDM_SHOW);//IDM_SHOW是响应的菜单项ID<br>&nbsp;}<br>&nbsp;return CDialog::PreTranslateMessage(pMsg);<br>这样我就可以响应F2的加速键了!!<br>转载:<a title=http://www.cnblogs.com/thankgoodness/articles/1136617.html href="http://www.cnblogs.com/thankgoodness/articles/1136617.html">http://www.cnblogs.com/thankgoodness/articles/1136617.html<br></a></span></p>
<img src ="http://www.cppblog.com/dragon/aggbug/62014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-09-16 23:07 <a href="http://www.cppblog.com/dragon/archive/2008/09/16/62014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GetSafeHwnd()</title><link>http://www.cppblog.com/dragon/archive/2008/09/08/61274.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Sun, 07 Sep 2008 18:33:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/09/08/61274.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/61274.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/09/08/61274.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/61274.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/61274.html</trackback:ping><description><![CDATA[<font color=#0000ff>当我们想得到一个窗口对象（CWnd的派生对象）指针的句柄（HWND）时，最安全的方法是使用GetSafeHwnd()函数，通过下面的例子来看其理由：<br>CWnd *pwnd = FindWindow(&#8220;ExploreWClass&#8221;,NULL); //希望找到资源管理器<br>HWND hwnd = pwnd-&gt;m_hwnd; //得到它的HWND<br>这样的代码当开始得到的pwnd为空的时候就会出现一个&#8220;General protection error&#8221;,并关闭应用程序，因为一般不能对一个NULL指针访问其成员，如果用下面的代码：<br>CWnd *pwnd = FindWindow(&#8220;ExploreWClass&#8221;,NULL); //希望找到资源管理器<br>HWND hwnd = pwnd-&gt;GetSafeHwnd(); //得到它的HWND<br>就不会出现问题，因为尽管当pwnd是NULL时，GetSafeHwnd仍然可以用，只是返回NULL，通过GetSafeHwnd()的实现代码就更清楚了：<br>_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const<br>{<br>return this == NULL?NULL:m_hWnd;<br>}<br>你看有很多函数的参数要求HWND,它就可以派上用场了.<br>HWND hwnd;<br>CWnd* pWnd;<br>pWnd=((CFrameWnd*)(AfxGetApp()-&gt;m_pMainWnd))-&gt;GetActiveView();<br>hwnd=pWnd-&gt;GetDlgItem(IDC_EDIT2)-&gt;GetSafeHwnd();<br>::SetWindowText(hwnd,m_strResult); <br>转载:<a title=http://hi.baidu.com/johnleeqq/blog/item/ae746a5088f4535f1138c2b2.html href="http://hi.baidu.com/johnleeqq/blog/item/ae746a5088f4535f1138c2b2.html">http://hi.baidu.com/johnleeqq/blog/item/ae746a5088f4535f1138c2b2.html</a></font>
<img src ="http://www.cppblog.com/dragon/aggbug/61274.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-09-08 02:33 <a href="http://www.cppblog.com/dragon/archive/2008/09/08/61274.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>帮工具栏换位图</title><link>http://www.cppblog.com/dragon/archive/2008/09/06/61176.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Sat, 06 Sep 2008 15:15:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/09/06/61176.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/61176.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/09/06/61176.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/61176.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/61176.html</trackback:ping><description><![CDATA[<p>帮工具栏换位图:<br>&nbsp;&nbsp;&nbsp; 一般新建的工具栏上的按钮都是经过自己画图的,今天自己仿另一个系统做,无意中发现不用自己画图也行.最后我按下面的步骤做成功了!</p>
<p>新建一个基于对话框的工程;<br>(1)我加载的工具栏有十个64*42的按钮,所以对话要事先拉得比工具栏宽!<br>(2)插入一个工具栏,初始ID为IDR_TOOLBAR1;然后在上面加十个64*42的按钮,我加载的位图是&nbsp;&nbsp; 640*42的,这个可以算出来吧!<br>(3)在C**Dlg类添加一个CToolBar变量m_ToolBar;再在这个类添加OnInitDialog()函数,在这函数里添加如下代码加载工具条到对话框!</p>
<p>if (!m_ToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP<br>&nbsp;&nbsp;| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||<br>&nbsp;&nbsp;!m_ToolBar.LoadToolBar(<span style="COLOR: red" twffan="done">IDR_TOOLBAR1</span>))<br>&nbsp;{<br>&nbsp;&nbsp;TRACE0("Failed to create toolbar\n");<br>&nbsp;&nbsp;return -1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // fail to create<br>&nbsp;}</p>
<p>&nbsp;RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);<br>&nbsp;m_ToolBar.ShowWindow(SW_SHOW);<br>然后编译运行!<br>(4)右击你的工具栏点属性,看到文件名的内容是:res\toolbar1.bmp;这下你也自然想到工程下的res文件夹了吧,将你要加入的图片改名为toolbar1.bmp复制到res文件下去覆盖原来的toolbar1.bmp;这时VC会弹出一个对话框说"........\toolbar1.bmp这个文件已在Microsoft Developer Studio之外补修改,你要重新载入它吗?"<br>你按"是"就行了!<br><img src="http://www.cppblog.com/images/cppblog_com/dragon/QQ.jpg" border=0 twffan="done"><br>这时你编辑的工具栏相应会有变化的了!</p>
<p>(5)编译运行后是还不行的,<span style="COLOR: red" twffan="done">那时我把我工具栏的左数第一个按钮改了ID再编译运行就OK了</span>!</p>
<p>这个顺序不能倒啊,呵呵!因为toolbar1.bmp原先不存在的,编译运行时它会自己生成的,但我们生成后再去覆盖就不一样了!<br>以下是我做成功的界面和用到的toolbar1.bmp图(<span style="COLOR: red">因为不能上传bmp格式,我把后缀改成jpg才上传了</span>)<br><img src="http://www.cppblog.com/images/cppblog_com/dragon/QQ1.jpg" border=0 twffan="done"><br><br><img src="http://www.cppblog.com/images/cppblog_com/dragon/toolbar1.jpg" border=0 twffan="done"><br>紧作笔记之用,如果觉得这个简单勿嘲笑!</p>
<img src ="http://www.cppblog.com/dragon/aggbug/61176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-09-06 23:15 <a href="http://www.cppblog.com/dragon/archive/2008/09/06/61176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些注册表操作函数</title><link>http://www.cppblog.com/dragon/archive/2008/09/06/61113.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Sat, 06 Sep 2008 05:01:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/09/06/61113.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/61113.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/09/06/61113.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/61113.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/61113.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;1. 打开注册表键<br>&nbsp;&nbsp;&nbsp;LONG RegOpenKeyEx(<br>&nbsp; HKEY hKey,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // handle to open key主键<br>&nbsp; LPCTSTR lpSubKey,&nbsp; // subkey name子键<br>&nbsp; DWORD ulOptions,&nbsp;&nbsp; // reserved。必须是0<br>&nbsp; REGSAM samDesired, // security access mask读写标识<br>&nbsp; PHKEY phkResult&nbsp;&nbsp;&nbsp; // handle to open key返回的HKEY类型的指针。以后，读写，关闭用这个指针<br>&nbsp; );</p>
<p>&nbsp;</p>
<p>如：<br>// 打开HKEY_LOCAL_MACHINE主键下的SoftWare\\Cleaner\\Cleaner子键<br>&nbsp;HKEY hKEY;<br>&nbsp;HKEY&nbsp; hKeyRoot = HKEY_LOCAL_MACHINE;<br>&nbsp;long ret0=(::RegOpenKeyEx(hKeyRoot,"SoftWare\\Cleaner\\Cleaner",0,KEY_READ,&amp;hKEY));<br>&nbsp;if(ret0!=ERROR_SUCCESS)//如果无法打开hKEY,则中止程序的执行<br>&nbsp;{<br>&nbsp; AfxMessageBox("错误：无法打开有关的hKEY");<br>&nbsp; return;<br>&nbsp;}<br></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;2. 读取注册表<br>&nbsp;LONG RegQueryValueEx(<br>&nbsp; HKEY hKey,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // handle to key打开注册表指针<br>&nbsp; LPCTSTR lpValueName,&nbsp; // value name要读取的键名称<br>&nbsp; LPDWORD lpReserved,&nbsp;&nbsp; // reserved&nbsp; must be NULL. 必须是NULL<br>&nbsp; LPDWORD lpType,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // type buffer，键类型。我最常用REG_SZ,REG_DWORD<br>&nbsp; LPBYTE lpData,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // data buffer。保存查询结果的缓冲区<br>&nbsp; LPDWORD lpcbData&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // size of data buffer。缓冲区大小<br>);<br>如：<br>// hKEY是上面打开时得到的指针。<br>&nbsp;LPBYTE getValue = new BYTE[80];//得到的键值<br>&nbsp;DWORD keyType = REG_SZ;//定义数据类型<br>&nbsp;DWORD DataLen = 80;//定义数据长度<br>&nbsp;CString strUser = _T("Version");//要查询的键名称<br>&nbsp;long ret1=::RegQueryValueEx(hKEY,strUser,NULL,&amp;keyType,getValue,&amp;DataLen);<br>&nbsp;if(ret1!=ERROR_SUCCESS)<br>&nbsp;{<br>&nbsp; AfxMessageBox("错误：无法查询有关的注册表信息");<br>&nbsp; return;<br>&nbsp;}<br></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;3. 写注册表<br>&nbsp; LONG RegSetValueEx(<br>&nbsp; HKEY hKey,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // handle to key。打开注册表的指针<br>&nbsp; LPCTSTR lpValueName, // value name 要写入的键<br>&nbsp; DWORD Reserved,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // reserved&nbsp; 必须是0<br>&nbsp; DWORD dwType,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // value type 写入值类型<br>&nbsp; CONST BYTE *lpData,&nbsp; // value data 要写入的数据<br>&nbsp; DWORD cbData&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // size of value data 。数据SIZE<br>);<br>如：<br>// 写注册表。修改Version为1.0.12<br>// 写入CString类型的数据<br>CString strVersion = _T("Version");//要写入的键名称<br>LPCTSTR strVersionValue = "1.0.12";<br>long ret = ::RegSetValueEx(hKEY, strVersion, 0, REG_SZ, (const BYTE *) strVersionValue, strlen(strVersionValue)+1);<br>if(ret!=ERROR_SUCCESS)<br>{<br>&nbsp;AfxMessageBox("错误：无法查询有关的注册表信息");<br>&nbsp;return;<br>}<br>[/code]</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;4. 创建一个新键<br>LONG RegCreateKeyEx(<br>&nbsp; HKEY hKey,&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; // handle to open key。打开的注册表指针<br>&nbsp; LPCTSTR lpSubKey,&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; // subkey name。子键名称<br>&nbsp; DWORD Reserved,&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; // reserved。必须为0<br>&nbsp; LPTSTR lpClass,&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; // class string。已经存在时用，一般为NULL<br>&nbsp; DWORD dwOptions,&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; // special options<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //默认值REG_OPTION_VOLATILE，保存在注册表，下次开机仍然存在<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //REG_OPTION_VOLATILE，保存在内存<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //REG_OPTION_BACKUP_RESTORE<br>&nbsp; REGSAM samDesired,&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; // desired security access。操作权限。一般KEY_ALL_ACCESS，除非有特殊需要，请查阅MSDN<br>&nbsp; LPSECURITY_ATTRIBUTES lpSecurityAttributes, // inheritance。继承性。一般为NULL<br>&nbsp; PHKEY phkResult,&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; // key handle 。返回该键值镇。<br>&nbsp; LPDWORD lpdwDisposition&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // disposition value buffer<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //REG_CREATED_NEW_KEY The key did not exist and was created. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //REG_OPENED_EXISTING_KEY The key existed and was simply opened without being changed. </p>
<p>);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;5. 删除一个键<br>LONG RegDeleteKey(<br>&nbsp; HKEY hKey,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // handle to open key<br>&nbsp; LPCTSTR lpSubKey&nbsp;&nbsp; // subkey name<br>);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;6. 删除一个键值<br>LONG RegDeleteValue(<br>&nbsp; HKEY hKey,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // handle to key<br>&nbsp; LPCTSTR lpValueName&nbsp;&nbsp; // value name。值名称，不是打开的那个指针，是查询到的指针，如果为空RegSetValueEx创建的值将被删除<br>);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;7. 刷新注册表<br>LONG RegFlushKey(<br>&nbsp; HKEY hKey&nbsp;&nbsp; // handle to key to write。写入所有的值，在给定的指针<br>);</p>
<p>//这个函数是将改变数据直接写到硬盘上，不要频繁使用，会影响性能</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;8. &nbsp;导入一个注册表文件到指定的键下<br>LONG RegLoadKey(<br>&nbsp; HKEY hKey,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // handle to open key<br>&nbsp; LPCTSTR lpSubKey, // subkey name<br>&nbsp; LPCTSTR lpFile&nbsp;&nbsp;&nbsp; // registry file name<br>);</p>
<p>//没有用</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;9. 关闭打开的注册表<br>LONG RegCloseKey(<br>&nbsp; HKEY hKey&nbsp;&nbsp; // handle to key to close<br>);</p>
转载:<a title=http://blog.csdn.net/huangzhtao/archive/2008/08/04/2763638.aspx href="http://blog.csdn.net/huangzhtao/archive/2008/08/04/2763638.aspx">http://blog.csdn.net/huangzhtao/archive/2008/08/04/2763638.aspx</a>
<img src ="http://www.cppblog.com/dragon/aggbug/61113.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-09-06 13:01 <a href="http://www.cppblog.com/dragon/archive/2008/09/06/61113.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用C盘序列号进行软件注册</title><link>http://www.cppblog.com/dragon/archive/2008/09/06/61103.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Sat, 06 Sep 2008 03:41:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/09/06/61103.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/61103.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/09/06/61103.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/61103.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/61103.html</trackback:ping><description><![CDATA[<p>一个数据库系统的注册原理:<br>&nbsp;&nbsp;&nbsp; 在讨论这前先来了解一下异或运算的性质:<br>&nbsp;&nbsp;&nbsp; 若c=a^b;<br>&nbsp;&nbsp;&nbsp; 则a=c^b;b=a^c;</p>
<p>基本思路如下:<br>(1)int(用户C盘序列号^用户名^1234567890123)生成一个序列号N(是字符串CString类型);<br>(2)系统检测到你的软件还没注册就自动生成一个文件,文件保存了你输入的用户名和序列号&nbsp;&nbsp;&nbsp;&nbsp; N.公司会叫你EMail这个文件到他们公司邮箱,公司再返回一个注册码的!<br>(3)如果发回一个注册码,系统会判断 <span style="COLOR: #ff0000">用户名^用户C盘序列号 =注册码</span>?来进入系统的!注册成&nbsp;&nbsp; 功后再把用户名和注册码保存到系统文件(ini)中下次登陆就会检测这个文件,这次是判断&nbsp;&nbsp;&nbsp; <span style="COLOR: #ff0000">用户名^注册码=用户C盘序列号</span>? 来判断进入系统了!</p>
<p>&nbsp;</p>
<p>推理:<br>从上得到三条有用信息:<br>(1)用户名对于用户和公司来说都是已知的<br>(2)<span style="COLOR: red">int(用户C盘序列号^1234567890123)=N(经过Format变成字符串)</span><br>(3)<span style="COLOR: red">用户名^用户C盘序列号=注册码</span></p>
<p>从(1)和上面的异或性质推出:&nbsp; <span style="COLOR: red">atoi(N)^1234567890123=用户C盘序列号</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (3)<br>从(2)和异或性质推出:&nbsp; <span style="COLOR: red">注册码=用户C盘序列号^用户名</span>&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;&nbsp;&nbsp;(4)</p>
<p>从(3),(4)式再推出<br><span style="COLOR: red">注册码=atoi(N)^1234567890123^用户名</span><br>用户名和序列号N都发给了公司,公司就是利用这条公司进行求注册码!</p>
<p>理解了这个思路后我就写了个生成注册码的程序:<br>&nbsp;&nbsp;&nbsp; 就是逆运算吧了!假如我是那公司,发到我手上的信息已经有两个了,用户名和序列号N;这样,主要我用atoi(序列号)^1234567890123就可以求得注册码了,只不过在做的时候就是类型转换有点复杂吧了!!</p>
<p>为了便于复习把代码贴出来:</p>
<p>&nbsp;LPCTSTR lpRootPathName="C:\\";<br>&nbsp;LPTSTR lpVolumeNameBuffer=new char[12];<br>&nbsp;DWORD nVolumnNameSize=12;<br>&nbsp;DWORD MaximumComponentLength;<br>&nbsp;DWORD FileSystemFlags;<br>&nbsp;LPTSTR lpFileSystemNameBuffer=new char[10];<br>&nbsp;DWORD FileSystemNameLength=12;<br>&nbsp;GetVolumeInformation(lpRootPathName,lpVolumeNameBuffer,nVolumnNameSize,&amp;m_VolumnSerialNumber,&amp;MaximumComponentLength,&amp;FileSystemFlags,lpFileSystemNameBuffer,FileSystemNameLength);<br>&nbsp;delete(lpVolumeNameBuffer);<br>&nbsp;delete(lpFileSystemNameBuffer);</p>
<p>上面就是将C盘序列号放到DWORD类型的m_VolumnSerialNumber中!</p>
<p><br>sSerialNumber.Format("%d",m_VolumnSerialNumber^1234567890123);</p>
<p>生成的序列号就保存在sSerialNumber中!<br><span style="COLOR: red">int(用户C盘序列号^1234567890123)=N已经完成!</span></p>
<p><br>下面是 <span style="COLOR: #ff0000">用户名^用户C盘序列号=注册码<br></span>CString sName,sNameCode,sCode;&nbsp;<br>this-&gt;m_EdtUserName.GetWindowText(sName);<br>char * cNameCode=sName.GetBuffer(sName.GetLength());<br>DWORD dNameCode=*cNameCode;<br><span style="COLOR: #000000">sCode.Format("%d",m_VolumnSerialNumber^dNameCode);</span></p>
<p>sCode就保存了注册码!</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br>&nbsp;</p>
<img src ="http://www.cppblog.com/dragon/aggbug/61103.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-09-06 11:41 <a href="http://www.cppblog.com/dragon/archive/2008/09/06/61103.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在VC++中读写INI文件</title><link>http://www.cppblog.com/dragon/archive/2008/09/05/61071.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Fri, 05 Sep 2008 15:43:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/09/05/61071.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/61071.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/09/05/61071.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/61071.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/61071.html</trackback:ping><description><![CDATA[<div twffan="done">　　在我们写的程序当中,总有一些配置信息需要保存下来,以便完成程序的功能,最简单的办法就是将这些信息写入INI文件中,程序初始化时再读入.具体应用如下:<br><br>　　一.将信息写入.INI文件中.<br><br>　　1.所用的WINAPI函数原型为:<br><br>
<table width="100%" bgColor=#ffffff>
    <tbody>
        <tr>
            <td>BOOL WritePrivateProfileString(<br>LPCTSTR lpAppName,<br>LPCTSTR lpKeyName,<br>LPCTSTR lpString,<br>LPCTSTR lpFileName<br>);</td>
        </tr>
    </tbody>
</table>
<br>　　其中各参数的意义:<br><br>　　　LPCTSTR lpAppName 是INI文件中的一个字段名.<br><br>　　　LPCTSTR lpKeyName 是lpAppName下的一个键名,通俗讲就是变量名.<br><br>　　　LPCTSTR lpString 是键值,也就是变量的值,不过必须为LPCTSTR型或CString型的.<br><br>　　　LPCTSTR lpFileName 是完整的INI文件名.<br><br>　　2.具体使用方法:设现有一名学生,需把他的姓名和年龄写入 c:\stud\student.ini 文件中.<br><br>
<table width="100%" bgColor=#ffffff>
    <tbody>
        <tr>
            <td>CString strName,strTemp;<br>int nAge;<br>strName="张三";<br>nAge=12;<br>::WritePrivateProfileString("StudentInfo","Name",strName,"c:\\stud\\student.ini");</td>
        </tr>
    </tbody>
</table>
<br>　　此时c:\stud\student.ini文件中的内容如下:<br><br>　　　[StudentInfo]<br>　　　Name=张三<br><br>　　3.要将学生的年龄保存下来,只需将整型的值变为字符型即可:<br><br>
<table width="100%" bgColor=#ffffff>
    <tbody>
        <tr>
            <td>strTemp.Format("%d",nAge);<br>::WritePrivateProfileString("StudentInfo","Age",strTemp,"c:\\stud\\student.ini");</td>
        </tr>
    </tbody>
</table>
<br>　二.将信息从INI文件中读入程序中的变量.<br><br>　　1.所用的WINAPI函数原型为:<br><br>
<table width="100%" bgColor=#ffffff>
    <tbody>
        <tr>
            <td>DWORD GetPrivateProfileString(<br>LPCTSTR lpAppName,<br>LPCTSTR lpKeyName,<br>LPCTSTR lpDefault,<br>LPTSTR lpReturnedString,<br>DWORD nSize,<br>LPCTSTR lpFileName<br>);</td>
        </tr>
    </tbody>
</table>
<br>　　其中各参数的意义:<br><br>　　　前二个参数与 WritePrivateProfileString中的意义一样.<br><br>　　　lpDefault : 如果INI文件中没有前两个参数指定的字段名或键名,则将此值赋给变量.<br><br>　　　lpReturnedString : 接收INI文件中的值的CString对象,即目的缓存器.<br><br>　　　nSize : 目的缓存器的大小.<br><br>　　　lpFileName : 是完整的INI文件名.<br><br>　　2.具体使用方法:现要将上一步中写入的学生的信息读入程序中.<br><br>
<table width="100%" bgColor=#ffffff>
    <tbody>
        <tr>
            <td>CString strStudName;<br>int nStudAge;<br>GetPrivateProfileString("StudentInfo","Name","默认姓名",strStudName.GetBuffer(MAX_PATH),MAX_PATH,"c:\\stud\\student.ini");</td>
        </tr>
    </tbody>
</table>
<br>　　执行后 strStudName 的值为:"张三",若前两个参数有误,其值为:"默认姓名".<br><br>　　3.读入整型值要用另一个WINAPI函数:<br><br>
<table width="100%" bgColor=#ffffff>
    <tbody>
        <tr>
            <td>UINT GetPrivateProfileInt(<br>LPCTSTR lpAppName,<br>LPCTSTR lpKeyName,<br>INT nDefault,<br>LPCTSTR lpFileName<br>);</td>
        </tr>
    </tbody>
</table>
<br>　　这里的参数意义与上相同.使用方法如下:<br><br>
<table width="100%" bgColor=#ffffff>
    <tbody>
        <tr>
            <td>nStudAge=GetPrivateProfileInt("StudentInfo","Age",10,"c:\\stud\\student.ini");</td>
        </tr>
    </tbody>
</table>
<br><br>　三.循环写入多个值,设现有一程序,要将最近使用的几个文件名保存下来,具体程序如下:<br><br>　　1.写入:<br><br>
<table width="100%" bgColor=#ffffff>
    <tbody>
        <tr>
            <td>CString strTemp,strTempA;<br>int i;<br>int nCount=6;<br>file://共有6个文件名需要保存<br>for(i=0;i<br>{strTemp.Format("%d",i);<br>strTempA=文件名;<br>file://文件名可以从数组,列表框等处取得.<br>::WritePrivateProfileString("UseFileName","FileName"+strTemp,strTempA,<br>"c:\\usefile\\usefile.ini");<br>}<br>strTemp.Format("%d",nCount);<br>::WritePrivateProfileString("FileCount","Count",strTemp,"c:\\usefile\\usefile.ini");<br>file://将文件总数写入,以便读出.</td>
        </tr>
    </tbody>
</table>
<br>　　2.读出:<br><br>
<table width="100%" bgColor=#ffffff>
    <tbody>
        <tr>
            <td>nCount=::GetPrivateProfileInt("FileCount","Count",0,"c:\\usefile\\usefile.ini");<br>for(i=0;i<br>{strTemp.Format("%d",i);<br>strTemp="FileName"+strTemp;<br>::GetPrivateProfileString("CurrentIni",strTemp,"default.fil", strTempA.GetBuffer(MAX_PATH),MAX_PATH,"c:\\usefile\\usefile.ini");<br><br>file://使用strTempA中的内容.<br><br>}</td>
        </tr>
    </tbody>
</table>
<br>　　补充四点:<br><br>　　　1.INI文件的路径必须完整,文件名前面的各级目录必须存在,否则写入不成功,该函数返回 FALSE 值.<br><br>　　　2.文件名的路径中必须为 \\ ,因为在VC++中, \\ 才表示一个 \ .<br><br>　　　3.也可将INI文件放在程序所在目录,此时 lpFileName 参数为: ".\\student.ini".<br><br>　　　4.从网页中粘贴源代码时,最好先粘贴至记事本中,再往VC中粘贴,否则易造成编译错误,开始时我也十分不解,好好的代码怎么就不对呢?后来才找到这个方法.还有一些代码中使用了全角字符如:＜，＼等,也会<br>造成编译错误.<br><br>转:<a title=http://blog.csdn.net/paobo/archive/2007/05/14/1607733.aspx href="http://blog.csdn.net/paobo/archive/2007/05/14/1607733.aspx">http://blog.csdn.net/paobo/archive/2007/05/14/1607733.aspx<br></a></div>
<img src ="http://www.cppblog.com/dragon/aggbug/61071.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-09-05 23:43 <a href="http://www.cppblog.com/dragon/archive/2008/09/05/61071.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PreTranslateMessage</title><link>http://www.cppblog.com/dragon/archive/2008/09/05/61069.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Fri, 05 Sep 2008 15:30:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/09/05/61069.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/61069.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/09/05/61069.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/61069.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/61069.html</trackback:ping><description><![CDATA[<p>PreTranslateMessage的理解:<br>&nbsp;&nbsp;&nbsp; PreTranslateMessage只能处理消息队列中的消息,也就是由PostMessage发出的消息/鼠标键盘消息等.<br>&nbsp;&nbsp;&nbsp; SendMessage发送的消息并不放在消息队列中,而是直接调用处理函数进行处理,所以这种消息用PreTranslateMessage的捕获不到的,如WM_KIllFOCUS和WM_SETFOCUS.<br>&nbsp;&nbsp;&nbsp; SendMessage的消息是直接执行处理函数的,它要等消息执行完才返回(执行完SendMessage函数);而PostMessage则把消息发送后立即返回,把消息挂到消息队列中等待执行,所以以下的程序是错的!!<br>#include &lt;windows.h&gt;<br>int main()<br>{<br>&nbsp; PostMessage(HWND_BROADCAST,WM_QUIT,0,0);<br>&nbsp; return 0;<br>}</p>
<p>PostMessage将消息WM_QUIT发送到消息队列中,由于PostMessage的立即返回(即结束)就执行下一句语句结束整个程序,消息还挂在消息队列中未处理故出错!!</p>
<img src ="http://www.cppblog.com/dragon/aggbug/61069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-09-05 23:30 <a href="http://www.cppblog.com/dragon/archive/2008/09/05/61069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我对VC中用extern的一个经历</title><link>http://www.cppblog.com/dragon/archive/2008/09/05/60997.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Fri, 05 Sep 2008 07:25:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/09/05/60997.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/60997.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/09/05/60997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/60997.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/60997.html</trackback:ping><description><![CDATA[我对VC中用extern的一个经历:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我在CXXApp theApp的旁边加了一个布尔类型的全局变量,如下:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CXXApp theApp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool p_Try;<br>然后我在其它的对话中调用就出错了,无法识别p_Try,后来也是无意中看到了在某个头文件中看到了extern bool p_Try;而这个头文件就是定义CXXApp类的文件,这个头文件基本上都包含在其它文件中(除了一些自己定义的).<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以看出添加了bool p_Try;还要经过extern bool p_Try才可以调用该变量.最后上网查了,extern bool p_Try只不过是一个声明吧了,所以我们在调用全局变量时要事先用extern告诉调用者这个是全局变量!有这样的变量存在!<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所以bool p_Try;只能用一次,是定义!<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extern bool p_Try;可以用多次!是声明!
<img src ="http://www.cppblog.com/dragon/aggbug/60997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-09-05 15:25 <a href="http://www.cppblog.com/dragon/archive/2008/09/05/60997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CFileDialog文件选择对话框的使用</title><link>http://www.cppblog.com/dragon/archive/2008/09/03/60865.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Wed, 03 Sep 2008 15:37:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/09/03/60865.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/60865.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/09/03/60865.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/60865.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/60865.html</trackback:ping><description><![CDATA[<p><strong>CFileDialog文件选择对话框的使用</strong>：首先构造一个对象并提供相应的参数，构造函数原型如下：<br>CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );参数意义如下： </p>
<ul>
    <li>bOpenFileDialog 为TRUE则显示打开对话框，为FALSE则显示保存对话文件对话框。
    <li>lpszDefExt 指定默认的文件扩展名。
    <li>lpszFileName 指定默认的文件名。
    <li>dwFlags 指明一些特定风格。
    <li>lpszFilter 是最重要的一个参数，它指明可供选择的文件类型和相应的扩展名。参数格式如： <br>"Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";文件类型说明和扩展名间用 | 分隔，同种类型文件的扩展名间可以用 ; 分割，每种文件类型间用 | 分隔，末尾用 || 指明。
    <li>pParentWnd 为父窗口指针。 </li>
</ul>
创建文件对话框可以使用DoModal()，在返回后可以利用下面的函数得到用户选择：
<ul>
    <li>CString CFileDialog::GetPathName( ) 得到完整的文件名，包括目录名和扩展名如：c:\test\test1.txt
    <li>CString CFileDialog::GetFileName( ) 得到完整的文件名，包括扩展名如：test1.txt
    <li>CString CFileDialog::GetExtName( ) 得到完整的文件扩展名，如：txt
    <li>CString CFileDialog::GetFileTitle ( ) 得到完整的文件名，不包括目录名和扩展名如：test1
    <li>POSITION CFileDialog::GetStartPosition( ) 对于选择了多个文件的情况得到第一个文件位置。
    <li>CString CFileDialog::GetNextPathName( POSITION&amp; pos ) 对于选择了多个文件的情况得到下一个文件位置，并同时返回当前文件名。但必须已经调用过POSITION CFileDialog::GetStartPosition( )来得到最初的POSITION变量。 </li>
</ul>
<p>&nbsp;</p>
<p><strong>&nbsp;[一些小心得]</strong></p>
<p>例:<br>CFileDialog GetFile(TRUE,NULL,NULL,OFN_FILEMUSTEXIST,"Microsoft Excel(*.xls)|*.xls|All Files(*.*)|*.*||");</p>
<p>CFileDialog GetFile(打开文件对话框(TRUE),扩展名(NULL),文件名(NULL),风格-文件必须存在(OFN_FILEMUSTEXIST),查看文件类型-EXCEL文件,所有文件(Microsoft Excel(*.xls)|*.xls|All Files(*.*)|*.*||);</p>
<p>风格的宏定义</p>
<p>#define OFN_READONLY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00000001<br>#define OFN_OVERWRITEPROMPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00000002<br>#define OFN_HIDEREADONLY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00000004<br>#define OFN_NOCHANGEDIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00000008<br>#define OFN_SHOWHELP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00000010<br>#define OFN_ENABLEHOOK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00000020<br>#define OFN_ENABLETEMPLATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00000040<br>#define OFN_ENABLETEMPLATEHANDLE&nbsp;&nbsp;&nbsp;&nbsp; 0x00000080<br>#define OFN_NOVALIDATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00000100<br>#define OFN_ALLOWMULTISELECT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00000200<br>#define OFN_EXTENSIONDIFFERENT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00000400<br>#define OFN_PATHMUSTEXIST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00000800<br>#define OFN_FILEMUSTEXIST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00001000<br>#define OFN_CREATEPROMPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00002000<br>#define OFN_SHAREAWARE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00004000<br>#define OFN_NOREADONLYRETURN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00008000<br>#define OFN_NOTESTFILECREATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00010000<br>#define OFN_NONETWORKBUTTON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00020000<br>#define OFN_NOLONGNAMES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00040000&nbsp;&nbsp;&nbsp;&nbsp; // force no long names for 4.x modules<br>#if(WINVER &gt;= 0x0400)<br>#define OFN_EXPLORER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00080000&nbsp;&nbsp;&nbsp;&nbsp; // new look commdlg<br>#define OFN_NODEREFERENCELINKS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00100000<br>#define OFN_LONGNAMES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00200000&nbsp;&nbsp;&nbsp;&nbsp; // force long names for 3.x modules<br>#define OFN_ENABLEINCLUDENOTIFY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00400000&nbsp;&nbsp;&nbsp;&nbsp; // send include message to callback<br>#define OFN_ENABLESIZING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00800000<br>#endif /* WINVER &gt;= 0x0400 */<br>#if (_WIN32_WINNT &gt;= 0x0500)<br>#define OFN_DONTADDTORECENT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x02000000<br>#define OFN_FORCESHOWHIDDEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x10000000&nbsp;&nbsp;&nbsp; // Show All files including System and hidden files<br>#endif // (_WIN32_WINNT &gt;= 0x0500)</p>
<p>这个就不解释了,应该都能看懂吧</p>
<p><strong>需要注意的是,用了CFileDialog之后,会把程序的当前路径设置成选中文件的路径<br>所以,如果程序里有用到IO访问或者数据库访问之类的本地操作时,需要注意你的当前路径<br>用相对路径的话就不是原来你的程序路径了,切记!<br>转载自:<a title=http://blog.csdn.net/beiouwolf/archive/2007/04/09/1557219.aspx href="http://blog.csdn.net/beiouwolf/archive/2007/04/09/1557219.aspx">http://blog.csdn.net/beiouwolf/archive/2007/04/09/1557219.aspx</a></strong></p>
<img src ="http://www.cppblog.com/dragon/aggbug/60865.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-09-03 23:37 <a href="http://www.cppblog.com/dragon/archive/2008/09/03/60865.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序进入之前的一个画面</title><link>http://www.cppblog.com/dragon/archive/2008/09/03/60810.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Wed, 03 Sep 2008 06:00:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/09/03/60810.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/60810.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/09/03/60810.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/60810.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/60810.html</trackback:ping><description><![CDATA[<p>在进入一个系统前往往先显示一张图片,然后到图片消息,再进入登陆界面的.<br>其中做法如下:<br>(1)先创建一个无边框的对话框.插入一个对话框,然后右击设置"属性",在"样式"属性页选择<br>&nbsp;&nbsp; 无边框,"样式"设置为"弹出".</p>
<p>(2)然后我们要做的是看看加载位图的图片大小,拉一个随便大小的"图像"控件,右击属性,在<br>&nbsp;&nbsp; "常规"属性页的"类型"中选择"位图";然后"图像"选择你要加载的位图ID(这个位图资源事 </p>
<p>&nbsp; 先插入到工程中),然后关闭属性对话框,就可以在最右下角中显示你的图片大小了!</p>
<p>(3)因为这样没办法调整图片覆盖整个对话框,我就把这个图片控件删除掉,再事先把对话框调 </p>
<p>&nbsp; 整大小到刚刚图片的大小,调整的方法是边拖边看最右下方的显示,调整到是图片的大小为&nbsp; </p>
<p>&nbsp;止.好啦,对话框调整后,我拉出一个"图片"控件,注意,这次我们要从对话框的最左上角一&nbsp;&nbsp; </p>
<p>直拉到对话框的最右下角才行,这才能确保图片整个覆盖.拉出来后,就按照刚刚的做法把&nbsp;&nbsp; </p>
<p>位图加载进来,看看效果!</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 来说说先弹出后消失的实现,为该话框创建一个新类,为这个类添加OnInitDialog()函数</p>
<p>和OnTimer()函数,代码如下:<br>void CDBegin::OnTimer(UINT nIDEvent) <br>{<br>&nbsp;CDialog::OnTimer(nIDEvent);<br>&nbsp;this-&gt;KillTimer(1);<br>&nbsp;this-&gt;OnCancel();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //下面是对话框消失后要做的工作!</p>
<p>}</p>
<p>BOOL CDBegin::OnInitDialog() <br>{<br>&nbsp;CDialog::OnInitDialog();<br>&nbsp;this-&gt;SetTimer(1,1400,NULL);&nbsp;<br>&nbsp;return TRUE;&nbsp; // return TRUE unless you set the focus to a control<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // EXCEPTION: OCX Property Pages should return FALSE<br>}</p>
<p>最后在调用此对话框的类中添加头文件即可!!(记得要添加)</p>
<img src ="http://www.cppblog.com/dragon/aggbug/60810.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-09-03 14:00 <a href="http://www.cppblog.com/dragon/archive/2008/09/03/60810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>真彩位图工具栏的实现</title><link>http://www.cppblog.com/dragon/archive/2008/09/03/60799.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Wed, 03 Sep 2008 03:33:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/09/03/60799.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/60799.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/09/03/60799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/60799.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/60799.html</trackback:ping><description><![CDATA[VC++6.0直接支持256色工具栏的编辑和使用，若想建立真彩（24位位图）工具栏，必须借助其它绘图工具绘制工具栏位图。
<p>制作真彩工具栏的主要步骤：</p>
<p><span class=t2 twffan="done"><font color=#000099>①用绘图工具（我用的是Fireworks）制作三张24位位图。</font></span>其中：</p>
<p>30.bmp为工具可用时显示的位图：</p>
<p><img height=20 src="http://www.bttc.cn/jsj/Html/vc/wen/image/30.gif" width=280 twffan="done"></p>
<p>31.bmp为工具不可用（变灰）时显示的位图：</p>
<p><img height=20 src="http://www.bttc.cn/jsj/Html/vc/wen/image/31.gif" width=280 twffan="done"></p>
<p>32.bmp为鼠标进入工具按钮时显示的位图：</p>
<p><img height=20 src="http://www.bttc.cn/jsj/Html/vc/wen/image/32.gif" width=280 twffan="done"></p>
<p>这里，每张位图中按钮的个数和大小可根据实际应用进行修改，本例中，每张位图有14个按钮，每个按钮大小为20&#215;20。</p>
<p>这个制作过程是比较繁琐的，首先我把找来的小图片转换成24位位图，在Fireworks下把它转换为20&#215;20的大小后保存，再用Fireworks把它转换为灰色位图和带边框的位图并分别保存。然后再把三组小图片分别拼接起来就行了。</p>
<p><span class=t2 twffan="done"><font color=#000099>②把三个位图导入资源（作为Bitmap资源）</font></span>，尽管在VC++下不能显示和编辑，但使用上没有问题。把三个位图的ID依次改为：<br>IDB_TOOLBARCOLOR、IDB_TOOLBARDISABLE、IDB_TOOLBARHOT</p>
<p><span class=t2 twffan="done"><font color=#000099>③在资源的工具栏项目中添加一个新的工具栏</font></span>（如图），ID改为IDR_TOOLBAR，工具按钮的宽度和高度都改为20。在上面依次添加14个按钮并分好组，按钮上的内容无关紧要，只要不是空的就行了。删除系统原来的工具栏IDR_MAINFRAME。</p>
<p><img height=20 src="http://www.bttc.cn/jsj/Html/vc/wen/image/33.gif" width=280 twffan="done"></p>
<p>这个工具栏在显示时，我们会用上面的位图替换各按钮。</p>
<p class=t2>④在MainFrm.h中定义三个位图列表对象和一个函数定义：</p>
<table class=codebk borderColor=#cccccc cellSpacing=0 cellPadding=10 width="85%" align=center border=1>
    <tbody>
        <tr>
            <td><font color=#000099><span class=t2 twffan="done">MainFrm.h：</span><br><br></font>CImageList&nbsp;&nbsp;&nbsp;&nbsp;m_imageToolBar;<br>CImageList&nbsp;&nbsp;&nbsp;&nbsp;m_imageToolBarDisable;<br>CImageList&nbsp;&nbsp;&nbsp;&nbsp;m_imageToolBarHot;<br>void InitToolBar(); </td>
        </tr>
    </tbody>
</table>
<p class=t2>⑤在MainFrm.cpp中修改工具栏的设置部分：</p>
<table class=codebk borderColor=#cccccc cellSpacing=0 cellPadding=10 width="85%" align=center border=1>
    <tbody>
        <tr>
            <td><font color=#000099><span class=t2 twffan="done">MainFrm.cpp：</span><br><br></font>if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP<br>&nbsp;&nbsp;&nbsp;&nbsp;| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||<br>&nbsp;&nbsp;&nbsp;&nbsp;!m_wndToolBar.LoadToolBar( IDR_TOOLBAR ))&nbsp;&nbsp;<font size=2><span class=t3 twffan="done">//指定工具栏ID号</span><br></font>{<br>&nbsp;&nbsp;&nbsp;&nbsp;TRACE0("Failed to create toolbar\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;return -1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// fail to create<br>}<br>InitToolBar();&nbsp;&nbsp;&nbsp;&nbsp;<span class=t3 twffan="done"><font size=2>//设置真彩工具栏</font></span> </td>
        </tr>
    </tbody>
</table>
<p>这里要把原工具栏的ID（IDR_MAINFRAME）修改为新工具栏的ID（IDR_TOOLBAR），再调用函数InitToolBar()设置新工具栏。</p>
<p class=t2>⑥添加设置工具栏的函数InitToolBar()：</p>
<table class=codebk borderColor=#cccccc cellSpacing=0 cellPadding=10 width="90%" align=center border=1>
    <tbody>
        <tr>
            <td>void&nbsp;CMainFrame::InitToolBar()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;CBitmap&nbsp;bm;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<font size=2><span class=t3 twffan="done">//活动的工具</span><br></font>&nbsp;&nbsp;&nbsp;&nbsp;m_imageToolBar.Create(&nbsp;20,&nbsp;20,&nbsp;TRUE&nbsp;|&nbsp;ILC_COLOR24,&nbsp;11,&nbsp;0&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;bm.LoadBitmap(&nbsp;IDB_TOOLBARCOLOR&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;m_imageToolBar.Add(&nbsp;&amp;bm,(CBitmap*)NULL&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;bm.Detach();<br>&nbsp;&nbsp;&nbsp;&nbsp;m_wndToolBar.GetToolBarCtrl().SetImageList(&nbsp;&amp;m_imageToolBar&nbsp;);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<font size=2><span class=t3 twffan="done">//禁止的工具</span><br></font>&nbsp;&nbsp;&nbsp;&nbsp;m_imageToolBarDisable.Create(&nbsp;20,&nbsp;20,&nbsp;TRUE&nbsp;|&nbsp;ILC_COLOR24,&nbsp;11,&nbsp;0&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;bm.LoadBitmap(&nbsp;IDB_TOOLBARDISABLE&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;m_imageToolBarDisable.Add(&nbsp;&amp;bm,(CBitmap*)NULL&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;bm.Detach();<br>&nbsp;&nbsp;&nbsp;&nbsp;m_wndToolBar.GetToolBarCtrl().SetDisabledImageList(&nbsp;&amp;m_imageToolBarDisable&nbsp;);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<font size=2><span class=t3 twffan="done">//当前的工具</span><br></font>&nbsp;&nbsp;&nbsp;&nbsp;m_imageToolBarHot.Create(&nbsp;20,&nbsp;20,&nbsp;TRUE&nbsp;|&nbsp;ILC_COLOR24,&nbsp;11,&nbsp;0&nbsp;);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;bm.LoadBitmap(&nbsp;IDB_TOOLBARHOT&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;m_imageToolBarHot.Add(&nbsp;&amp;bm,(CBitmap*)NULL&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;bm.Detach();<br>&nbsp;&nbsp;&nbsp;&nbsp;m_wndToolBar.GetToolBarCtrl().SetHotImageList(&nbsp;&amp;m_imageToolBarHot&nbsp;);<br>} </td>
        </tr>
    </tbody>
</table>
<p>其中在Create()函数中的参数依次为按钮宽度、高度、24位位图和按钮个数。</p>
<p>这样一个用24位位图组成的真彩工具栏就做好了，如果你的绘图能力很强，可以修改32.bmp，使按钮具有很好的动感。至于各按钮的响应方法与普通工具栏是一样的。</p>
<p align=center>示例程序界面：<br><img height=400 alt="" src="http://www.cppblog.com/images/cppblog_com/dragon/W051003-1.gif" width=500 border=0 twffan="done"></p>
<p align=left>转载自:<a title=http://www.bttc.cn/jsj/Html/vc/wen/vcwen08.htm href="http://www.bttc.cn/jsj/Html/vc/wen/vcwen08.htm">http://www.bttc.cn/jsj/Html/vc/wen/vcwen08.htm</a></p>
<img src ="http://www.cppblog.com/dragon/aggbug/60799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-09-03 11:33 <a href="http://www.cppblog.com/dragon/archive/2008/09/03/60799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设备坐标和逻辑坐标</title><link>http://www.cppblog.com/dragon/archive/2008/09/02/60766.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Tue, 02 Sep 2008 12:30:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/09/02/60766.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/60766.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/09/02/60766.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/60766.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/60766.html</trackback:ping><description><![CDATA[<p>设备坐标：一个实际物理屏幕是由像素组成的如平常所说的640&#215;480，1024 &#215;768指的就是显示器的实际宽度和高度的像素数目。 <br>VC++绘图有好几种模式，默认情况下是MM_TEXT，在此模式下绘图就是设备坐标，因为它的单位是像素！ </p>
<p>客户坐标：是指在客户区的坐标系，客户==你！哈哈你定义的坐标系。可以在现有的绘图映像模式下通过坐标变换的到你的坐标系。如你在一个映像模式坐标系下的客户坐标原点为（x，y），那客户坐标系的坐标换算成映像模式坐标就行了，数学问题多说了！哈哈 <br>感觉你应该问逻辑坐标，逻辑坐标不以屏幕的像素个数为标准。在屏幕上是多长实际就是多长。MM_LOMETRIC，MM_HIMETRIC等映像模式 </p>
<p>映像识别码 逻辑单位 X和Y轴正向 <br>MM_TEXT 1 Pixels(像素) 右下 <br>MM_LOMETRIC 2 0.1mm 右上 <br>MM_HIMETRIC 3 0.01mm 右上 <br>MM_LONGLISH 4 0.1inch 右上 <br>MM_HIENGLISH 5 0.01inch 右上 <br>MM_TWIPS 6 1/1440inch 右上 <br>MM_ISOTROPIC 7 Variable(x==y) 变化的 <br>MM_ANISOTROPIC 8 Variable(x&lt;&gt;y) 变化的 <br>原点 都在左上角</p>
<img src ="http://www.cppblog.com/dragon/aggbug/60766.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-09-02 20:30 <a href="http://www.cppblog.com/dragon/archive/2008/09/02/60766.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>没有ActiveMovieControl Object这个控件</title><link>http://www.cppblog.com/dragon/archive/2008/09/02/60762.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Tue, 02 Sep 2008 12:20:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/09/02/60762.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/60762.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/09/02/60762.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/60762.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/60762.html</trackback:ping><description><![CDATA[在VC里没有ActiveMovieControl Object这个控件<br>"开始"-&gt;"运行"-&gt;"输入regsvr32 msdxm.ocx"-&gt;"确定"<br>会弹出一个对话框说成功的!!
<img src ="http://www.cppblog.com/dragon/aggbug/60762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-09-02 20:20 <a href="http://www.cppblog.com/dragon/archive/2008/09/02/60762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>判断一个CString是否为空</title><link>http://www.cppblog.com/dragon/archive/2008/09/02/60755.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Tue, 02 Sep 2008 12:02:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/09/02/60755.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/60755.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/09/02/60755.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/60755.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/60755.html</trackback:ping><description><![CDATA[用GetLength()&lt;=0好,还是==""好?<br>CString str;<br>str += '\0';<br>int len = str.GetLength();<br>得到len=1;<br>但str=="", 返回的是true;<br>因为真正比较的时候只是单纯的逐个字符比较, '\0'作为结束符.<br>CString str2;<br>str==str2返回也是true, 因为str2被隐式转换为LPTCSTR, 比较也是一样的.<br>所以说应避免str += '\0'这样的写法.<br>在CString的使用过程中应该忘记'\0'的存在?<br>但声明一个char str[]; 必须memset(...)为0值,不然麻烦多.
<img src ="http://www.cppblog.com/dragon/aggbug/60755.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-09-02 20:02 <a href="http://www.cppblog.com/dragon/archive/2008/09/02/60755.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>个人对消息映射的一点理解</title><link>http://www.cppblog.com/dragon/archive/2008/09/02/60754.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Tue, 02 Sep 2008 11:59:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/09/02/60754.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/60754.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/09/02/60754.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/60754.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/60754.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这是一篇自己理解所写的文章，若我有哪些地方理解不正确的，请指出，不想误导读者。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在可视化的消息中，我们会发现他三个地方加了代码，但有的不同，在头文件中加的不是afx_msg开头，而用virtual,如OnOK<br>函数。一般加的代码的步骤是：<br>1.在头文件中加心afx_msg 开头的函数声明.<br>2.在实现文件的BEGIN_MESSAGE_MAP和END_MESSAGE_MAP()之间加ON_WM_或ON_MESSAGE的代码<br>3.最后还是在实现文件里加函数的实现</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但我还是有点不理解,最后想自己写一个自定义的消息映射程序,虽然没有写出来,但还是根据这些来猜这机制的执行原理,这些<br>程序都是上网查到的,<br>1.在头文件加:<br>&nbsp; #define WM_MYMSG&nbsp; WM_USER+5//自定义一个消息<br>&nbsp; afx_msg void OnMyMessage(WPARAM wParam, LPARAM lParam); //自定义消息的处理函数声明</p>
<p><br>2.在实现文件里加:<br>&nbsp; ON_MESSAGE(WM_MYMSG, OnMyMessage)<br>&nbsp; //利用ON_MESSAGE()宏在自定义消息与其处理函数间建立映射关系</p>
<p><br>void CModelessDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)<br>//从lParam中取出CString对象的指针,并将字符串内容在IDC_MSGEDIT中显示出来<br>{</p>
<p>&nbsp;&nbsp;&nbsp; CString *str;<br>&nbsp;&nbsp;&nbsp; str=(CString *)lParam;</p>
<p>&nbsp;&nbsp;&nbsp; SetDlgItemText(IDC_EDIT,*str);<br>}</p>
<p><br>void CModelessDlg::OnMsgBTN() <br>{</p>
<p>&nbsp;CString str= "自定义消息被触发了！";</p>
<p>&nbsp;SendMessage(WM_MYMSG, 0, (LPARAM) &amp;str);<br>&nbsp;//给ModelessDlg自己发一个自定义的消息<br>}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我的理解:它是根据WM_MYMSG来确定参数的值的(wParam,lParam),对于每一个消息操作函数来确定他的参数的,这里的SendMessage函数把WM_MYMSG与(wParam)0和(lParam)&amp;str捆绑在一起了,所以,在我们用消息处理函数OnMyMessage()时,我们若要用到参数时我们就可以用这两个参数,在这的参数位置应该不可以改变的吧,我猜的.<br>后来看到一本书，自定义的消息函数一般带wParam,lParam这两个参数，加下面一段代码增加理解：<br><br>暂时理解消息函数是通过消息(WM_)对应的参数(wParam.lParam).</p>
<p>BOOL CServerDlg::PreTranslateMessage(MSG* pMsg) <br>{<br>&nbsp;if (pMsg-&gt;message == WM_SOCKET)<br>&nbsp;{<br>&nbsp; m_sockCur = pMsg-&gt;wParam;<br>&nbsp; m_nCurMsg = pMsg-&gt;lParam;<br>&nbsp;}<br>&nbsp;return CDialog::PreTranslateMessage(pMsg);<br>}<br>通过WM_SOCKET关联 pMsg-&gt;wParam和pMsg-&gt;lParam。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但当我在用WSAAsyncSelect函数时没有看到他的消息参数(假如在这里是WM_SOCKET_READ)未与一些参数关联在一起,而且这个参数还是我自定义的,不是系统本身有的,它是用来接收消息的参数的,后来我查MSDN时发现他的描述是这样的:<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; When one of the nominated network events occurs on the specified socket s, the application's window hWnd receives message wMsg. The wParam parameter identifies the socket on which a network event has occurred. The low word of lParam specifies the network event that has occurred. The high word of lParam contains any error code. The error code be any error as defined in Winsock2.h.</p>
<p>Note&nbsp; Upon receipt of an event notification message, the WSAGetLastError function cannot be used to check the error value because the error value returned can differ from the value in the high word of lParam.</p>
<p>The error and event codes can be extracted from the lParam using the macros WSAGETSELECTERROR and WSAGETSELECTEVENT, defined in Winsock2.h as:</p>
<p>#define WSAGETSELECTERROR(lParam)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HIWORD(lParam)<br>#define WSAGETSELECTEVENT(lParam)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOWORD(lParam)<br><br>&nbsp;&nbsp;&nbsp; 当一个指定的网络事件发生在指定的套接字s上时,应用程序的窗口句柄接收到一条消息wMsg,wParam识别网络事件发生在哪一个套接字上,lParam的低字段则指定发生的网络事件,高字段包括任意的错误代码,错误代码在Winsock2.h文件中定义.<br>&nbsp;&nbsp;&nbsp; 这事件和错误可以从lParam通过调用宏WSAGETSELECTERROR 和 WSAGETSELECTEVENT提取,在Winsock2.h文件中定义为:<br>&nbsp;&nbsp;&nbsp; #define WSAGETSELECTERROR(lParam)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HIWORD(lParam)<br>&nbsp;&nbsp;&nbsp; #define WSAGETSELECTEVENT(lParam)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOWORD(lParam)</p>
<p><br>可以看出WSAAsyncSelect收到的参数还是在其它地方作过关联的,不然它也不会有值(wParam,lParam),这是我的推理,未证实.<br>&nbsp;&nbsp;&nbsp; <br>typedef UINT WPARAM;(wParam的类型，w表示WORD)<br>typedef LONG LPARAM;(lParam的类型,l表示LONG)</p>
<img src ="http://www.cppblog.com/dragon/aggbug/60754.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-09-02 19:59 <a href="http://www.cppblog.com/dragon/archive/2008/09/02/60754.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有些控件关联变量的创建</title><link>http://www.cppblog.com/dragon/archive/2008/09/02/60745.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Tue, 02 Sep 2008 11:35:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/09/02/60745.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/60745.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/09/02/60745.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/60745.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/60745.html</trackback:ping><description><![CDATA[有些控件关联变量的创建：<br>&nbsp;&nbsp;&nbsp; 当你拉出一个单选框后,在类向导里是不能看到它的ID的,只要把属性里的&#8220;组&#8221;勾选就可以在类向导里看到ID了。<br>&nbsp;&nbsp;&nbsp; 还有的是"静态文本",要把IDC_STATI改过才可以在类向导里创建关联变量!!
<img src ="http://www.cppblog.com/dragon/aggbug/60745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-09-02 19:35 <a href="http://www.cppblog.com/dragon/archive/2008/09/02/60745.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在MFC中全局函数的添加可以这样</title><link>http://www.cppblog.com/dragon/archive/2008/09/02/60744.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Tue, 02 Sep 2008 11:30:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/09/02/60744.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/60744.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/09/02/60744.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/60744.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/60744.html</trackback:ping><description><![CDATA[<p>在MFC中全局函数的添加可以这样：<br>&nbsp;&nbsp; 先创建一个头文件，专放函数的声明，然后再创建一个实现文件(CPP),专放函数的实现.<br>如我今天所创建的如下:<br>头文件:<br>#include "stdafx.h"//注意要加这个<br>unsigned int HashOf(CString Str);<br>//加密<br>CString Encrypt(CString Str);<br>//解密<br>CString UnEncrypt(CString Str);</p>
<p>实现文件:<br>#include "stdafx.h"//注意也要加这个<br>#include "Security.h"<br>unsigned int HashOf(CString Str)<br>{<br>&nbsp;int i, key;<br>&nbsp;key = 0;<br>&nbsp;for(i = 0; i &lt; Str.GetLength(); i++)<br>&nbsp;{<br>&nbsp;&nbsp;key = ((key &lt;&lt; 2) | (key &gt;&gt; 30))^(Str.GetAt(i));<br>&nbsp;}<br>&nbsp;return key;<br>};<br>//加密<br>CString Encrypt(CString Str)<br>{<br>&nbsp;return Str;<br>}<br>//解密<br>CString UnEncrypt(CString Str)<br>{<br>&nbsp;return Str;<br>}</p>
<p>创建之后,记得在要用到这些函数的文件中包含这些文件.</p>
<img src ="http://www.cppblog.com/dragon/aggbug/60744.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-09-02 19:30 <a href="http://www.cppblog.com/dragon/archive/2008/09/02/60744.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>怎样完全删除一个类</title><link>http://www.cppblog.com/dragon/archive/2008/09/02/60741.html</link><dc:creator>Dragon</dc:creator><author>Dragon</author><pubDate>Tue, 02 Sep 2008 11:24:00 GMT</pubDate><guid>http://www.cppblog.com/dragon/archive/2008/09/02/60741.html</guid><wfw:comment>http://www.cppblog.com/dragon/comments/60741.html</wfw:comment><comments>http://www.cppblog.com/dragon/archive/2008/09/02/60741.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dragon/comments/commentRss/60741.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dragon/services/trackbacks/60741.html</trackback:ping><description><![CDATA[怎样完全删除一个类：<br>1.在File view下删除你要删除的CPP和H文件,然后打开工程文件夹,删除里面对应的CPP和H文件.<br>2.再次打开工程,然后点查看-&gt;类向导,它会提示你要删除什么的,你按确定Remove就行了.
<img src ="http://www.cppblog.com/dragon/aggbug/60741.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dragon/" target="_blank">Dragon</a> 2008-09-02 19:24 <a href="http://www.cppblog.com/dragon/archive/2008/09/02/60741.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>