小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

MFC 消息處理方法-自定義消息-攔截-變更-攔截關(guān)機(jī)重啟消息

 筆錄收藏 2012-09-11

/****************************************************************
編程筆記:在MFC中常用的消息處理方法
編寫作者:Coderui
整理日期:2009年11月04日
編寫語言:C++(MFC)
編譯環(huán)境:VC++ 6.0
聯(lián)系郵箱:
作者博客:http://hi.baidu.com/coderui
****************************************************************/

一、自定義消息

假如想在CMyMessageDlg類中添加自定義消息:

1、在頭文件"MyMessageDlg.h"中添加自定義消息的宏聲明:
#define WM_USER_MYMESSAGE WM_USER + 100

2、在頭文件"MyMessageDlg.h"中添加消息映射函數(shù)的聲明:
afx_msg void OnMyMessageProc(WPARAM wParam, LPARAM lParam);

3、在文件"MyMessageDlg.cpp"中添加處理自定義消息的宏:
ON_MESSAGE(WM_USER_MYMESSAGE, OnMyMessageProc)

4、在文件"MyMessageDlg.cpp"中添加自定義消息函數(shù)的實(shí)現(xiàn)部分:
void CMyMessageDlg::OnMyMessageProc(WPARAM wParam, LPARAM lParam)
{
// ……
}

5、觸發(fā)自定義消息的方法:
void CMyMessageDlg::OnOK()
{
// 調(diào)用自定義消息
SendMessage(WM_USER_MYMESSAGE, (WPARAM)0, (LPARAM)0);
}

二、消息攔截

假如想攔截自定義消息“WM_USER_MYMESSAGE”和系統(tǒng)消息“WM_SIZE”:
#define WM_USERMESSAGE_NULL WM_USER+32   // 自定義消息

重載WindowProc函數(shù),在函數(shù)中實(shí)現(xiàn)消息的攔截
LRESULT CMyMessageDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
switch (message)
{
case WM_USERMESSAGE:
   AfxMessageBox("自定義消息攔截");

   // 如果在這里把消息銷毀掉,不讓其正確轉(zhuǎn)發(fā),則對(duì)應(yīng)的消息處理函數(shù)就不會(huì)被調(diào)用了。
//   message WM_USERMESSAGE_NULL;
   break ;

case WM_SIZE:
   AfxMessageBox("系統(tǒng)消息攔截");
   break ;
}

return CDialog::WindowProc(message, wParam, lParam);
}

三、消息變更

假如接到消息“WM_USER_MYMESSAGE1”后,需要根據(jù)條件來判斷是否需要變更消息:
#define WM_USER_MYMESSAGE1 WM_USER + 101
#define WM_USER_MYMESSAGE2 WM_USER + 102

重載WindowProc函數(shù),在函數(shù)中實(shí)現(xiàn)消息的攔截
LRESULT CMyMessageDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
switch (message)
{
case WM_USER_MYMESSAGE1:
   if (條件判斷)
   {
    // 把消息變更為其它消息
    message = WM_USER_MYMESSAGE2;
   }
   break ;
}

return CDialog::WindowProc(message, wParam, lParam);
}

四、例子:攔截系統(tǒng)注銷、重啟和關(guān)機(jī)消息的例子

假如想把系統(tǒng)注銷、重啟和關(guān)機(jī)的消息都攔截下來,并銷毀掉,不讓其執(zhí)行注銷、重啟和關(guān)機(jī)等操作:
#define WM_USERMESSAGE_NULL WM_USER+32   // 自定義消息

LRESULT CMyMessageDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
// WM_QUERYENDSESSION消息是Windows向你詢問Windows能否關(guān)閉
// WM_ENDSESSION消息表示提示你Windows即將關(guān)閉。
switch(message)
{
case WM_ENDSESSION:
   AfxMessageBox("消息攔截1");
   // 把消息銷毀掉,不讓其正確轉(zhuǎn)發(fā)。
   message = WM_USERMESSAGE_NULL;
   break ;
case WM_QUERYENDSESSION:
   AfxMessageBox("消息攔截2");
   // 把消息銷毀掉,不讓其正確轉(zhuǎn)發(fā)。
   message = WM_USERMESSAGE_NULL;
   break ;
}

return CDialog::WindowProc(message, wParam, lParam);
}

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多