??xml version="1.0" encoding="utf-8" standalone="yes"?>久久亚洲中文字幕精品有坂深雪,99久久国产免费福利,热99RE久久精品这里都是精品免费 http://www.shnenglu.com/dragon/category/8157.htmlDragonzh-cnMon, 20 Aug 2012 09:18:41 GMTMon, 20 Aug 2012 09:18:41 GMT60关于PostMessage在多U程中的内存释放问题http://www.shnenglu.com/dragon/archive/2012/08/20/187777.htmlDragonDragonMon, 20 Aug 2012 09:12:00 GMThttp://www.shnenglu.com/dragon/archive/2012/08/20/187777.htmlhttp://www.shnenglu.com/dragon/comments/187777.htmlhttp://www.shnenglu.com/dragon/archive/2012/08/20/187777.html#Feedback0http://www.shnenglu.com/dragon/comments/commentRss/187777.htmlhttp://www.shnenglu.com/dragon/services/trackbacks/187777.html首先Q来分析一个假讄场景Q?br />如果PostMessage传递的是一些在栈区的变量,PostMessage后把q些数据传到另一个线E的消息队列里,?br />׃是栈Z的变量在PostMessage所在函数返回时ql回Ӟ那么另一U程׃(x)讉K不了(jin)q些数据?br />

解决办法Q在传送线EPostMessage消息前对栈区上的数据new一份放到堆ZQ堆区的数据是程序员手动?br />建和手动回收的,然后把这些数据传送到另一U程Q由另一U程L动释放delete?br />

问题的生:(x)׃工作U程处理的繁忙,有一些数据在UIU程退出时q没q回Q当UIU程退出后Q数据返?br />由工作线EPostMessage到UIU程QUIU程已经接收不到消息Q故未能手动释放工作U程传过来的堆区内存Q?br />造成内存泄漏?br />

后来Q查到如下网站:(x)
http://stackoverflow.com/questions/3807945/mfc-data-forwarding-to-main-thread-via-postmessage
发现PostMessage是有q回值的Q发送失败返回false?br />

故上面的问题有了(jin)解决Ҏ(gu)Q?br />UIU程Q接收线E)(j)退出后工作U程Q发送线E)(j)PostMessage是返回false的,故可以利用这个返回值来军_由哪个线E来释放q段
PostMessage中传递的内存Q如果传送失败,则由当前PostMessage的线E负责手动回Ӟ如果发送成功就?br />接收U程来负责手动回收?/p>

Dragon 2012-08-20 17:12 发表评论
]]>
通过q程名杀q程http://www.shnenglu.com/dragon/archive/2010/04/20/113064.htmlDragonDragonTue, 20 Apr 2010 05:07:00 GMThttp://www.shnenglu.com/dragon/archive/2010/04/20/113064.htmlhttp://www.shnenglu.com/dragon/comments/113064.htmlhttp://www.shnenglu.com/dragon/archive/2010/04/20/113064.html#Feedback0http://www.shnenglu.com/dragon/comments/commentRss/113064.htmlhttp://www.shnenglu.com/dragon/services/trackbacks/113064.html#include  "tlhelp32.h"

void KillProgram(LPCSTR   ExeName)  
{  
 LPCSTR   File;  
 HANDLE   hProcessSnap;  
 PROCESSENTRY32   pe32;  
 if(!ExeName||!ExeName[0])  
  return;  
 File = strrchr(ExeName, '\\');  
 if (File!=0)
  ExeName = File+1;  
 hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
 if(hProcessSnap==(HANDLE)-1) 
  return;
 memset(&pe32,0,sizeof(pe32));
 pe32.dwSize=sizeof(PROCESSENTRY32);
 if(Process32First(hProcessSnap,&pe32))  
 {  
  do
  {  
   File = strrchr(pe32.szExeFile, '\\');  
   File = File ? File+1 : pe32.szExeFile;  
   if (strcmpi(File,ExeName)==0)  
   {  
    TerminateProcess(OpenProcess(
     PROCESS_ALL_ACCESS,0,pe32  
     .th32ProcessID), 0);  
    break;  
   }  
  }  
  while(Process32Next(hProcessSnap,&pe32));  
 }  
 CloseHandle(hProcessSnap);
}

如果是在VS~译器中要更改字W集的类型,具体Ҏ(gu)是,叛_目->目属性页->配置属?>常规->字符集;更改?#8220;使用多字节字W集”?

Dragon 2010-04-20 13:07 发表评论
]]>
Q{Q提升进E权限ؓ(f)debug权限 http://www.shnenglu.com/dragon/archive/2010/04/20/113063.htmlDragonDragonTue, 20 Apr 2010 05:03:00 GMThttp://www.shnenglu.com/dragon/archive/2010/04/20/113063.htmlhttp://www.shnenglu.com/dragon/comments/113063.htmlhttp://www.shnenglu.com/dragon/archive/2010/04/20/113063.html#Feedback0http://www.shnenglu.com/dragon/comments/commentRss/113063.htmlhttp://www.shnenglu.com/dragon/services/trackbacks/113063.html
要对一个Q意进E(包括pȝ安全q程和服务进E)(j)q行指定?jin)写相关的访问权的OpenProcess操作Q只要当前进E具有SeDeDebug权限可以了(jin)。要是一个用hAdministrator或是被给予了(jin)相应的权限,可以具有该权限。可是,q我们用Administrator帐号对一个系l安全进E执行OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcessID)q是?x)遇?#8220;讉K拒绝”的错误。什么原因呢Q原来在默认的情况下q程的一些访问权限是没有被能(EnabledQ的Q所以我们要做的首先是能这些权限。与此相关的一些API函数有OpenProcessToken、LookupPrivilegevalue、AdjustTokenPrivileges。我们要修改一个进E的讉K令牌Q首先要获得q程讉K令牌的句柄,q可以通过OpenProcessToken得到Q函数的原型如下Q?

BOOL OpenProcessToken(
HANDLE ProcessHandle,
DWORD DesiredAccess,
PHANDLE TokenHandle
)Q?
W一参数是要修改讉K权限的进E句柄;W三个参数就是返回的讉K令牌指针Q第二个参数指定你要q行的操作类型,如要修改令牌我们要指定第二个参数为TOKEN_ADJUST_PRIVILEGESQ其它一些参数可参考Platform SDKQ。通过q个函数我们可以得到当前进E的讉K令牌的句柄(指定函数的第一个参Cؓ(f)GetCurrentProcess()可以了(jin)Q。接着我们可以调用AdjustTokenPrivileges对这个访问o(h)牌进行修攏VAdjustTokenPrivileges的原型如下:(x)
BOOL AdjustTokenPrivileges(
HANDLE TokenHandle, // handle to token
BOOL DisableAllPrivileges, // disabling option
PTOKEN_PRIVILEGES NewState, // privilege information
DWORD BufferLength, // size of buffer
PTOKEN_PRIVILEGES PreviousState, // original state buffer
PDWORD ReturnLength // required buffer size
);
W一个参数是讉K令牌的句柄;W二个参数决定是q行权限修改q是除能QDisableQ所有权限;W三个参数指明要修改的权限,是一个指向TOKEN_PRIVILEGESl构的指针,该结构包含一个数l,数据l的每个Ҏ(gu)明了(jin)权限的类型和要进行的操作; W四个参数是l构PreviousState的长度,如果PreviousState为空Q该参数应ؓ(f)NULLQ第五个参数也是一个指向TOKEN_PRIVILEGESl构的指针,存放修改前的讉K权限的信息,可空Q最后一个参Cؓ(f)实际PreviousStatel构q回的大。在使用q个函数前再看一下TOKEN_PRIVILEGESq个l构Q其声明如下Q?

typedef struct _TOKEN_PRIVILEGES {
DWORD PrivilegeCount;
LUID_AND_ATTRIBUTES Privileges[];
} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;
PrivilegeCount指的数组原素的个敎ͼ接着是一个LUID_AND_ATTRIBUTEScd的数l,再来看一下LUID_AND_ATTRIBUTESq个l构的内容,声明如下Q?

typedef struct _LUID_AND_ATTRIBUTES {
LUID Luid;
DWORD Attributes;
} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES

W二个参数就指明?jin)我们要q行的操作类型,有三个可选项Q?SE_PRIVILEGE_ENABLED、SE_PRIVILEGE_ENABLED_BY_DEFAULT、SE_PRIVILEGE_USED_FOR_ACCESS。要使能一个权限就指定Attributes为SE_PRIVILEGE_ENABLED。第一个参数就是指权限的类型,是一个LUID的|LUID是指locally unique identifierQ我想GUID大家是比较熟(zhn)的Q和GUID的要求保证全局唯一不同QLUID只要保证局部唯一Q就是指在系l的每一ơ运行期间保证是唯一的就可以?jin)。另外和GUID相同的一点,LUID也是一?4位的|怿大家都看qGUID那一大串的|我们要怎么h能知道一个权限对应的LUID值是多少呢?q就要用到另外一个API函数LookupPrivilegevalueQ其原Ş如下Q?

BOOL LookupPrivilegevalue(
LPCTSTR lpSystemName, // system name
LPCTSTR lpName, // privilege name
PLUID lpLuid // locally unique identifier
);
W一个参数是pȝ的名Uͼ如果是本地系l只要指明ؓ(f)NULL可以了(jin)Q第三个参数是q回LUID的指针,W二个参数就是指明了(jin)权限的名Uͼ?#8220;SeDebugPrivilege”。在Winnt.h中还定义?jin)一些权限名U的宏,如:(x)

#define SE_BACKUP_NAME TEXT("SeBackupPrivilege")

#define SE_RESTORE_NAME TEXT("SeRestorePrivilege")

#define SE_SHUTDOWN_NAME TEXT("SeShutdownPrivilege")

#define SE_DEBUG_NAME TEXT("SeDebugPrivilege")

q样通过q三个函数的调用Q我们就可以用OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcessID)来打获得Lq程的句柄,q且指定?jin)所有的讉K权?

==微尘附加Q完整源代码, ?gu)Windows核心(j)~程
BOOL EnableDebugPrivilege(BOOL bEnable)
{
      //Enabling the debug privilege allows the application to see
      //information about service application
     BOOL fOK = FALSE;     //Assume function fails
     HANDLE hToken;
     //Try to open this process's acess token
     if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
    {
         //Attempt to modify the "Debug" privilege
         TOKEN_PRIVILEGES tp;
         tp.PrivilegeCount = 1;
         LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
         tp.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
        AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
        fOK  = (GetLastError() ==  ERROR_SUCCESS);
        CloseHandle(hToken);
   }
   return fOK;
}
      在我写的E序中,用VS~译q_q行可以杀q程Q但Release后杀不了(jin)q程Q后来加?jin)这代码可以对指定q程q行写操作?br>转自Q?a href="http://www.shnenglu.com/tyt2008cn/archive/2008/02/17/42849.html">http://www.shnenglu.com/tyt2008cn/archive/2008/02/17/42849.html

Dragon 2010-04-20 13:03 发表评论
]]>
由CWndl承来的用户H口d加速键http://www.shnenglu.com/dragon/archive/2008/11/08/66327.htmlDragonDragonSat, 08 Nov 2008 06:28:00 GMThttp://www.shnenglu.com/dragon/archive/2008/11/08/66327.htmlhttp://www.shnenglu.com/dragon/comments/66327.htmlhttp://www.shnenglu.com/dragon/archive/2008/11/08/66327.html#Feedback0http://www.shnenglu.com/dragon/comments/commentRss/66327.htmlhttp://www.shnenglu.com/dragon/services/trackbacks/66327.html由CWndl承来的用户H口d加速键:(非框架窗口缺CFrameWnd中对加速键的支?
1.l派生类d一个数据成员m_hAccelTable(cdHACCEL).
2.向程序添加加速键资源,d资源我已l在另一文章中讲过,q有加一个具有响应函数的ID对应加速键.然后在应用程序生存期初期,调用API函数::LoadAccelerators加蝲加速键??:LoadAcceleratorsq回的句柄复制到m_hAccelTable.
 
  //In CMainWindow's constructor
  m_hAccelTable=LoadAccelerators(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1));

3.在窗口类中重载PreTranslateMessageq调用将句柄存储在m_hAccelTable中的::TranslateAccelerator.?:TranslateAcceleratorq回?br>的g为PreTranslateMessage的返回?


//virtual BOOL PreTranslateMessage(MSG *pMsg);函数原型

BOOL CMainWindow::PreTranslateMessage(MSG *pMsg)
{
 
if(CWnd::PreTranslateMessage(pMsg))
  
return TRUE;
 
return ((m_hAccelTable != NULL) && ::TranslateAccelerator(m_hWnd,m_hAccelTable,pMsg));
}


