欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于對話框程序中讓對話框捕獲WM_KEYDOWN消息的實現(xiàn)方法

 更新時間:2013年05月06日 15:12:48   作者:  
下面我們將通過程序給大家演示基于對話框的應(yīng)用程序?qū)M_KEYDOWN消息的捕獲。需要的朋友可以參考下

在對話框程序中,我們經(jīng)常是利用對話框上的子控件進(jìn)行命令響應(yīng)來處理一些事件。如果我們想要讓對話框(子控件的父窗口)類來響應(yīng)我們的按鍵消息,我們可以通過ClassWizard對WM_KEYDOWN消息進(jìn)行響應(yīng),當(dāng)程序運行后,我們按下鍵盤上的按鍵,但對話框不會有任何的反應(yīng)。這是因為在對話框程序中,某些特定的消息,例如按鍵消息,它們被Windows內(nèi)部的對話框過程處理了(即在基類中完成了處理,有興趣的讀者可以查看MFC的源代碼),或者被發(fā)送給子控件進(jìn)行處理,所以我們在對話框類中就捕獲不到按鍵的消息了。

既然我們知道了這個處理的過程,我們就可以找到底層處理按鍵消息的函數(shù),然后在子類中重載它,就可以在對話框程序中處理按鍵消息了。在MFC中,是利用BOOL ProcessMessageFilter(int code, LPMSG lpMsg)這個虛函數(shù)來過濾或響應(yīng)菜單和對話框的特定Windows消息。下面我們通過程序給大家演示基于對話框的應(yīng)用程序?qū)M_KEYDOWN消息的捕獲。

第一步:新建一個工程,選擇MFC AppWizard (exe),工程名為WinSun,點擊ok,進(jìn)入下一步,選擇Dialog based,點擊Finish。

第二步:在CWinSunApp類上點擊右鍵,選擇Add Member Varialbe,增加一個類型為HWND,變量名m_hwndDlg的public的變量。

代碼如下:

復(fù)制代碼 代碼如下:

WinSun.h

class CWinSunApp : public CWinApp

{

public:

       HWND m_hwndDlg;

       CWinSunApp();

 

// Overrides

       // ClassWizard generated virtual function overrides

       //{{AFX_VIRTUAL(CWinSunApp)

       public:

       virtual BOOL InitInstance();

       //}}AFX_VIRTUAL

 

// Implementation

 

       //{{AFX_MSG(CWinSunApp)

              // NOTE - the ClassWizard will add and remove member functions here.

              //    DO NOT EDIT what you see in these blocks of generated code !

       //}}AFX_MSG

       DECLARE_MESSAGE_MAP()

};


第三步:在WinSun.cpp(CWinSunApp類)文件中的InitInstance()函數(shù)中添加如下代碼:
復(fù)制代碼 代碼如下:

WinSun.cpp

BOOL CWinSunApp::InitInstance()

{

       AfxEnableControlContainer();

 

       // Standard initialization

       // If you are not using these features and wish to reduce the size

       //  of your final executable, you should remove from the following

       //  the specific initialization routines you do not need.

 

#ifdef _AFXDLL

       Enable3dControls();                     // Call this when using MFC in a shared DLL

#else

       Enable3dControlsStatic();      // Call this when linking to MFC statically

#endif

 

       CWinSunDlg dlg;

       m_pMainWnd = &dlg;

       int nResponse = dlg.DoModal();

       if (nResponse == IDOK)

       {

              // TODO: Place code here to handle when the dialog is

              //  dismissed with OK

       }

       else if (nResponse == IDCANCEL)

       {

              // TODO: Place code here to handle when the dialog is

              //  dismissed with Cancel

       }

 

       // Since the dialog has been closed, return FALSE so that we exit the

       //  application, rather than start the application's message pump.

       m_hwndDlg=NULL;

       return FALSE;

}


第四步:在CWinSunApp類上點擊右鍵,選擇Add Virtual Function,在左邊一欄里,選擇ProcessMessageFilter,在右邊按鈕上選擇Add and Edit,然后加入以下代碼:
復(fù)制代碼 代碼如下:

WinSun.cpp

BOOL CWinSunApp::ProcessMessageFilter(int code, LPMSG lpMsg)

{

       // TODO: Add your specialized code here and/or call the base class

       if(m_hwndDlg!=NULL)

       {

              //判斷消息,如果消息是從對話框發(fā)出的或者其子控件發(fā)出的,我們就進(jìn)行處理。sunxin

              if((lpMsg->hwnd==m_hwndDlg) || ::IsChild(m_hwndDlg,lpMsg->hwnd))

              {

                     //如果消息是WM_KEYDOWN,我們就彈出一個消息框。sunxin

                     if(lpMsg->message==WM_KEYDOWN)

                     {

                            AfxMessageBox("捕獲WM_KEYDOWN消息成功!");

                     }

              }

       }

       return CWinApp::ProcessMessageFilter(code, lpMsg);

}


第五步:在WinSunDlg.cpp(CWinSunDlg類)中的OnInitialDialog()函數(shù)中加入以下代碼:
復(fù)制代碼 代碼如下:

WinSunDlg.cpp

BOOL CWinSunDlg::OnInitDialog()

