亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

基于對話框程序中讓對話框捕獲WM_KEYDOWN消息的實現方法

2020-01-26 16:17:19
字體:
來源:轉載
供稿:網友

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

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

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

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

代碼如下:

復制代碼 代碼如下:

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()函數中添加如下代碼:
復制代碼 代碼如下:

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,然后加入以下代碼:
復制代碼 代碼如下:

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)

       {

              //判斷消息,如果消息是從對話框發出的或者其子控件發出的,我們就進行處理。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()函數中加入以下代碼:
復制代碼 代碼如下:

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,然后加入以下代碼:
復制代碼 代碼如下:

WinSunDlg.cpp

void CWinSunDlg::OnDestroy()

{

       CDialog::OnDestroy();

     

       // TODO: Add your message handler code here

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

}


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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品成人av在线| 国模视频一区二区三区| 欧美老少做受xxxx高潮| 欧美性做爰毛片| 久久久久北条麻妃免费看| 丁香五六月婷婷久久激情| 97国产精品视频人人做人人爱| 17婷婷久久www| 日韩精品极品视频| 怡红院精品视频| 亚洲精品98久久久久久中文字幕| 久久久久www| 最新日韩中文字幕| 亚洲国产高清自拍| 一色桃子一区二区| 黑人精品xxx一区一二区| 欧美日韩一区二区在线播放| 精品久久中文字幕| 成人写真视频福利网| 日韩电影中文 亚洲精品乱码| 日韩精品黄色网| 亚洲国产精品国自产拍av秋霞| 热久久免费国产视频| 色偷偷av亚洲男人的天堂| 成人免费大片黄在线播放| 亚洲精品av在线| 日韩禁在线播放| 成人精品视频久久久久| 日韩一区二区久久久| 国产xxx69麻豆国语对白| 日韩av免费看| 最近2019年中文视频免费在线观看| 午夜精品久久久久久久99热浪潮| 欧美性资源免费| 国产免费亚洲高清| 日韩亚洲欧美成人| 国产精品久久久av久久久| 久久久久久久久久国产精品| 国产精品久久久久影院日本| 欧美成人精品在线观看| 欧美福利视频在线| 国产精品视频最多的网站| 国产精品久久久精品| 国产精品国产亚洲伊人久久| 91精品视频大全| 国产精品一区二区av影院萌芽| 一本大道香蕉久在线播放29| 国产成人精品久久二区二区| 欧美激情二区三区| 成人444kkkk在线观看| 青青青国产精品一区二区| 国产suv精品一区二区| 久久免费少妇高潮久久精品99| 国产日韩欧美电影在线观看| 久久精品久久久久久| 搡老女人一区二区三区视频tv| 91av在线不卡| 久久亚洲精品视频| 国产精品久久久久久久久久尿| 国产午夜精品免费一区二区三区| 欧美精品久久久久| 欧美在线精品免播放器视频| 亚洲欧美在线播放| 亚洲女人天堂色在线7777| 神马久久桃色视频| 国产精品va在线播放| 亚洲人成亚洲人成在线观看| 日韩av网站大全| 成人福利在线观看| 久久天天躁夜夜躁狠狠躁2022| 国产亚洲aⅴaaaaaa毛片| 欧美在线视频在线播放完整版免费观看| 成人有码在线视频| 国产成人鲁鲁免费视频a| 国产精品美女主播在线观看纯欲| 九九视频这里只有精品| 一本色道久久综合亚洲精品小说| 精品激情国产视频| 麻豆国产精品va在线观看不卡| 日本人成精品视频在线| 91欧美激情另类亚洲| 日韩av电影在线播放| 最近2019中文字幕大全第二页| 九色精品免费永久在线| 68精品久久久久久欧美| 久久久www成人免费精品| 精品福利樱桃av导航| 精品一区二区三区四区| 国产婷婷成人久久av免费高清| 中文字幕精品—区二区| 亚洲综合日韩在线| 久久精品电影一区二区| 欧美日韩国产影院| 亚洲欧美日韩直播| 在线日韩第一页| 在线视频欧美性高潮| 国产91网红主播在线观看| 亚洲精品中文字幕av| 久久久久久久久久久网站| 亚洲一区二区久久久久久久| 亚洲福利视频免费观看| 日韩av在线资源| 亚洲人成在线一二| 日韩精品免费在线视频观看| 琪琪第一精品导航| 欧美日韩亚洲视频| 亚洲老板91色精品久久| 法国裸体一区二区| 8x海外华人永久免费日韩内陆视频| 国产亚洲欧美一区| 国产精品欧美日韩一区二区| 日韩中文综合网| 国产欧美一区二区三区久久人妖| 亚洲人永久免费| 日韩专区在线播放| 亚洲欧美日本另类| 久久视频免费观看| 亚洲一区二区日本| 国模叶桐国产精品一区| 日韩美女主播视频| 久久久久久久一区二区| 91在线观看免费观看| 日韩美女写真福利在线观看| 日韩视频亚洲视频| 国产欧美中文字幕| 欧美黄色片免费观看| 日韩国产高清视频在线| 97在线精品国自产拍中文| 欧美一级黑人aaaaaaa做受| 亚洲精品短视频| 国产美女扒开尿口久久久| 日韩精品中文字幕在线| 国产精品自在线| 中文字幕日韩欧美在线视频| 68精品国产免费久久久久久婷婷| 国产精品福利网| 伊人久久久久久久久久| 亚洲午夜色婷婷在线| 国产一区二区免费| 亚洲精品一区二区在线| 日韩视频―中文字幕| 国外成人在线视频| 国产精品久久久久久久久久| 色偷偷888欧美精品久久久| 九九精品视频在线观看| 亚洲精品v欧美精品v日韩精品| 国产精品自产拍在线观看| 国产91免费观看| 欧美成年人网站| 亚洲第一网中文字幕| 中文字幕在线观看日韩| 久久香蕉频线观| 国产精品一区二区久久久久| 国产成人精品电影| 日韩成人小视频| 欧美最顶级的aⅴ艳星| 最新91在线视频| 亚洲成人精品在线| 欧美亚洲另类制服自拍| 一本大道香蕉久在线播放29| 日韩美女av在线免费观看| 国产欧美精品一区二区| 中文字幕在线日韩| 日韩免费观看视频|