Dragon 2008-11-08 14:28 发表评论
]]>
位图菜单http://www.shnenglu.com/dragon/archive/2008/11/06/66178.htmlDragonDragonThu, 06 Nov 2008 15:11:00 GMThttp://www.shnenglu.com/dragon/archive/2008/11/06/66178.htmlhttp://www.shnenglu.com/dragon/comments/66178.htmlhttp://www.shnenglu.com/dragon/archive/2008/11/06/66178.html#Feedback0http://www.shnenglu.com/dragon/comments/commentRss/66178.htmlhttp://www.shnenglu.com/dragon/services/trackbacks/66178.html位图菜单:
在网上看到的文章如下:
     看下文章之前你要注意两个问题,一是你加蝲的位图是*.bmp的图片不?.ico;二是囄的大要定ؓ(f)16*16,不然你会(x)看不C?我就是犯?jin)这个弄了(jin)一?.
     MFC的CMenucL一个成员函数SetMenuItemBitmaps,能用于往菜单中增加图标。具体方法如?
在应用程式的资源文g中添加想要增加的位图,q将其ID命名为IDB_OPEN1和IDB_OPEN2;
---在应用程式的视图cMdCBitmapcȝ对象,不妨取名为bm_open1和bm_open2,
在视囄的构造函Cd以下代码:

 

bm_open1.LoadBitmap(IDB_OPEN1);
bm_open2.LoadBitmap(IDB_OPEN2);

 

(函数LoadBitmap用于加蝲位图到CBitmapcȝ对象)在视囄的成员函数OnDraw()中添加以下代?

 

CWnd * parent=GetParent();
CMenu 
* pmenubar=parent->GetMenu();
CMenu 
* pmenu=pmenubar->GetSubMenu(2);
pmenu
->SetMenuItemBitmaps(1,MF_BYPOSITION,&bm_open1,&bm_open2);


  前三行得到指向菜单的指针,W四行调用函数SetMenuItemBitmaps往菜单中增加图?具体参数的含义可参见有关介绍MFC?qing)其成员函数的书卛_.

是犯了(jin)q个错误,我网上走?jin)很?
然后我发现另一文章可以实现同L(fng)效果,不记得网地址?自己写出?

在应用程序的框架cCMainFramedCBitmapcȝ对象,不妨取名为bm_open1和bm_open2,

同样在构造函Cd如下代码:

 

bm_open1.LoadBitmap(IDB_OPEN1);
bm_open2.LoadBitmap(IDB_OPEN2);


然后在CMainFrame::OnCreate()中添加如下代?(注意,q里和上面不同了(jin),不用获得父类的指针了(jin))
    

CMenu * pmenubar=GetMenu();
CMenu 
* pmenu=pmenubar->GetSubMenu(2);
pmenu
->SetMenuItemBitmaps(1,MF_BYPOSITION,&bm_open1,&bm_open2);

最后实现的效果一?主要困扰我的问题是图片大没调整好显CZ出来.特作此笔?



Dragon 2008-11-06 23:11 发表评论
]]>
PreTranslateMessage和GetKeyState的一点理?/title><link>http://www.shnenglu.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.shnenglu.com/dragon/archive/2008/10/28/65344.html</guid><wfw:comment>http://www.shnenglu.com/dragon/comments/65344.html</wfw:comment><comments>http://www.shnenglu.com/dragon/archive/2008/10/28/65344.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/dragon/comments/commentRss/65344.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/dragon/services/trackbacks/65344.html</trackback:ping><description><![CDATA[<p>PreTranslateMessage和GetKeyState的一点理?<br>    MSDN上的:如果消息完全由PreTranslateMessagep回非零?q不再进一步处?如果消息以正常的方式处?p回零?<br>    当我新徏一个基于对话框的工E?q加?jin)OnkeyDown函数,再加如下代码惌实现Ctrl+leftl合?但没有Q何反?<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.shnenglu.com/Images/OutliningIndicators/None.gif" align=top twffan="done"><span style="COLOR: #000000" twffan="done"> </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 </span><span style="COLOR: #000000" twffan="done">&&</span><span style="COLOR: #000000" twffan="done"> ::GetKeyState(VK_CONTROL)</span><span style="COLOR: #000000" twffan="done"><</span><span style="COLOR: #000000" twffan="done">0</span><span style="COLOR: #000000" twffan="done">)   <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.shnenglu.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.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align=top twffan="done"> </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.shnenglu.com/Images/dot.gif" twffan="done"></span><span id=Codehighlighter1_55_99_Open_Text twffan="done"><span style="COLOR: #000000" twffan="done">{   <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top twffan="done">  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);   <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top twffan="done"> }</span></span></div> <p> </p> <p>    上网查了(jin)资料都是在PreTranslateMessageҎ(gu)息进行判?虽然最好的Ҏ(gu)是在q里实现,但我比较喜欢试,惛_q里实现.<br>|上都说在PreTranslateMessage实现,我就在我的工E中ȝ看PreTranslateMessage函数,当我查了(jin)MSDN后终于明白了(jin),我的消息<br>全由默认的函数处理了(jin),到OnkeyDown函数中就处理不了(jin)?我把PreTranslateMessage函数Ҏ(gu)下面的样子就可以?<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.shnenglu.com/Images/OutliningIndicators/None.gif" align=top twffan="done"><span style="COLOR: #000000" twffan="done">BOOL CTestDlg::PreTranslateMessage(MSG</span><span style="COLOR: #000000" twffan="done">*</span><span style="COLOR: #000000" twffan="done"> pMsg) <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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top twffan="done"> </span><span style="COLOR: #008000" twffan="done">//</span><span style="COLOR: #008000" twffan="done"> TODO: Add your specialized code here and/or call the base class</span><span style="COLOR: #008000" twffan="done"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top twffan="done"></span><span style="COLOR: #000000" twffan="done">   <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top twffan="done"> </span><span style="COLOR: #0000ff" twffan="done">return</span><span style="COLOR: #000000" twffan="done"> </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.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top twffan="done"></span><span style="COLOR: #000000" twffan="done">}</span></span></div> <p> </p> <p><br>    q里q有一个问?关于GetKeyState?查MSDN后知道它的返回值有三种状态的,有按下和弹v以及(qing)cM于大写转键的触发?<br>但在q里我们不用到触发?按下q回负?弹vq回正?如果上面我们没有对GetKeyState的返回值判断正?<br>当你W一ơ按左键?也会(x)弹出一个对话框,原因是GetKeyStateq回非零?<br>若你W一ơ按Ctrl+left时也?x)弹出对话?但第二次不用按Ctrl只按左键也会(x)弹出对话?因ؓ(f)你那时已l触发了(jin)Ctrl?再按一?br>Ctrl+left;下次按left׃?x)弹出对话框?那时Ctrl失效?(q里是失效还是弹起分不清?调试看它的返回?应该是弹?因ؓ(f)<br>按下Ctrl的值时它的值都?127?128两值变?x高(sh)(the high-order bit)?,最低位(the low-order bit)恒ؓ(f)1)<br>但感觉上q是失效,不然也不用第二次来恢复Ctrl的?!!!!!!<br>所以上面的GetKeyState必须判断q回值的正负!</p> <img src ="http://www.shnenglu.com/dragon/aggbug/65344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/dragon/" target="_blank">Dragon</a> 2008-10-28 16:21 <a href="http://www.shnenglu.com/dragon/archive/2008/10/28/65344.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>向一个Win32 Applicationd资源http://www.shnenglu.com/dragon/archive/2008/10/22/64738.htmlDragonDragonWed, 22 Oct 2008 12:33:00 GMThttp://www.shnenglu.com/dragon/archive/2008/10/22/64738.htmlhttp://www.shnenglu.com/dragon/comments/64738.htmlhttp://www.shnenglu.com/dragon/archive/2008/10/22/64738.html#Feedback0http://www.shnenglu.com/dragon/comments/commentRss/64738.htmlhttp://www.shnenglu.com/dragon/services/trackbacks/64738.html向一个Win32 Applicationd资源
我是在注册窗口类时添加的,没有加Q何东西之前创建的工程代码如下:

/Files/dragon/Addrctext.rar
最主要是在修改的代码在q里:

    CString strWndClass = AfxRegisterWndClass(
        CS_DBLCLKS,         
        AfxGetApp ()
->LoadStandardCursor(IDC_CROSS),
        (HBRUSH) (COLOR_3DFACE
+1),   
        AfxGetApp ()
->LoadStandardIcon (IDI_WINLOGO) 
    );

 


最后我?x)用LoadCursor加蝲自己ȝ鼠标图标?

首先,"插入"->"资源"->"Cursor"->"新徏"
?x)有一个编辑图标的H口,然后你随便画个图?/p>


然后按保存文g,注意,q里要把保存的文件保存到你的工程文g夹下,?.dsw文g所在的位置.
保存?你的工程文g夹下?x)多Z个文?一个是*.rc,一个是resourch.h

W三?在FileView里右击Resource Files选择"d文g到目?,然后打开你的资源文g*.rc;
此时你会(x)多出一个资源视?q时不要双击*.rc不然它会(x)在右~辑框打开?应该点击下方的资源视?
再查看视N文g夹下的文?点击所??,最后在左编辑框?x)显CZ的资源了(jin)!双击你自己定义的?br>标右~辑框会(x)出现它的~辑H口,q里回到文g视图,你会(x)发现Resource Files多了(jin)一?.cur文g

再把增加的resource.h文gd到Header Files?
q时你查看resource.h文g,其实它已l帮你定义了(jin)你的鼠标ID,你自己手动在工程文g夹下用文本编?br>器查?.rc文g,其实它已l帮你做?jin)好多工?

最后再把resource.h文g包含?.cpp文g下修改上面的代码卛_!

#include"resource.h"



    CString strWndClass 
= AfxRegisterWndClass (
        CS_DBLCLKS,         
        AfxGetApp ()
->LoadCursor(IDC_CURSOR1),
        (HBRUSH) (COLOR_3DFACE
+1),   
        AfxGetApp ()
->LoadStandardIcon (IDI_WINLOGO) 
    );

 

最后代?里面有另一文?我看?jin)那自己再ȝq篇?:
/Files/dragon/Addretext1.rar