{

       CDialog::OnInitDialog();

 

       // Add "About..." menu item to system menu.

 

       // IDM_ABOUTBOX must be in the system command range.

       ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

       ASSERT(IDM_ABOUTBOX < 0xF000);

 

       CMenu* pSysMenu = GetSystemMenu(FALSE);

       if (pSysMenu != NULL)

       {

              CString strAboutMenu;

              strAboutMenu.LoadString(IDS_ABOUTBOX);

              if (!strAboutMenu.IsEmpty())

              {

                     pSysMenu->AppendMenu(MF_SEPARATOR);

                     pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

              }

       }

 

       // Set the icon for this dialog.  The framework does this automatically

       //  when the application's main window is not a dialog

       SetIcon(m_hIcon, TRUE);                  // Set big icon

       SetIcon(m_hIcon, FALSE);          // Set small icon

     

       // TODO: Add extra initialization here

//將對話框的句柄傳遞到CWinSunApp類中。sunxin

       ((CWinSunApp*)AfxGetApp())->m_hwndDlg=m_hWnd;

       return TRUE;  // return TRUE  unless you set the focus to a control

}


第六步:在對話框窗口銷毀后,將CWinSunApp類中的變量m_hwndDlg置為NULL,為此我們在CWinSunDlg類上點擊右鍵,選擇Add Windows Message Handler,在左邊一欄中選擇WM_DESTROY,在右邊按鈕上選擇Add and Edit,然后加入以下代碼:
復(fù)制代碼 代碼如下:

WinSunDlg.cpp

void CWinSunDlg::OnDestroy()

{

       CDialog::OnDestroy();

     

       // TODO: Add your message handler code here

       ((CWinSunApp*)AfxGetApp())->m_hwndDlg=NULL;

}


至此,我們的工作就做完了,現(xiàn)在我們可以按Ctrl+F5運行程序,看到我們想要的結(jié)果。

相關(guān)文章

  • C/C++?Qt?給ListWidget組件增加右鍵菜單功能

    C/C++?Qt?給ListWidget組件增加右鍵菜單功能

    本篇文章給大家介紹ListWidget組件增加一個右鍵菜單,當(dāng)用戶在ListWidget組件中的任意一個子項下右鍵,我們讓其彈出這個菜單,并根據(jù)選擇提供不同的功能,感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • 探討數(shù)組與字符串輸入的問題(C++版)

    探討數(shù)組與字符串輸入的問題(C++版)

    本文對C++數(shù)組與字符串輸入的問題進(jìn)行了探討,需要的朋友可以參考下
    2015-07-07
  • clion最新激活碼+漢化的步驟詳解(親測可用激活到2089)

    clion最新激活碼+漢化的步驟詳解(親測可用激活到2089)

    這篇文章主要介紹了clion最新版下載安裝+破解+漢化的步驟詳解,本文分步驟給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • C++與namespace有關(guān)的兩個編譯錯誤的講解

    C++與namespace有關(guān)的兩個編譯錯誤的講解

    今天小編就為大家分享一篇關(guān)于C++與namespace有關(guān)的兩個編譯錯誤的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • 解決在Mac下直接解壓C++靜態(tài)庫出現(xiàn)的問題

    解決在Mac下直接解壓C++靜態(tài)庫出現(xiàn)的問題

    最近在研究C++的各種編譯構(gòu)建過程,學(xué)習(xí)了一下cmake,gyp/ninja這些自動化構(gòu)建工具后,想著自己試下用純命令行跑一遍編譯流程。在試圖把C++靜態(tài)庫編譯為動態(tài)庫的過程中遇到了棘手的問題,找了好久后發(fā)現(xiàn)是跟Mac平臺相關(guān)的,這里記錄一下,望對遇到類似問題的童鞋有幫助。
    2016-12-12
  • jQuery移動頁面開發(fā)中主題按鈕的設(shè)計示例

    jQuery移動頁面開發(fā)中主題按鈕的設(shè)計示例

    這篇文章主要介紹了jQuery移動頁面開發(fā)中主題按鈕的設(shè)計示例,jQuery是當(dāng)今最具人氣的JavaScript開發(fā)類庫,需要的朋友可以參考下
    2015-12-12
  • FFmpeg進(jìn)階教程之給視頻添加文字水印

    FFmpeg進(jìn)階教程之給視頻添加文字水印

    FFmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計算機(jī)程序,下面這篇文章主要給大家介紹了關(guān)于FFmpeg進(jìn)階教程之給視頻添加文字水印的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • C語言與C++動態(tài)通訊錄超詳細(xì)實現(xiàn)流程

    C語言與C++動態(tài)通訊錄超詳細(xì)實現(xiàn)流程

    這篇文章主要為大家介紹了C語言與C++動態(tài)實現(xiàn)通訊錄,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-05-05
  • C語言中的getchar()使用詳解

    C語言中的getchar()使用詳解

    大家好,本篇文章主要講的是C語言中的getchar()使用詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C++智能指針之shared_ptr的具體使用

    C++智能指針之shared_ptr的具體使用

    本文主要介紹了C++智能指針之shared_ptr的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧<BR>
    2022-05-05

最新評論