Dragon 2008-10-22 20:33 发表评论
]]>
对SetViewportOrg和SetWindowOrg的理?/title><link>http://www.shnenglu.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.shnenglu.com/dragon/archive/2008/10/15/64005.html</guid><wfw:comment>http://www.shnenglu.com/dragon/comments/64005.html</wfw:comment><comments>http://www.shnenglu.com/dragon/archive/2008/10/15/64005.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/dragon/comments/commentRss/64005.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/dragon/services/trackbacks/64005.html</trackback:ping><description><![CDATA[<p>对SetViewportOrg和SetWindowOrg的理?<br>void CMainWindow::OnLButtonDown(UINT nFlags,CPoint point)<br>{<br> CRect rect;<br> GetClientRect(&rect);<br>        CClientDC dc(this);<br> dc.SetViewportOrg(0,rect.Height());//把原点移臌口的左下?br> dc.Rectangle(0,0,200,-200);<br> <br> dc.SetViewportOrg(rect.Width(),rect.Height());//把原点移臌口的右下?br> dc.Rectangle(0,0,-200,-200);</p> <p><br> dc.SetViewportOrg(rect.Width(),0);//把原点移臌口的右上?br> dc.Rectangle(0,0,-200,200);</p> <p> dc.SetViewportOrg(0,0);//Ud原来的位|?br> dc.Rectangle(0,0,200,200);<br>}<br>     ׃SetViewportOrg的参数是讑֤坐标,与逻辑坐标无关,所以当它移动坐标u时与上一ơ的坐标轴的位置?br>关的,q且GetClientDC获得的是讑֤坐标,更加可以怿它每一ơ设|的坐标的正?它的主要作用?<span style="COLOR: red" twffan="done">原?br>(左上?U至参数指定的点.</span></p> <p><br>    至于SetWindowOrg是采用逻辑坐标q行讄坐标原点?它可以在对应的逻辑映射模式下进行设|原?除了(jin)<br>默认的坐标系是原点在左上?向ؓ(f)?向右为正?其它非自定义模式都是原点在左上角,向下,向右为正?<br>和我们数学的二维坐标pM?Z(jin)更好的体现出SetWindowOrg我将H口分别变成我们数学上四个像?它的<br>作用是这L(fng):<span style="COLOR: red" twffan="done">有一点point1,先将它从讑֤坐标变成该映模式下的逻辑坐标(注意:一般设备坐标点?,+ 逻辑<br>坐标转换后是+,-?由映模式决?,然后它移动它的奇对称点得坐标系跟着Ud,当它的奇对称点到辑֎?br>?原来的原点就到达point1的位|?(SetWindowOrg的参数就是point1的奇对称?</span></p> <p> </p> <p> CRect rect;<br> GetClientRect(&rect);<br>没设|前已经是第四象限了(jin)!</p> <p>W一象限:<br> CClientDC dc(this);<br> dc.SetMapMode(MM_LOENGLISH);<br> CPoint point1(0,rect.Height());//把原点移到左下角<br> dc.DPtoLP(&point1);//先将讑֤坐标变成逻辑坐标!SetWindowOrg要求?<br> dc.SetWindowOrg(-point1.x,-point1.y);//两个负号取奇对称?UdU点使得整个坐标跟着UM对称点移到原?br> CRect rect1(0,0,200,200);<br> dc.Rectangle(&rect1);<br>W二象限:<br> CClientDC dc(this);<br> dc.SetMapMode(MM_LOENGLISH);<br> CPoint point1(rect.Width(),rect.Height());//把原点移到右下角<br> dc.DPtoLP(&point1);//逻辑坐标是相对于MM_LOENGLISHq行转换?得到的坐标肯定是(+,-)<br> dc.SetWindowOrg(-point1.x,-point1.y);<br> dc.Rectangle(0,0,-200,200);<br>W三象限:<br> CClientDC dc(this);<br> dc.SetMapMode(MM_LOENGLISH);<br> CPoint point1(rect.Width(),0);//把原点移到右上角<br> dc.DPtoLP(&point1);<br> dc.SetWindowOrg(-point1.x,-point1.y);<br> dc.Rectangle(0,0,-200,-200);</p> <p><br>上面的SetWindowOrg分开ȝ,我要的效果是要像上面的SetViewportOrgq样q着?<br>其实在移完一个原点后,把原点移?0,0)再移q就可以做到?(W四象限忽略)<br> CRect rect;<br> GetClientRect(&rect);<br>        int width=rect.Width();<br> int height=rect.Height();<br> <br> CClientDC dc(this);<br> dc.SetMapMode(MM_LOENGLISH);<br> CPoint point1(0,height);<br> dc.DPtoLP(&point1);<br> dc.SetWindowOrg(-point1.x,-point1.y);<br> CRect rect1(0,0,200,200);<br> dc.Rectangle(&rect1);<br> <br> <br>        dc.SetWindowOrg(0,0);<br> point1=CPoint(width,height);<br> dc.DPtoLP(&point1);<br> dc.SetWindowOrg(-point1.x,-point1.y);<br> dc.Rectangle(0,0,-200,200);</p> <p> dc.SetWindowOrg(0,0);<br> point1=CPoint(width,0);<br> dc.DPtoLP(&point1);<br> dc.SetWindowOrg(-point1.x,-point1.y);<br> dc.Rectangle(0,0,-200,-200);</p> <p><br>如果我中间没有用dc.SetWindowOrg(0,0);p思考了(jin)!<br> CClientDC dc(this);<br> dc.SetMapMode(MM_LOENGLISH);<br> CPoint point1(0,height);<br> dc.DPtoLP(&point1);<br> dc.SetWindowOrg(-point1.x,-point1.y);<br> CRect rect1(0,0,200,200);<br> dc.Rectangle(&rect1);<br> <br> //先明上一步我们的坐标原点在左下角,要把原点Ud右下?此时右下角相对当时的坐标pL(width,0)<br> point1=CPoint(width,0);//U至(width,0)<br> dc.DPtoLP(&point1);//变换成ؓ(f)逻辑坐标,但符号变?sh)?+,-),因ؓ(f)在MM_LOENGLISH映射模式?br> dc.SetWindowOrg(-point1.x,point1.y);//(width,0)?+,0)则它的对U点应ؓ(f)(-,0)才对,<br>                                     //只要point1前一个变号即?W二个ؓ(f)0不用?<br> dc.Rectangle(0,0,-200,200);</p> <p> <img height=480 alt="" src="http://www.shnenglu.com/images/cppblog_com/dragon/11.JPG" width=637 border=0><br> //先明上一步我们的坐标原点在右下角,要把原点Ud右上?此时右上角相对当时的坐标pL(0,height)<br> point1=CPoint(0,height);//U至(0,height)<br> dc.DPtoLP(&point1);//变换成ؓ(f)逻辑坐标,但符号变?sh)?+,-),因ؓ(f)在MM_LOENGLISH映射模式?br> dc.SetWindowOrg(point1.x,point1.y);//(0,height)?0,+)则它的对U点应ؓ(f)(0,-)才对,和逻辑坐标同号,不用?<br> dc.Rectangle(0,0,-200,-200);<br><img height=480 alt="" src="http://www.shnenglu.com/images/cppblog_com/dragon/12.JPG" width=637 border=0></p> <p>可以看出SetWindowOrg每一ơ执行都改变?sh)ơ坐标系的位|?!</p> <img src ="http://www.shnenglu.com/dragon/aggbug/64005.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/dragon/" target="_blank">Dragon</a> 2008-10-15 10:01 <a href="http://www.shnenglu.com/dragon/archive/2008/10/15/64005.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>手动创徏控g的tab序http://www.shnenglu.com/dragon/archive/2008/10/13/63861.htmlDragonDragonMon, 13 Oct 2008 02:10:00 GMThttp://www.shnenglu.com/dragon/archive/2008/10/13/63861.htmlhttp://www.shnenglu.com/dragon/comments/63861.htmlhttp://www.shnenglu.com/dragon/archive/2008/10/13/63861.html#Feedback1http://www.shnenglu.com/dragon/comments/commentRss/63861.htmlhttp://www.shnenglu.com/dragon/services/trackbacks/63861.html手动创徏控g的tab序:
    一般手动创建的控g(在其它可视化控g存在的情况下)按tab键是不会(x)有焦点的!只要在创建控件的函数Create?br>加WS_TABSTOP属性就?x)有?(q个一定要记得要加)
    若你想o(h)它成为当H口弹出来时成ؓ(f)W一个拥有焦点的控g,只要你用下面的函数就可以:
    myButton.SetWindowPos(&wndTop,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);
SetWindowPos函数的介l?
BOOL SetWindowPos (
const CWnd* pWndInsertAfter,
int x,
int y,
int cx,
int cy,
UINT nFlags );

q个Ҏ(gu)改变子窗?(叛_)弹出H口,H口的大?位置和Z序!
从我的看法来觉得,Z序是相Ҏ(gu)C器q面的垂直方向窗口显C的序!

参数:
pWndInsertAfter
在z序中的位于被|位的窗口前一个窗口句柄。该参数必须Z个CWnd指针Q或下列值的地址(因ؓ(f)参数是指?之一Q?br>wndBottom 窗口置于Z序的底部;如果CWnd是一个顶层窗?q个H口失去顶U位|?它将攑֜所有窗口的底部!
wndTop 窗口置于Z序的剙
wndTopMost 窗口置于所有非层H口之上。即使窗口未被激zȝ口也保持顶U位|?br>wndNoTopMost 窗口置于所有非层H口之上Q即在所有顶层窗口之后)(j)。如果窗口已l是非顶层窗口则该标志不起作用?br>wndTop是要将它放到Z序的首位置;


x: 以客户坐标指定窗口新位置的左边界.
Y: 以客户坐标指定窗口新位置的顶边界.
cx:以像素指定窗口的新的宽度.
cy:以像素指定窗口的新的高度.

uFlags:H口寸和定位的标志。该参数可以是下列值的l合Q?br>  SWP_ASNCWINDOWPOSQ如果调用进E不拥有H口Q系l会(x)向拥有窗口的U程发出需求。这防止调用线E在其他U程处理需求的时候发生死锁?br>  SWP_DEFERERASEQ防止生WM_SYNCPAINT消息?br>  SWP_DRAWFRAMEQ在H口周围M个边框(定义在窗口类描述中)(j)?br>  SWP_FRAMECHANGEDQ给H口发送WM_NCCALCSIZE消息Q即使窗口尺寸没有改变(sh)?x)发送该消息。如果未指定q个标志Q只有在改变?sh)(jin)窗口尺寸时才发送WM_NCCALCSIZE?br>  SWP_HIDEWINDOW;隐藏H口?br>  SWP_NOACTIVATEQ不Ȁzȝ口。如果未讄标志Q则H口被激z,q被讄到其他最高H口或非最高l的剙Q根据参数hWndlnsertAfter讄Q?br>  SWP_NOCOPYBITSQ清除客户区的所有内宏V如果未讄该标志,客户区的有效内容被保存ƈ且在H口寸更新和重定位后拷贝回客户区?br>  SWP_NOMOVEQ维持当前位|(忽略X和Y参数Q?br>  SWP_NOOWNERZORDERQ不改变z序中的所有者窗口的位置?br>  SWP_NOREDRAW:不重L变的内容。如果设|了(jin)q个标志Q则不发生Q何重d作。适用于客户区和非客户区(包括标题栏和滚动条)(j)和Q何由于窗回移动而露出的父窗口的所有部分。如果设|了(jin)q个标志Q应用程序必L地使窗口无效ƈ区重ȝ口的M部分和父H口需要重ȝ部分?br>  SWP_NOREPOSITIONQ与SWP_NOOWNERZORDER标志相同?br>  SWP_NOSENDCHANGINGQ防止窗口接收WM_WINDOWPOSCHANGING消息?br>  SWP_NOSIZEQ维持当前尺寸(忽略cx和cy参数Q?br>  SWP_NOZORDERQ维持当前Z序(忽略pWndInsertAfter参数Q?br>  SWP_SHOWWINDOWQ显C窗口?br>  q回|(x)如果函数成功Q返回gؓ(f)非零Q如果函数失败,q回gؓ(f)零。若惌得更多错误消息,误用GetLastError函数?br>  备注Q如果设|了(jin)SWP_SHOWWINDOW和SWP_HIDEWINDOW标志Q则H口不能被移动和改变大小。如果用SetWindowLoog改变?sh)(jin)窗口的某些数据Q则必须调用函数SetWindowPos来作真正的改变。用下列的l合标志QSWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED?br>  有两U方法将H口设ؓ(f)最层H口Q一U是参数pWndInsertAfter讄为wndTopMostq确保没有设|SWP_NOZORDER标志Q另一U是讄H口在Z序中的位|以使其在其他存在的H口之上。当一个窗口被|ؓ(f)最层H口Ӟ属于它的所有窗口均为最层H口Q而它的所有者的z序ƈ不改变?br>  如果wndTopMost和wndNoTopMost标志均未指定Q即应用E序要求H口在激zȝ同时改变其在Z序中的位|时Q在参数hWndinsertAfter中指定的值只有在下列条g中才使用Q?br>  在hWndlnsertAfter参数中没有设定wndNoTopMost和wndTopMost标志?br>  由hWnd参数标识的窗口不是激zȝ口?br>  如果未将一个非Ȁzȝ口设定到z序的端Q应用程序不能激z该H口。应用程序可以无M限制地改变被Ȁzȝ口在Z序中的位|,或激zM个窗口ƈ其Ud最高H口的顶部或非最高H口的顶部?br>  如果一个顶层窗口被重定位到z序的底部QwndBottomQ或在Q何非最高序的窗口之后,该窗口就不再是最层H口。当一个最层H口被置为非最Q则它的所有者窗口和所属者窗口均为非最层H口?br>  一个非最端H口可以拥有一个最端H口Q但反之则不可以。Q何属于顶层窗口的H口Q例如一个对话框Q本w就被置为顶层窗口,以确保所有被属窗口都在它们的所有者之上?br>  如果应用E序不在前台Q但应该位于前台Q就应调用SetForegroundWindow函数来设|?/p>


我手动创Z(jin)几个控g,然后调用下面的函数进行设|tab序!未设|之前是按控件的创徏序为tab序:
void CTest4Dlg::OnSetOrder()
{
 CWnd * pNum1=GetDlgItem(IDC_NUM1);
 CWnd * pNum2=GetDlgItem(IDC_NUM2);
 CWnd * pResult=GetDlgItem(IDC_RESULT);
 CWnd * pEqual=GetDlgItem(IDC_EQUAL);
 CWnd * pClear=GetDlgItem(IDC_CLEAR);
 CWnd * pSetOrder=GetDlgItem(IDC_SETORDER);
 EquBtn.SetWindowPos(&wndTop,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);//wndTop是设|ؓ(f)Z序的最剙!
 Num2.SetWindowPos(pEqual,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);
 SetOrder.SetWindowPos(pNum2,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);
 Result.SetWindowPos(pSetOrder,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);
 Clear.SetWindowPos(pResult,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);
}

开始时它的tab序是这L(fng),如下?

当按?jin)设|按?OnSetOrder)?如下?



Dragon 2008-10-13 10:10 发表评论
]]>
两种Ҏ(gu)实现回R响应tab?/title><link>http://www.shnenglu.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.shnenglu.com/dragon/archive/2008/10/12/63822.html</guid><wfw:comment>http://www.shnenglu.com/dragon/comments/63822.html</wfw:comment><comments>http://www.shnenglu.com/dragon/archive/2008/10/12/63822.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/dragon/comments/commentRss/63822.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/dragon/services/trackbacks/63822.html</trackback:ping><description><![CDATA[<p>两种Ҏ(gu)实现回R响应tab?<br>W一U比较简?<br>只要在你的对话框cC**Dlg中右?yn)L加虚函数PreTranslateMessage然后加如下代码即?<br>BOOL CTest2Dlg::PreTranslateMessage(MSG* pMsg) <br>{<br> // TODO: Add your specialized code here and/or call the base class<br> if(pMsg->message==WM_KEYDOWN)<br> {<br>  if(pMsg->wParam==VK_RETURN)<br>  {<br>   pMsg->wParam=VK_TAB;<br>  }<br> }<br> return CDialog::PreTranslateMessage(pMsg);<br>}</p> <p>W二U方法好一?但实现v来也比较难一?<br>1.新徏一个基于对话框的工Etest3;我把"定"?取消"都删除了(jin)!<br>2.在对话框中插入如囄控g(其中Button1的ID是IDOK)<br><img height=331 alt="" src="http://www.shnenglu.com/images/cppblog_com/dragon/return.jpg" width=484 border=0><br>3.叛_工程d一个MFCc?cd为CMyEdit<br>4.然后叛_q个新类dWM_KEYDOWN消息函数OnKeyDown;q加如下代码:<br>void CMyEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) <br>{<br> // TODO: Add your message handler code here and/or call default<br> if(nChar==VK_RETURN)<br> {<br>  CTest3Dlg * pwnd=(CTest3Dlg *)GetParent();//Z是主对话框类,所以在CPP文g中加#include "test3Dlg.h"<br>                                                          //不要在头文g中加,在头文g中会(x)出错?<br>  pwnd->NextDlgCtrl();<br> }<br> CEdit::OnKeyDown(nChar, nRepCnt, nFlags);<br>}</p> <p>5.然后主对话框中的两个编辑框定义兌变量:<br>在classwizard中选择 member variables 选项Qclass name选择对话框类Qcontrol ids中选择~辑框的idP然后选择add variable按扭。在对话框中 categary选择controlQ?variable type 刚才定义的类m_myedit1,m_myedit2;那时它会(x)提示你加头文?br>"MyEdit.h" 你此时就在头文gTest3Dlg.h?include "MyEdit.h"</p> <p>6.Z(jin)让焦点落在按??若按下回车响应按?的函?我加?jin)两个函?<br>void CTest3Dlg::OnOK()//其中q个是按钮1的响应函?br>{<br> // TODO: Add extra validation here<br> MessageBox("dragon");<br> //CDialog::OnOK();//我ؓ(f)?jin)不让默认的OnOK函数执行,它屏蔽?<br>}</p> <p>void CTest3Dlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)//叛_cL加的! <br>{<br> // TODO: Add your message handler code here and/or call default<br> if(nChar==VK_RETURN)<br>  OnOK();<br> CDialog::OnKeyDown(nChar, nRepCnt, nFlags);<br>}<br></p> <img src ="http://www.shnenglu.com/dragon/aggbug/63822.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/dragon/" target="_blank">Dragon</a> 2008-10-12 18:13 <a href="http://www.shnenglu.com/dragon/archive/2008/10/12/63822.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CIPAddressCtrl控g的用?/title><link>http://www.shnenglu.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.shnenglu.com/dragon/archive/2008/09/25/62744.html</guid><wfw:comment>http://www.shnenglu.com/dragon/comments/62744.html</wfw:comment><comments>http://www.shnenglu.com/dragon/archive/2008/09/25/62744.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/dragon/comments/commentRss/62744.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/dragon/services/trackbacks/62744.html</trackback:ping><description><![CDATA[<p>CIPAddressCtrl控g的用?</p> <p>1.通过Create函数手动创徏一个IP控g.<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控g出来,后来才发现原来我的IPAddress是一个局部变?当OnInitDialog()函数q回?q个变量撤销?<br>所以不?x)有控g出来!!<br>只要把CIPAddressCtrl IPAddress;攑ֈ头文件中定义为成员变量就O(jin)K?</p> <p>如果上面的Create函数的第一个参数没有|WS_VISIBLE;我们可以Create函数后加q一?IPAddress.ShowWindow(SW_SHOW);<br>感觉上Create函数在每一个控仉都有,创徏的方法也是大同小异了(jin)?</p> <p>2.下面的是我在Z一个对话框的工E中d一个IP控g中所写的:<br>先获得控件的指针:<br>CIPAddressCtrl * pIP=(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS);</p> <p>void ClearAddress( );<br>q个函数IP控g里的内容清空.<br>BOOL IsBlank( ) const;<br>q个函数是当IP控g里一个数字都没有才返回真?全ؓ(f)0都返回假,0也是数字!调用ClearAddress( )后刚好可以IsBlank()反回?<br>试代码如下:<br>pIP->ClearAddress();<br>if(pIP->IsBlank())<br>{<br>     MessageBox("IP全ؓ(f)I?);<br>}</p> <p> </p> <p>int GetAddress(BYTE& nField0, BYTE& nField1, BYTE& nField2, BYTE& nField3);<br>int GetAddress(DWORD& dwAddress);<br>当控件内容ؓ(f)I时,x有数?q?也没?q回0,0,0,0.和控件全?的情况一?<br>获得IP地址:(两种Ҏ(gu),选其一)</p> <p><br> BYTE nf1,nf2,nf3,nf4;<br> pIP->GetAddress(nf1,nf2,nf3,nf4);<br> CString str;<br> str.Format("%d.%d.%d.%d",nf1,nf2,nf3,nf4);//q里的nf得到的值是IPg(jin).<br> MessageBox(str);<br> </p> <p> /*<br> DWORD dw;<br> pIP->GetAddress(dw);<br> CString str;<br> WORD hiWord=HIWORD(dw);<br> WORD loWord=LOWORD(dw);<br> BYTE nf1=HIBYTE(hiWord);<br> BYTE nf2=LOBYTE(hiWord);<br> BYTE nf3=HIBYTE(loWord);<br> BYTE nf4=LOBYTE(loWord);<br> str.Format("%d.%d.%d.%d",nf1,nf2,nf3,nf4);<br> MessageBox(str);<br> */</p> <p><br>void SetAddress(BYTE nField0, BYTE nField1, BYTE nField2, BYTE nField3);<br>void SetAddress(DWORD dwAddress);<br>讄IP地址:(两种Ҏ(gu),选其一)</p> <p>        pIP->SetAddress(127,0,0,1);</p> <p> pIP->SetAddress((DWORD)0x7F000001);//q两行的效果都是一L(fng)!</p> <p><br>void SetFieldRange(int nField, BYTE nLower, BYTE nUpper);<br>讄每一个域的范?(nField??的?nLower和nUpper的范围都??55.可以出范围,但控件也q是默认讄??55?</p> <p> pIP->SetFieldRange(0,5,127);//讄每一个域的范?W一个参数是域的下标,W二和第三个是范?<br> pIP->SetFieldRange(1,5,127);//当输入比5时,?,当失去输入焦Ҏ(gu),它会(x)重置?.<br> pIP->SetFieldRange(2,5,127);//当输入比127大时,?28,它会(x)自动变回127<br> pIP->SetFieldRange(3,5,127);</p> <p><br>void SetFieldFocus(WORD nField);<br>nField的gؓ(f)0?;表示域的下标!该函数是使输入焦点落在四个域的指定域?<br>q个函数要在消息响应时才能体现出?<br>试代码:<br>void CTestDlg::OnButton2() <br>{<br> // TODO: Add your control notification handler code here<br> CIPAddressCtrl * pIP=(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS);<br> pIP->SetFieldFocus(2);<br>}</p> <img src ="http://www.shnenglu.com/dragon/aggbug/62744.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/dragon/" target="_blank">Dragon</a> 2008-09-25 10:28 <a href="http://www.shnenglu.com/dragon/archive/2008/09/25/62744.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GetLogicalDriveStrings函数http://www.shnenglu.com/dragon/archive/2008/09/24/62664.htmlDragonDragonWed, 24 Sep 2008 03:33:00 GMThttp://www.shnenglu.com/dragon/archive/2008/09/24/62664.htmlhttp://www.shnenglu.com/dragon/comments/62664.htmlhttp://www.shnenglu.com/dragon/archive/2008/09/24/62664.html#Feedback0http://www.shnenglu.com/dragon/comments/commentRss/62664.htmlhttp://www.shnenglu.com/dragon/services/trackbacks/62664.html对GetLogicalDriveStrings的理?
函数原Ş:
DWORD GetLogicalDriveStrings(
  DWORD nBufferLength,  // size of buffer
  LPTSTR lpBuffer       // drive strings buffer
);

说明:GetLogicalDriveStrings函数一个缓冲区lpBuffer填入在计机上存在的盘盘符.

参数说明:
nBufferLength是缓冲区lpBuffer的大?以字节ؓ(f)单位.它的大小不包含最后的I字W?如果它的gؓ(f)?~冲Z可用.

lpBuffer指向一个接收各U以零结字符串缓冲区,一个空字符用来区分各个可用盘?最后在末尾有再以空字符l尾,假如
你的?sh)脑上有C,D两个盘盘符,则它能得C个字W串?
'C',':','\',' ','D',':','\',' ',' '
?C:\<null>D:\<null><null>


q回?
如果函数成功l束,q回值是获得的字W串长度,以字节ؓ(f)单位,不包括最后的一个空字符,好像上面的字W串获得的长度就?;盘
盘符的个数自乘(sh)4是?C:一个ANSI-ASCII码的I字W是一个字?而一个Unicode码的I字W是两个字节.如果q个~冲Z
够大,q回g(x)比nBufferLength?q是~冲求去获得全部盘盘符的原?

如果函数p|,q个q回值是0;用GetLastError可以捕获q个错误信息!



Dragon 2008-09-24 11:33 发表评论
]]>
VC++加速键的加入方?/title><link>http://www.shnenglu.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.shnenglu.com/dragon/archive/2008/09/16/62014.html</guid><wfw:comment>http://www.shnenglu.com/dragon/comments/62014.html</wfw:comment><comments>http://www.shnenglu.com/dragon/archive/2008/09/16/62014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/dragon/comments/commentRss/62014.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/dragon/services/trackbacks/62014.html</trackback:ping><description><![CDATA[<font color=#993300>一U是直接与菜单项兌的加速键          另一U就是自定义的加速键.</font> <p><span style="COLOR: #993300" twffan="done"><strong> W一U?</strong> (如果是基于对话框的工E?我们先添加菜单和加速键资源,然后叛_d话框属性添加菜?<br>首先在资源文件Accelerator中添加快捷键资源 ID选择你要兌菜单的名称 然后再设|你的快捷键.什?下一??h文g中加入一?nbsp;   HACCEL   hAccel;变量 然后在OnInitDialog或初始化中加入hAccel=::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1));  后面的参数是加速键资源文g?</span></p> <p><span style="COLOR: #993300" twffan="done">最后在PreTranslateMessage(MSG* pMsg) 中加?<br>    if(::TranslateAccelerator(GetSafeHwnd(),hAccel,pMsg))   <br>        return   true; <br></span></p> <p><span style="COLOR: #993300" twffan="done">q样 以后只要在Accelerator资源文g中添加快捷键可以了(jin) <br><strong>注意Q?</strong><span style="COLOR: #0000ff" twffan="done">?/span><span style="COLOR: #0000ff" twffan="done">加快捷键的ID一定要与菜单ID一?/span> q样才能响应.现在只需要在此菜单项中加入OnCommand消息的处理就可以?</span></p> <p><span style="COLOR: #993300" twffan="done"><br></span></p> <p><span style="COLOR: #993300" twffan="done"><strong>W二U?</strong> q是在资源文件Accelerator中添加快捷键资源 ID自己定义一?然后再设|你的快捷键.下一?..是?h文g中定义一个快捷键对象<br>HACCEL m_hAccel;</span></p> <p><span style="COLOR: #993300" twffan="done">然后?cpp文g中初?br> m_hAccel = ::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1));<br>IDR_ACCELERATOR1Z的加速资源名U?注意不是刚刚定义的加速键ID.<br><br>再添加PreTranslateMessage消息处理 在里面加入以下代?<br> //保存快捷键被启用<br> if(m_hAccel   !=   NULL)   <br> {   <br>  if (TranslateAccelerator(m_hWnd, m_hAccel, pMsg))<br>   <br>   return   TRUE;  <br>  <br> }   </span></p> <p><span style="COLOR: #993300" twffan="done">再添加OnCommand消息处理 加入以下代码:</span></p> <p><span style="COLOR: #993300" twffan="done">//响应加速键<br>  switch(LOWORD(wParam))   <br>  {   <br>  case  SHOW_DIAL0G:   //加速键ID   <br>//...d处理语句<br>  break;   <br>  case   SHOW_DIALOG_02:   //加速键ID   <br>//...d处理语句<br>  break;   <br><br>  }<br><br>自己加的:在我看的代码?它是利用对话框加菜单?当加?jin)菜单?把菜单挂到对话框,然后响应一个菜单项.再在对话框类中加虚函数PreTranslateMessage,在些数里的代码如?<br> if( pMsg->message==WM_KEYDOWN)<br> {<br>  if(pMsg->wParam==VK_F2)<br>   this->PostMessage(WM_COMMAND,IDM_SHOW);//IDM_SHOW是响应的菜单ID<br> }<br> return CDialog::PreTranslateMessage(pMsg);<br>q样我就可以响应F2的加速键?!<br>转蝲:<a title=http://www.cnblogs.com/thankgoodness/articles/1136617.html >http://www.cnblogs.com/thankgoodness/articles/1136617.html<br></a></span></p> <img src ="http://www.shnenglu.com/dragon/aggbug/62014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/dragon/" target="_blank">Dragon</a> 2008-09-16 23:07 <a href="http://www.shnenglu.com/dragon/archive/2008/09/16/62014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GetSafeHwnd()http://www.shnenglu.com/dragon/archive/2008/09/08/61274.htmlDragonDragonSun, 07 Sep 2008 18:33:00 GMThttp://www.shnenglu.com/dragon/archive/2008/09/08/61274.htmlhttp://www.shnenglu.com/dragon/comments/61274.htmlhttp://www.shnenglu.com/dragon/archive/2008/09/08/61274.html#Feedback0http://www.shnenglu.com/dragon/comments/commentRss/61274.htmlhttp://www.shnenglu.com/dragon/services/trackbacks/61274.html当我们想得到一个窗口对象(CWnd的派生对象)(j)指针的句柄(HWNDQ时Q最安全的方法是使用GetSafeHwnd()函数Q通过下面的例子来看其理由Q?br>CWnd *pwnd = FindWindow(“ExploreWClass”,NULL); //希望扑ֈ资源理?br>HWND hwnd = pwnd->m_hwnd; //得到它的HWND
q样的代码当开始得到的pwnd为空的时候就?x)出C?#8220;General protection error”,q关闭应用程序,因ؓ(f)一般不能对一个NULL指针讉K其成员,如果用下面的代码Q?br>CWnd *pwnd = FindWindow(“ExploreWClass”,NULL); //希望扑ֈ资源理?br>HWND hwnd = pwnd->GetSafeHwnd(); //得到它的HWND
׃?x)出现问题,因?f)管当pwnd是NULLӞGetSafeHwnd仍然可以用,只是q回NULLQ通过GetSafeHwnd()的实C码就更清楚了(jin)Q?br>_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const
{
return this == NULL?NULL:m_hWnd;
}
你看有很多函数的参数要求HWND,它就可以z上用场?
HWND hwnd;
CWnd* pWnd;
pWnd=((CFrameWnd*)(AfxGetApp()->m_pMainWnd))->GetActiveView();
hwnd=pWnd->GetDlgItem(IDC_EDIT2)->GetSafeHwnd();
::SetWindowText(hwnd,m_strResult);
转蝲:http://hi.baidu.com/johnleeqq/blog/item/ae746a5088f4535f1138c2b2.html

Dragon 2008-09-08 02:33 发表评论
]]>
帮工h换位?/title><link>http://www.shnenglu.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.shnenglu.com/dragon/archive/2008/09/06/61176.html</guid><wfw:comment>http://www.shnenglu.com/dragon/comments/61176.html</wfw:comment><comments>http://www.shnenglu.com/dragon/archive/2008/09/06/61176.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/dragon/comments/commentRss/61176.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/dragon/services/trackbacks/61176.html</trackback:ping><description><![CDATA[<p>帮工h换位?<br>    一般新建的工具栏上的按钮都是经q自q囄,今天自己仿另一个系l做,无意中发C用自q图也?最后我按下面的步骤做成功了(jin)!</p> <p>新徏一个基于对话框的工E?<br>(1)我加载的工具栏有十个64*42的按?所以对话要事先拉得比工h?<br>(2)插入一个工h,初始ID为IDR_TOOLBAR1;然后在上面加十个64*42的按?我加载的位图?nbsp;  640*42?q个可以出来吧!<br>(3)在C**DlgcL加一个CToolBar变量m_ToolBar;再在q个cL加OnInitDialog()函数,在这函数里添加如下代码加载工h到对话框!</p> <p>if (!m_ToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP<br>  | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||<br>  !m_ToolBar.LoadToolBar(<span style="COLOR: red" twffan="done">IDR_TOOLBAR1</span>))<br> {<br>  TRACE0("Failed to create toolbar\n");<br>  return -1;      // fail to create<br> }</p> <p> RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);<br> m_ToolBar.ShowWindow(SW_SHOW);<br>然后~译q行!<br>(4)叛_你的工具栏点属?看到文g名的内容?res\toolbar1.bmp;q下你也自然惛_工程下的res文g夹了(jin)?你要加入的囄改名为toolbar1.bmp复制到res文g下去覆盖原来的toolbar1.bmp;q时VC?x)弹Z个对话框?........\toolbar1.bmpq个文g已在Microsoft Developer Studio之外补修?你要重新载入它吗?"<br>你按"?p?<br><img src="http://www.shnenglu.com/images/cppblog_com/dragon/QQ.jpg" border=0 twffan="done"><br>q时你编辑的工具栏相应会(x)有变化的?</p> <p>(5)~译q行后是q(sh)行的,<span style="COLOR: red" twffan="done">那时我把我工h的左数第一个按钮改?jin)ID再编译运行就O(jin)K?/span>!</p> <p>q个序不能倒啊,呵呵!因ؓ(f)toolbar1.bmp原先不存在的,~译q行时它?x)自q成的,但我们生成后再去覆盖׃一样了(jin)!<br>以下是我做成功的界面和用到的toolbar1.bmp?<span style="COLOR: red">因ؓ(f)不能上传bmp格式,我把后缀Ҏ(gu)jpg才上传了(jin)</span>)<br><img src="http://www.shnenglu.com/images/cppblog_com/dragon/QQ1.jpg" border=0 twffan="done"><br><br><img src="http://www.shnenglu.com/images/cppblog_com/dragon/toolbar1.jpg" border=0 twffan="done"><br>紧作W记之用,如果觉得q个单勿嘲笑!</p> <img src ="http://www.shnenglu.com/dragon/aggbug/61176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/dragon/" target="_blank">Dragon</a> 2008-09-06 23:15 <a href="http://www.shnenglu.com/dragon/archive/2008/09/06/61176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些注册表操作函数http://www.shnenglu.com/dragon/archive/2008/09/06/61113.htmlDragonDragonSat, 06 Sep 2008 05:01:00 GMThttp://www.shnenglu.com/dragon/archive/2008/09/06/61113.htmlhttp://www.shnenglu.com/dragon/comments/61113.htmlhttp://www.shnenglu.com/dragon/archive/2008/09/06/61113.html#Feedback0http://www.shnenglu.com/dragon/comments/commentRss/61113.htmlhttp://www.shnenglu.com/dragon/services/trackbacks/61113.html    1. 打开注册表键
   LONG RegOpenKeyEx(
  HKEY hKey,         // handle to open key主键
  LPCTSTR lpSubKey,  // subkey name子键
  DWORD ulOptions,   // reserved。必L0
  REGSAM samDesired, // security access maskd标识
  PHKEY phkResult    // handle to open keyq回的HKEYcd的指针。以后,dQ关闭用q个指针
  );

 

如:(x)
// 打开HKEY_LOCAL_MACHINE主键下的SoftWare\\Cleaner\\Cleaner子键
 HKEY hKEY;
 HKEY  hKeyRoot = HKEY_LOCAL_MACHINE;
 long ret0=(::RegOpenKeyEx(hKeyRoot,"SoftWare\\Cleaner\\Cleaner",0,KEY_READ,&hKEY));
 if(ret0!=ERROR_SUCCESS)//如果无法打开hKEY,则中止程序的执行
 {
  AfxMessageBox("错误Q无法打开有关的hKEY");
  return;
 }

    2. d注册?br> LONG RegQueryValueEx(
  HKEY hKey,            // handle to key打开注册表指?br>  LPCTSTR lpValueName,  // value name要读取的键名U?br>  LPDWORD lpReserved,   // reserved  must be NULL. 必须是NULL
  LPDWORD lpType,       // type bufferQ键cd。我最常用REG_SZ,REG_DWORD
  LPBYTE lpData,        // data buffer。保存查询结果的~冲?br>  LPDWORD lpcbData      // size of data buffer。缓冲区大小
);
如:(x)
// hKEY是上面打开时得到的指针?br> LPBYTE getValue = new BYTE[80];//得到的键?br> DWORD keyType = REG_SZ;//定义数据cd
 DWORD DataLen = 80;//定义数据长度
 CString strUser = _T("Version");//要查询的键名U?br> long ret1=::RegQueryValueEx(hKEY,strUser,NULL,&keyType,getValue,&DataLen);
 if(ret1!=ERROR_SUCCESS)
 {
  AfxMessageBox("错误Q无法查询有关的注册表信?);
  return;
 }

 

    3. 写注册表
  LONG RegSetValueEx(
  HKEY hKey,           // handle to key。打开注册表的指针
  LPCTSTR lpValueName, // value name 要写入的?br>  DWORD Reserved,      // reserved  必须?
  DWORD dwType,        // value type 写入值类?br>  CONST BYTE *lpData,  // value data 要写入的数据
  DWORD cbData         // size of value data 。数据SIZE
);
如:(x)
// 写注册表。修改Version?.0.12
// 写入CStringcd的数?br>CString strVersion = _T("Version");//要写入的键名U?br>LPCTSTR strVersionValue = "1.0.12";
long ret = ::RegSetValueEx(hKEY, strVersion, 0, REG_SZ, (const BYTE *) strVersionValue, strlen(strVersionValue)+1);
if(ret!=ERROR_SUCCESS)
{
 AfxMessageBox("错误Q无法查询有关的注册表信?);
 return;
}
[/code]

 

    4. 创徏一个新?br>LONG RegCreateKeyEx(
  HKEY hKey,                                  // handle to open key。打开的注册表指针
  LPCTSTR lpSubKey,                           // subkey name。子键名U?br>  DWORD Reserved,                             // reserved。必Mؓ(f)0
  LPTSTR lpClass,                             // class string。已l存在时用,一般ؓ(f)NULL
  DWORD dwOptions,                            // special options
               //默认值REG_OPTION_VOLATILEQ保存在注册表,下次开Z然存?br>               //REG_OPTION_VOLATILEQ保存在内存
               //REG_OPTION_BACKUP_RESTORE
  REGSAM samDesired,                          // desired security access。操作权限。一般KEY_ALL_ACCESSQ除非有Ҏ(gu)需要,h阅MSDN
  LPSECURITY_ATTRIBUTES lpSecurityAttributes, // inheritance。承性。一般ؓ(f)NULL
  PHKEY phkResult,                            // key handle 。返回该键值镇?br>  LPDWORD lpdwDisposition                     // disposition value buffer
             //REG_CREATED_NEW_KEY The key did not exist and was created.
           //REG_OPENED_EXISTING_KEY The key existed and was simply opened without being changed.

);

 

    5. 删除一个键
LONG RegDeleteKey(
  HKEY hKey,         // handle to open key
  LPCTSTR lpSubKey   // subkey name
);

 

    6. 删除一个键?br>LONG RegDeleteValue(
  HKEY hKey,            // handle to key
  LPCTSTR lpValueName   // value name。值名Uͼ不是打开的那个指针,是查询到的指针,如果为空RegSetValueEx创徏的值将被删?br>);

 

    7. h注册?br>LONG RegFlushKey(
  HKEY hKey   // handle to key to write。写入所有的|在给定的指针
);

//q个函数是将改变数据直接写到盘?sh),不要频繁使用Q会(x)影响性能

 

    8.  导入一个注册表文g到指定的键下
LONG RegLoadKey(
  HKEY hKey,        // handle to open key
  LPCTSTR lpSubKey, // subkey name
  LPCTSTR lpFile    // registry file name
);

//没有?/p>

 

    9. 关闭打开的注册表
LONG RegCloseKey(
  HKEY hKey   // handle to key to close
);

转蝲:http://blog.csdn.net/huangzhtao/archive/2008/08/04/2763638.aspx

Dragon 2008-09-06 13:01 发表评论
]]>
利用C盘序列号q行软g注册http://www.shnenglu.com/dragon/archive/2008/09/06/61103.htmlDragonDragonSat, 06 Sep 2008 03:41:00 GMThttp://www.shnenglu.com/dragon/archive/2008/09/06/61103.htmlhttp://www.shnenglu.com/dragon/comments/61103.htmlhttp://www.shnenglu.com/dragon/archive/2008/09/06/61103.html#Feedback0http://www.shnenglu.com/dragon/comments/commentRss/61103.htmlhttp://www.shnenglu.com/dragon/services/trackbacks/61103.html一个数据库pȝ的注册原?
    在讨前先来了(jin)解一下异或运的性质:
    若c=a^b;
    则a=c^b;b=a^c;

基本思\如下:
(1)int(用户C盘序列号^用户名^1234567890123)生成一个序列号N(是字W串CStringcd);
(2)pȝ(g)到你的软gq没注册p动生成一个文?文g保存?sh)(jin)你输入的用户名和序列?nbsp;    N.公司?x)叫你EMailq个文gC们公叔R?公司再返回一个注册码?
(3)如果发回一个注册码,pȝ?x)判?用户名^用户C盘序列号 =注册?/span>?来进入系l的!注册?nbsp;  功后再把用户名和注册码保存到pȝ文g(ini)中下ơ登陆就?x)检这个文?q次是判?nbsp;   用户名^注册?用户C盘序列号? 来判断进入系l了(jin)!

 

推理:
从上得到三条有用信息:
(1)用户名对于用户和公司来说都是已知?br>(2)int(用户C盘序列号^1234567890123)=N(l过Format变成字符?
(3)用户名^用户C盘序列号=注册?/span>

?1)和上面的异或性质推出:  atoi(N)^1234567890123=用户C盘序列号          (3)
?2)和异或性质推出:  注册?用户C盘序列号^用户?/span>                                      (4)

?3),(4)式再推出
注册?atoi(N)^1234567890123^用户?/span>
用户名和序列号N都发l了(jin)公司,公司是利用q条公司q行求注册码!

理解?jin)这个思\后我写?jin)个生成注册码的E序:
    是逆运吧?假如我是那公?发到我手上的信息已经有两个了(jin),用户名和序列号N;q样,主要我用atoi(序列?^1234567890123可以求得注册码?只不q在做的时候就是类型{换有点复杂吧?!

Z(jin)便于复习(fn)把代码脓(chung)出来:

 LPCTSTR lpRootPathName="C:\\";
 LPTSTR lpVolumeNameBuffer=new char[12];
 DWORD nVolumnNameSize=12;
 DWORD MaximumComponentLength;
 DWORD FileSystemFlags;
 LPTSTR lpFileSystemNameBuffer=new char[10];
 DWORD FileSystemNameLength=12;
 GetVolumeInformation(lpRootPathName,lpVolumeNameBuffer,nVolumnNameSize,&m_VolumnSerialNumber,&MaximumComponentLength,&FileSystemFlags,lpFileSystemNameBuffer,FileSystemNameLength);
 delete(lpVolumeNameBuffer);
 delete(lpFileSystemNameBuffer);

上面是C盘序列号攑ֈDWORDcd的m_VolumnSerialNumber?


sSerialNumber.Format("%d",m_VolumnSerialNumber^1234567890123);

生成的序列号׃存在sSerialNumber?
int(用户C盘序列号^1234567890123)=N已经完成!


下面?用户名^用户C盘序列号=注册?br>CString sName,sNameCode,sCode; 
this->m_EdtUserName.GetWindowText(sName);
char * cNameCode=sName.GetBuffer(sName.GetLength());
DWORD dNameCode=*cNameCode;
sCode.Format("%d",m_VolumnSerialNumber^dNameCode);

sCode׃存(sh)(jin)注册?

 

 

 


 



Dragon 2008-09-06 11:41 发表评论
]]>
在VC++中读写INI文ghttp://www.shnenglu.com/dragon/archive/2008/09/05/61071.htmlDragonDragonFri, 05 Sep 2008 15:43:00 GMThttp://www.shnenglu.com/dragon/archive/2008/09/05/61071.htmlhttp://www.shnenglu.com/dragon/comments/61071.htmlhttp://www.shnenglu.com/dragon/archive/2008/09/05/61071.html#Feedback0http://www.shnenglu.com/dragon/comments/commentRss/61071.htmlhttp://www.shnenglu.com/dragon/services/trackbacks/61071.html  在我们写的程序当?L一些配|信息需要保存(sh)?以便完成E序的功?最单的办法是这些信息写入INI文g?E序初始化时再读?具体应用如下:

  一.信息写?INI文g?

  1.所用的WINAPI函数原型?

BOOL WritePrivateProfileString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpString,
LPCTSTR lpFileName
);

  其中各参数的意义:

   LPCTSTR lpAppName 是INI文g中的一个字D名.

   LPCTSTR lpKeyName 是lpAppName下的一个键?通俗讲就是变量名.

   LPCTSTR lpString 是键?也就是变量的?不过必须为LPCTSTR型或CString型的.

   LPCTSTR lpFileName 是完整的INI文g?

  2.具体使用Ҏ(gu):讄有一名学?需把他的姓名和q龄写入 c:\stud\student.ini 文g?

CString strName,strTemp;
int nAge;
strName="张三";
nAge=12;
::WritePrivateProfileString("StudentInfo","Name",strName,"c:\\stud\\student.ini");

  此时c:\stud\student.ini文g中的内容如下:

   [StudentInfo]
   Name=张三

  3.要将学生的年龄保存(sh)?只需整型的值变?sh)字W型卛_:

strTemp.Format("%d",nAge);
::WritePrivateProfileString("StudentInfo","Age",strTemp,"c:\\stud\\student.ini");

 ?信息从INI文g中读入程序中的变?

  1.所用的WINAPI函数原型?

DWORD GetPrivateProfileString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpDefault,
LPTSTR lpReturnedString,
DWORD nSize,
LPCTSTR lpFileName
);

  其中各参数的意义:

   前二个参C WritePrivateProfileString中的意义一?

   lpDefault : 如果INI文g中没有前两个参数指定的字D名或键?则将此Dl变?

   lpReturnedString : 接收INI文g中的值的CString对象,即目的缓存器.

   nSize : 目的~存器的大小.

   lpFileName : 是完整的INI文g?

  2.具体使用Ҏ(gu):现要上一步中写入的学生的信息dE序?

CString strStudName;
int nStudAge;
GetPrivateProfileString("StudentInfo","Name","默认姓名",strStudName.GetBuffer(MAX_PATH),MAX_PATH,"c:\\stud\\student.ini");

  执行?strStudName 的gؓ(f):"张三",若前两个参数有误,其gؓ(f):"默认姓名".

  3.d整型D用另一个WINAPI函数:

UINT GetPrivateProfileInt(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
INT nDefault,
LPCTSTR lpFileName
);

  q里的参数意义与上相?使用Ҏ(gu)如下:

nStudAge=GetPrivateProfileInt("StudentInfo","Age",10,"c:\\stud\\student.ini");


 ?循环写入多个?讄有一E序,要将最q用的几个文g名保存(sh)?具体E序如下:

  1.写入:

CString strTemp,strTempA;
int i;
int nCount=6;
file://共有6个文件名需要保?br>for(i=0;i
{strTemp.Format("%d",i);
strTempA=文g?
file://文g名可以从数组,列表框等处取?
::WritePrivateProfileString("UseFileName","FileName"+strTemp,strTempA,
"c:\\usefile\\usefile.ini");
}
strTemp.Format("%d",nCount);
::WritePrivateProfileString("FileCount","Count",strTemp,"c:\\usefile\\usefile.ini");
file://文件L写入,以便d.

  2.d:

nCount=::GetPrivateProfileInt("FileCount","Count",0,"c:\\usefile\\usefile.ini");
for(i=0;i
{strTemp.Format("%d",i);
strTemp="FileName"+strTemp;
::GetPrivateProfileString("CurrentIni",strTemp,"default.fil", strTempA.GetBuffer(MAX_PATH),MAX_PATH,"c:\\usefile\\usefile.ini");

file://使用strTempA中的内容.

}

  补充四点:

   1.INI文g的\径必d?文g名前面的各目录必须存在,否则写入不成?该函数返?FALSE ?

   2.文g名的路径中必Mؓ(f) \\ ,因ؓ(f)在VC++? \\ 才表CZ?\ .

   3.也可INI文g攑֜E序所在目?此时 lpFileName 参数? ".\\student.ini".

   4.从网中_脓(chung)源代码时,最好先_脓(chung)臌事本?再往VC中粘?否则易造成~译错误,开始时我也十分不解,好好的代码怎么׃对呢?后来才找到这个方?q有一些代码中使用?jin)全角字W如:Q,Q等,也会(x)
造成~译错误.

?http://blog.csdn.net/paobo/archive/2007/05/14/1607733.aspx


Dragon 2008-09-05 23:43 发表评论
]]>
PreTranslateMessagehttp://www.shnenglu.com/dragon/archive/2008/09/05/61069.htmlDragonDragonFri, 05 Sep 2008 15:30:00 GMThttp://www.shnenglu.com/dragon/archive/2008/09/05/61069.htmlhttp://www.shnenglu.com/dragon/comments/61069.htmlhttp://www.shnenglu.com/dragon/archive/2008/09/05/61069.html#Feedback0http://www.shnenglu.com/dragon/comments/commentRss/61069.htmlhttp://www.shnenglu.com/dragon/services/trackbacks/61069.htmlPreTranslateMessage的理?
    PreTranslateMessage只能处理消息队列中的消息,也就是由PostMessage发出的消?鼠标键盘消息{?
    SendMessage发送的消息q不攑֜消息队列?而是直接调用处理函数q行处理,所以这U消息用PreTranslateMessage的捕获不到的,如WM_KIllFOCUS和W(xu)M_SETFOCUS.
    SendMessage的消息是直接执行处理函数?它要{消息执行完才返?执行完SendMessage函数);而PostMessage则把消息发送后立即q回,把消息挂到消息队列中{待执行,所以以下的E序是错?!
#include <windows.h>
int main()
{
  PostMessage(HWND_BROADCAST,WM_QUIT,0,0);
  return 0;
}

PostMessage消息WM_QUIT发送到消息队列?׃PostMessage的立卌?即结?执行下一句语句结束整个程?消息q挂在消息队列中未处理故出错!!



Dragon 2008-09-05 23:30 发表评论
]]>
我对VC中用extern的一个经?/title><link>http://www.shnenglu.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.shnenglu.com/dragon/archive/2008/09/05/60997.html</guid><wfw:comment>http://www.shnenglu.com/dragon/comments/60997.html</wfw:comment><comments>http://www.shnenglu.com/dragon/archive/2008/09/05/60997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/dragon/comments/commentRss/60997.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/dragon/services/trackbacks/60997.html</trackback:ping><description><![CDATA[我对VC中用extern的一个经?<br>        我在CXXApp theApp的旁边加?jin)一个布?yu)(dng)类型的全局变量,如下:<br>        CXXApp theApp;<br>        bool p_Try;<br>然后我在其它的对话中调用出错了(jin),无法识别p_Try,后来也是无意中看C(jin)在某个头文g中看C(jin)extern bool p_Try;而这个头文g是定义CXXAppcȝ文g,q个头文件基本上都包含在其它文g?除了(jin)一些自己定义的).<br>        可以看出d?jin)bool p_Try;q要l过extern bool p_Try才可以调用该变量.最后上|查?extern bool p_Try只不q是一个声明吧?所以我们在调用全局变量时要事先用extern告诉调用者这个是全局变量!有这L(fng)变量存在!<br>        所以bool p_Try;只能用一?是定?<br>        extern bool p_Try;可以用多?是声? <img src ="http://www.shnenglu.com/dragon/aggbug/60997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/dragon/" target="_blank">Dragon</a> 2008-09-05 15:25 <a href="http://www.shnenglu.com/dragon/archive/2008/09/05/60997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CFileDialog文g选择对话框的使用http://www.shnenglu.com/dragon/archive/2008/09/03/60865.htmlDragonDragonWed, 03 Sep 2008 15:37:00 GMThttp://www.shnenglu.com/dragon/archive/2008/09/03/60865.htmlhttp://www.shnenglu.com/dragon/comments/60865.htmlhttp://www.shnenglu.com/dragon/archive/2008/09/03/60865.html#Feedback0http://www.shnenglu.com/dragon/comments/commentRss/60865.htmlhttp://www.shnenglu.com/dragon/services/trackbacks/60865.htmlCFileDialog文g选择对话框的使用Q首先构造一个对象ƈ提供相应的参敎ͼ构造函数原型如下:(x)
CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );参数意义如下Q?

  • bOpenFileDialog 为TRUE则显C打开对话框,为FALSE则显CZ存对话文件对话框?
  • lpszDefExt 指定默认的文件扩展名?
  • lpszFileName 指定默认的文件名?
  • dwFlags 指明一些特定风根{?
  • lpszFilter 是最重要的一个参敎ͼ它指明可供选择的文件类型和相应的扩展名。参数格式如Q?
    "Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";文gcd说明和扩展名间用 | 分隔Q同U类型文件的扩展名间可以?; 分割Q每U文件类型间?| 分隔Q末 || 指明?
  • pParentWnd 为父H口指针?
创徏文g对话框可以用DoModal()Q在q回后可以利用下面的函数得到用户选择Q?
  • CString CFileDialog::GetPathName( ) 得到完整的文件名Q包括目录名和扩展名如:(x)c:\test\test1.txt
  • CString CFileDialog::GetFileName( ) 得到完整的文件名Q包括扩展名如:(x)test1.txt
  • CString CFileDialog::GetExtName( ) 得到完整的文件扩展名Q如Qtxt
  • CString CFileDialog::GetFileTitle ( ) 得到完整的文件名Q不包括目录名和扩展名如Qtest1
  • POSITION CFileDialog::GetStartPosition( ) 对于选择?jin)多个文件的情况得到W一个文件位|?
  • CString CFileDialog::GetNextPathName( POSITION& pos ) 对于选择?jin)多个文件的情况得到下一个文件位|,q同时返回当前文件名。但必须已经调用qPOSITION CFileDialog::GetStartPosition( )来得到最初的POSITION变量?

 

 [一些小?j)得]

?
CFileDialog GetFile(TRUE,NULL,NULL,OFN_FILEMUSTEXIST,"Microsoft Excel(*.xls)|*.xls|All Files(*.*)|*.*||");

CFileDialog GetFile(打开文g对话?TRUE),扩展?NULL),文g?NULL),风格-文g必须存在(OFN_FILEMUSTEXIST),查看文gcd-EXCEL文g,所有文?Microsoft Excel(*.xls)|*.xls|All Files(*.*)|*.*||);

风格的宏定义

#define OFN_READONLY                 0x00000001
#define OFN_OVERWRITEPROMPT          0x00000002
#define OFN_HIDEREADONLY             0x00000004
#define OFN_NOCHANGEDIR              0x00000008
#define OFN_SHOWHELP                 0x00000010
#define OFN_ENABLEHOOK               0x00000020
#define OFN_ENABLETEMPLATE           0x00000040
#define OFN_ENABLETEMPLATEHANDLE     0x00000080
#define OFN_NOVALIDATE               0x00000100
#define OFN_ALLOWMULTISELECT         0x00000200
#define OFN_EXTENSIONDIFFERENT       0x00000400
#define OFN_PATHMUSTEXIST            0x00000800
#define OFN_FILEMUSTEXIST            0x00001000
#define OFN_CREATEPROMPT             0x00002000
#define OFN_SHAREAWARE               0x00004000
#define OFN_NOREADONLYRETURN         0x00008000
#define OFN_NOTESTFILECREATE         0x00010000
#define OFN_NONETWORKBUTTON          0x00020000
#define OFN_NOLONGNAMES              0x00040000     // force no long names for 4.x modules
#if(WINVER >= 0x0400)
#define OFN_EXPLORER                 0x00080000     // new look commdlg
#define OFN_NODEREFERENCELINKS       0x00100000
#define OFN_LONGNAMES                0x00200000     // force long names for 3.x modules
#define OFN_ENABLEINCLUDENOTIFY      0x00400000     // send include message to callback
#define OFN_ENABLESIZING             0x00800000
#endif /* WINVER >= 0x0400 */
#if (_WIN32_WINNT >= 0x0500)
#define OFN_DONTADDTORECENT          0x02000000
#define OFN_FORCESHOWHIDDEN          0x10000000    // Show All files including System and hidden files
#endif // (_WIN32_WINNT >= 0x0500)

q个׃解释?应该都能看懂?/p>

需要注意的?用了(jin)CFileDialog之后,?x)把E序的当前\径设|成选中文g的\?br>所?如果E序里有用到IO讉K或者数据库讉K之类的本地操作时,需要注意你的当前\?br>用相对\径的话就不是原来你的E序路径?切记!
转蝲?http://blog.csdn.net/beiouwolf/archive/2007/04/09/1557219.aspx



Dragon 2008-09-03 23:37 发表评论
]]>
E序q入之前的一个画?/title><link>http://www.shnenglu.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.shnenglu.com/dragon/archive/2008/09/03/60810.html</guid><wfw:comment>http://www.shnenglu.com/dragon/comments/60810.html</wfw:comment><comments>http://www.shnenglu.com/dragon/archive/2008/09/03/60810.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/dragon/comments/commentRss/60810.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/dragon/services/trackbacks/60810.html</trackback:ping><description><![CDATA[<p>在进入一个系l前往往先显CZ张图?然后到图片消?再进入登陆界面的.<br>其中做法如下:<br>(1)先创Z个无Ҏ(gu)的对话框.插入一个对话框,然后叛_讄"属?,?样式"属性页选择<br>   无边?"样式"讄?弹出".</p> <p>(2)然后我们要做的是看看加蝲位图的图片大?拉一个随便大的"囑փ"控g,叛_属??br>   "常规"属性页?cd"中选择"位图";然后"囑փ"选择你要加蝲的位图ID(q个位图资源?</p> <p>  先插入到工程?,然后关闭属性对话框,可以在最右下角中昄你的囄大小?</p> <p>(3)因ؓ(f)q样没办法调整图片覆盖整个对话框,我就把这个图片控件删除掉,再事先把对话框调 </p> <p>  整大到刚刚囄的大?调整的方法是Ҏ(gu)边看最右下方的昄,调整到是囄的大ؓ(f)  </p> <p> ?好啦,对话框调整后,我拉Z?囄"控g,注意,q次我们要从对话框的最左上角一   </p> <p>直拉到对话框的最右下角才?q才能确保图片整个覆?拉出来后,按照刚刚的做法?nbsp;  </p> <p>位图加蝲q来,看看效果!</p> <p>     来说说先弹出后消q实现,话框创徏一个新c?个类dOnInitDialog()函数</p> <p>和OnTimer()函数,代码如下:<br>void CDBegin::OnTimer(UINT nIDEvent) <br>{<br> CDialog::OnTimer(nIDEvent);<br> this->KillTimer(1);<br> this->OnCancel();<br>        //下面是对话框消失后要做的工作!</p> <p>}</p> <p>BOOL CDBegin::OnInitDialog() <br>{<br> CDialog::OnInitDialog();<br> this->SetTimer(1,1400,NULL); <br> return TRUE;  // return TRUE unless you set the focus to a control<br>               // EXCEPTION: OCX Property Pages should return FALSE<br>}</p> <p>最后在调用此对话框的类中添加头文g卛_!!(记得要添?</p> <img src ="http://www.shnenglu.com/dragon/aggbug/60810.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/dragon/" target="_blank">Dragon</a> 2008-09-03 14:00 <a href="http://www.shnenglu.com/dragon/archive/2008/09/03/60810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>真彩位图工具栏的实现http://www.shnenglu.com/dragon/archive/2008/09/03/60799.htmlDragonDragonWed, 03 Sep 2008 03:33:00 GMThttp://www.shnenglu.com/dragon/archive/2008/09/03/60799.htmlhttp://www.shnenglu.com/dragon/comments/60799.htmlhttp://www.shnenglu.com/dragon/archive/2008/09/03/60799.html#Feedback0http://www.shnenglu.com/dragon/comments/commentRss/60799.htmlhttp://www.shnenglu.com/dragon/services/trackbacks/60799.html制作真彩工具栏的主要步骤Q?/p>

①用l图工具Q我用的是FireworksQ制作三?4位位图?/font>其中Q?/p>

30.bmp为工具可用时昄的位图:(x)

31.bmp为工具不可用Q变灎ͼ(j)时显C的位图Q?/p>

32.bmp为鼠标进入工h钮时昄的位图:(x)

q里Q每张位图中按钮的个数和大小可根据实际应用进行修改,本例中,每张位图?4个按钮,每个按钮大小?0×20?/p>

q个制作q程是比较繁琐的Q首先我把找来的图片{换成24位位图,在Fireworks下把它{换ؓ(f)20×20的大后保存Q再用Fireworks把它转换为灰色位囑֒带边框的位图q分别保存。然后再把三l小囄分别拼接hp?jin)?/p>

②把三个位图导入资源Q作为Bitmap资源Q?/font>Q尽在VC++下不能显C和~辑Q但使用上没有问题。把三个位图的ID依次改ؓ(f)Q?br>IDB_TOOLBARCOLOR、IDB_TOOLBARDISABLE、IDB_TOOLBARHOT

③在资源的工h目中添加一个新的工hQ如图)(j)QID改ؓ(f)IDR_TOOLBARQ工h钮的宽度和高度都改ؓ(f)20。在上面依次d14个按钮ƈ分好l,按钮上的内容无关紧要Q只要不是空的就行了(jin)。删除系l原来的工具栏IDR_MAINFRAME?/p>

q个工具栏在昄Ӟ我们?x)用上面的位图替换各按钮?/p>

④在MainFrm.h中定义三个位囑ֈ表对象和一个函数定义:(x)

MainFrm.hQ?/span>

CImageList    m_imageToolBar;
CImageList    m_imageToolBarDisable;
CImageList    m_imageToolBarHot;
void InitToolBar();

⑤在MainFrm.cpp中修改工h的设|部分:(x)

MainFrm.cppQ?/span>

if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
    | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    !m_wndToolBar.LoadToolBar( IDR_TOOLBAR ))  //指定工具栏ID?/span>
{
    TRACE0("Failed to create toolbar\n");
    return -1;      // fail to create
}
InitToolBar();    //讄真彩工具?/font>

q里要把原工h的IDQIDR_MAINFRAMEQ修改ؓ(f)新工h的IDQIDR_TOOLBARQ,再调用函数InitToolBar()讄新工h?/p>

⑥添加设|工h的函数InitToolBar()Q?/p>
void CMainFrame::InitToolBar()
{
    CBitmap bm;

    //zd的工?/span>
    m_imageToolBar.Create( 20, 20, TRUE | ILC_COLOR24, 11, 0 );
    bm.LoadBitmap( IDB_TOOLBARCOLOR );
    m_imageToolBar.Add( &bm,(CBitmap*)NULL );
    bm.Detach();
    m_wndToolBar.GetToolBarCtrl().SetImageList( &m_imageToolBar );

    //止的工?/span>
    m_imageToolBarDisable.Create( 20, 20, TRUE | ILC_COLOR24, 11, 0 );
    bm.LoadBitmap( IDB_TOOLBARDISABLE );
    m_imageToolBarDisable.Add( &bm,(CBitmap*)NULL );
    bm.Detach();
    m_wndToolBar.GetToolBarCtrl().SetDisabledImageList( &m_imageToolBarDisable );

    //当前的工?/span>
    m_imageToolBarHot.Create( 20, 20, TRUE | ILC_COLOR24, 11, 0 ); 
    bm.LoadBitmap( IDB_TOOLBARHOT );
    m_imageToolBarHot.Add( &bm,(CBitmap*)NULL );
    bm.Detach();
    m_wndToolBar.GetToolBarCtrl().SetHotImageList( &m_imageToolBarHot );
}

其中在Create()函数中的参数依次为按钮宽度、高度?4位位囑֒按钮个数?/p>

q样一个用24位位囄成的真彩工具栏就做好?jin),如果你的l图能力很强Q可以修?2.bmpQ按钮h很好的动感。至于各按钮的响应方法与普通工h是一L(fng)?/p>

CZE序界面Q?br>

转蝲?http://www.bttc.cn/jsj/Html/vc/wen/vcwen08.htm



Dragon 2008-09-03 11:33 发表评论
]]>
讑֤坐标和逻辑坐标http://www.shnenglu.com/dragon/archive/2008/09/02/60766.htmlDragonDragonTue, 02 Sep 2008 12:30:00 GMThttp://www.shnenglu.com/dragon/archive/2008/09/02/60766.htmlhttp://www.shnenglu.com/dragon/comments/60766.htmlhttp://www.shnenglu.com/dragon/archive/2008/09/02/60766.html#Feedback0http://www.shnenglu.com/dragon/comments/commentRss/60766.htmlhttp://www.shnenglu.com/dragon/services/trackbacks/60766.html讑֤坐标Q一个实际物理屏q是由像素组成的如^常所说的640×480Q?024 ×768指的是昄器的实际宽度和高度的像素数目?
VC++l图有好几种模式Q默认情况下是MM_TEXTQ在此模式下l图是讑֤坐标Q因为它的单位是像素Q?

客户坐标Q是指在客户区的坐标p,客户==你!哈哈你定义的坐标pR可以在现有的绘图映像模式下通过坐标变换的到你的坐标pR如你在一个映像模式坐标系下的客户坐标原点为(xQyQ,那客户坐标系的坐标换成映像模式坐标p?jin),数学问题多说了(jin)!哈?
感觉你应该问逻辑坐标Q逻辑坐标不以屏幕的像素个Cؓ(f)标准。在屏幕上是多长实际是多长。MM_LOMETRICQMM_HIMETRIC{映像模?

映像识别?逻辑单位 X和Y轴正?
MM_TEXT 1 Pixels(像素) 右下
MM_LOMETRIC 2 0.1mm 右上
MM_HIMETRIC 3 0.01mm 右上
MM_LONGLISH 4 0.1inch 右上
MM_HIENGLISH 5 0.01inch 右上
MM_TWIPS 6 1/1440inch 右上
MM_ISOTROPIC 7 Variable(x==y) 变化?
MM_ANISOTROPIC 8 Variable(x<>y) 变化?
原点 都在左上?/p>

Dragon 2008-09-02 20:30 发表评论
]]>
没有ActiveMovieControl Objectq个控ghttp://www.shnenglu.com/dragon/archive/2008/09/02/60762.htmlDragonDragonTue, 02 Sep 2008 12:20:00 GMThttp://www.shnenglu.com/dragon/archive/2008/09/02/60762.htmlhttp://www.shnenglu.com/dragon/comments/60762.htmlhttp://www.shnenglu.com/dragon/archive/2008/09/02/60762.html#Feedback15http://www.shnenglu.com/dragon/comments/commentRss/60762.htmlhttp://www.shnenglu.com/dragon/services/trackbacks/60762.html"开?->"q行"->"输入regsvr32 msdxm.ocx"->"定"
?x)弹Z个对话框说成功的!!

Dragon 2008-09-02 20:20 发表评论
]]>
判断一个CString是否为空http://www.shnenglu.com/dragon/archive/2008/09/02/60755.htmlDragonDragonTue, 02 Sep 2008 12:02:00 GMThttp://www.shnenglu.com/dragon/archive/2008/09/02/60755.htmlhttp://www.shnenglu.com/dragon/comments/60755.htmlhttp://www.shnenglu.com/dragon/archive/2008/09/02/60755.html#Feedback0http://www.shnenglu.com/dragon/comments/commentRss/60755.htmlhttp://www.shnenglu.com/dragon/services/trackbacks/60755.htmlCString str;
str += '\0';
int len = str.GetLength();
得到l(f)en=1;
但str=="", q回的是true;
因ؓ(f)真正比较的时候只是单U的逐个字符比较, '\0'作ؓ(f)l束W?
CString str2;
str==str2q回也是true, 因ؓ(f)str2被隐式{换ؓ(f)LPTCSTR, 比较也是一L(fng).
所以说应避免str += '\0'q样的写?
在CString的用过E中应该忘记'\0'的存?
但声明一个char str[]; 必须memset(...)??不然ȝ(ch)?

Dragon 2008-09-02 20:02 发表评论
]]>
个hҎ(gu)息映的一点理?/title><link>http://www.shnenglu.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.shnenglu.com/dragon/archive/2008/09/02/60754.html</guid><wfw:comment>http://www.shnenglu.com/dragon/comments/60754.html</wfw:comment><comments>http://www.shnenglu.com/dragon/archive/2008/09/02/60754.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/dragon/comments/commentRss/60754.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/dragon/services/trackbacks/60754.html</trackback:ping><description><![CDATA[<p>        q是一自q解所写的文章Q若我有哪些地方理解不正的Q请指出Q不惌D者?br>        在可视化的消息中Q我们会(x)发现他三个地方加?jin)代码,但有的不同,在头文g中加的不是afx_msg开_(d)而用virtual,如OnOK<br>函数。一般加的代码的步骤是:(x)<br>1.在头文g中加?j)afx_msg 开头的函数声明.<br>2.在实现文件的BEGIN_MESSAGE_MAP和END_MESSAGE_MAP()之间加ON_WM_或ON_MESSAGE的代?br>3.最后还是在实现文g里加函数的实?/p> <p><br>        但我q是有点不理?最后想自己写一个自定义的消息映程?虽然没有写出?但还是根据这些来猜这机制的执行原?q些<br>E序都是上网查到?<br>1.在头文g?<br>  #define WM_MYMSG  WM_USER+5//自定义一个消?br>  afx_msg void OnMyMessage(WPARAM wParam, LPARAM lParam); //自定义消息的处理函数声明</p> <p><br>2.在实现文仉?<br>  ON_MESSAGE(WM_MYMSG, OnMyMessage)<br>  //利用ON_MESSAGE()宏在自定义消息与其处理函数间建立映射关系</p> <p><br>void CModelessDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)<br>//从lParam中取出CString对象的指?q将字符串内容在IDC_MSGEDIT中显C出?br>{</p> <p>    CString *str;<br>    str=(CString *)lParam;</p> <p>    SetDlgItemText(IDC_EDIT,*str);<br>}</p> <p><br>void CModelessDlg::OnMsgBTN() <br>{</p> <p> CString str= "自定义消息被触发?jin)?;</p> <p> SendMessage(WM_MYMSG, 0, (LPARAM) &str);<br> //lModelessDlg自己发一个自定义的消?br>}</p> <p>        我的理解:它是Ҏ(gu)WM_MYMSG来确定参数的值的(wParam,lParam),对于每一个消息操作函数来定他的参数?q里的SendMessage函数把WM_MYMSG?wParam)0?lParam)&str捆绑在一起了(jin),所?在我们用消息处理函数OnMyMessage()?我们若要用到参数时我们就可以用这两个参数,在这的参C|应该不可以改变的吧,我猜?<br>后来看到一本书Q自定义的消息函C般带wParam,lParamq两个参敎ͼ加下面一D代码增加理解:(x)<br><br>暂时理解消息函数是通过消息(WM_)对应的参?wParam.lParam).</p> <p>BOOL CServerDlg::PreTranslateMessage(MSG* pMsg) <br>{<br> if (pMsg->message == WM_SOCKET)<br> {<br>  m_sockCur = pMsg->wParam;<br>  m_nCurMsg = pMsg->lParam;<br> }<br> return CDialog::PreTranslateMessage(pMsg);<br>}<br>通过WM_SOCKET兌 pMsg->wParam和pMsg->lParam?br>         但当我在用WSAAsyncSelect函数时没有看C的消息参?假如在这里是WM_SOCKET_READ)未与一些参数关联在一?而且q个参数q是我自定义?不是pȝ本n有的,它是用来接收消息的参数的,后来我查MSDN时发C的描q是q样?<br>   <br>   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  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)       HIWORD(lParam)<br>#define WSAGETSELECTEVENT(lParam)       LOWORD(lParam)<br><br>    当一个指定的|络事g发生在指定的套接字s上时,应用E序的窗口句柄接收到一条消息wMsg,wParam识别|络事g发生在哪一个套接字?lParam的低字段则指定发生的|络事g,高字D包括Q意的错误代码,错误代码在Winsock2.h文g中定?<br>    q事件和错误可以从lParam通过调用宏WSAGETSELECTERROR ?WSAGETSELECTEVENT提取,在Winsock2.h文g中定义ؓ(f):<br>    #define WSAGETSELECTERROR(lParam)       HIWORD(lParam)<br>    #define WSAGETSELECTEVENT(lParam)       LOWORD(lParam)</p> <p><br>可以看出WSAAsyncSelect收到的参数还是在其它地方作过兌?不然它也不会(x)有?wParam,lParam),q是我的推理,未证?<br>    <br>typedef UINT WPARAM;(wParam的类型,w表示WORD)<br>typedef LONG LPARAM;(lParam的类?l表示LONG)</p> <img src ="http://www.shnenglu.com/dragon/aggbug/60754.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/dragon/" target="_blank">Dragon</a> 2008-09-02 19:59 <a href="http://www.shnenglu.com/dragon/archive/2008/09/02/60754.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有些控g兌变量的创?/title><link>http://www.shnenglu.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.shnenglu.com/dragon/archive/2008/09/02/60745.html</guid><wfw:comment>http://www.shnenglu.com/dragon/comments/60745.html</wfw:comment><comments>http://www.shnenglu.com/dragon/archive/2008/09/02/60745.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/dragon/comments/commentRss/60745.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/dragon/services/trackbacks/60745.html</trackback:ping><description><![CDATA[有些控g兌变量的创建:(x)<br>    当你拉出一个单选框?在类向导里是不能看到它的ID?只要把属性里?#8220;l?#8221;N就可以在类向导里看到ID?jin)?br>    q有的是"?rn)态文?,要把IDC_STATI改过才可以在cd导里创徏兌变量!! <img src ="http://www.shnenglu.com/dragon/aggbug/60745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/dragon/" target="_blank">Dragon</a> 2008-09-02 19:35 <a href="http://www.shnenglu.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.shnenglu.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.shnenglu.com/dragon/archive/2008/09/02/60744.html</guid><wfw:comment>http://www.shnenglu.com/dragon/comments/60744.html</wfw:comment><comments>http://www.shnenglu.com/dragon/archive/2008/09/02/60744.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/dragon/comments/commentRss/60744.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/dragon/services/trackbacks/60744.html</trackback:ping><description><![CDATA[<p>在MFC中全局函数的添加可以这P(x)<br>   先创Z个头文gQ专攑և数的声明Q然后再创徏一个实现文?CPP),专放函数的实?<br>如我今天所创徏的如?<br>头文?<br>#include "stdafx.h"http://注意要加q个<br>unsigned int HashOf(CString Str);<br>//加密<br>CString Encrypt(CString Str);<br>//解密<br>CString UnEncrypt(CString Str);</p> <p>实现文g:<br>#include "stdafx.h"http://注意也要加这?br>#include "Security.h"<br>unsigned int HashOf(CString Str)<br>{<br> int i, key;<br> key = 0;<br> for(i = 0; i < Str.GetLength(); i++)<br> {<br>  key = ((key << 2) | (key >> 30))^(Str.GetAt(i));<br> }<br> return key;<br>};<br>//加密<br>CString Encrypt(CString Str)<br>{<br> return Str;<br>}<br>//解密<br>CString UnEncrypt(CString Str)<br>{<br> return Str;<br>}</p> <p>创徏之后,记得在要用到q些函数的文件中包含q些文g.</p> <img src ="http://www.shnenglu.com/dragon/aggbug/60744.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/dragon/" target="_blank">Dragon</a> 2008-09-02 19:30 <a href="http://www.shnenglu.com/dragon/archive/2008/09/02/60744.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>怎样完全删除一个类http://www.shnenglu.com/dragon/archive/2008/09/02/60741.htmlDragonDragonTue, 02 Sep 2008 11:24:00 GMThttp://www.shnenglu.com/dragon/archive/2008/09/02/60741.htmlhttp://www.shnenglu.com/dragon/comments/60741.htmlhttp://www.shnenglu.com/dragon/archive/2008/09/02/60741.html#Feedback0http://www.shnenglu.com/dragon/comments/commentRss/60741.htmlhttp://www.shnenglu.com/dragon/services/trackbacks/60741.html1.在File view下删除你要删除的CPP和H文g,然后打开工程文g?删除里面对应的CPP和H文g.
2.再次打开工程,然后Ҏ(gu)?>cd?它会(x)提示你要删除什么的,你按定Removep?

Dragon 2008-09-02 19:24 发表评论
]]>
þþƷþһ| ƷþþþþĻ| ĻƷѾþ| ŷƷþø| պľþ| þþþŷղAV | þݹƷһ| ɫۺϾþۺۿ| þùƷһ| þ¶ݺɫ| 69SEXþþƷ鶹| ˾Ʒþ| þþŷղAV| ŷִִþþ| Ʒþþþþþþþ| þþƷav鶹ͼƬ | ҹƷþþþþӰ777| ˾þô߽AVۺӰԺ | ѾþþƷ99þ| ĻƷþþþþ3Dն | vvaþ| ǾþþƷ| þþƷӰԺ| AVһþ| þùۺϾƷ| þþþ޾Ʒһ| þ93Ʒ91þۺ| ɫۺϾþþþר| AŮAVۺϾþþ| þòӰ| ޾þһح | ޾ƷҹVAþó| þþþĻƷ| þþ뾫ƷպĦ | þɫۺһ| 99þһa| ѾƷþ| þþƷѲ| ˺ݺۺϾþ88| Ʒþþþþþ| þۺϳDž|