青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大龍的博客

常用鏈接

統計

最新評論

如何在對話框程序中讓對話框捕獲WM_KEYDOWN消息 ---- zt

如何在對話框程序中讓對話框捕獲WM_KEYDOWN消息

作者:孫鑫                  日期:2003-9-4

在對話框程序中,我們經常是利用對話框上的子控件進行命令響應來處理一些事件。如果我們想要讓對話框(子控件的父窗口)類來響應我們的按鍵消息,我們可以通過ClassWizardWM_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_hwndDlgpublic的變量。代碼如下:

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.cppCWinSunApp類)文件中的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.cppCWinSunDlg類)中的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運行程序,看到我們想要的結果。當然,如果我們想捕獲WM_KEYUPWM_CHAR消息,也是類似,這就交給讀者下來自行完成了。想要瀏覽更多技術文章,請登錄網站:http://www.sunxin.org

posted on 2007-08-29 11:35 大龍 閱讀(684) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美成年人视频网站| 欧美一区二区三区精品| 小处雏高清一区二区三区 | 中文成人激情娱乐网| 在线观看国产精品淫| 午夜精品免费在线| 亚洲一区在线观看免费观看电影高清| 极品少妇一区二区| 国产日韩在线亚洲字幕中文| 国产自产女人91一区在线观看| 久久久久国产免费免费| 欧美专区在线观看| 久久久91精品国产一区二区精品| 亚洲美女精品成人在线视频| 亚洲欧洲综合另类| 亚洲精一区二区三区| 亚洲深夜福利视频| 久久夜色精品一区| 欧美色另类天堂2015| 国产亚洲毛片| 午夜精品免费在线| 亚洲电影专区| aa日韩免费精品视频一| 亚洲欧美在线aaa| 麻豆精品在线播放| 国产精品美女久久| 亚洲第一中文字幕| 久久精彩视频| 日韩午夜在线电影| 久久se精品一区精品二区| 欧美激情欧美激情在线五月| 国产美女精品免费电影| 日韩天堂在线视频| 麻豆成人在线观看| 亚洲一区在线看| 欧美精品色网| 亚洲国产一区二区精品专区| 欧美一区二区三区精品电影| 亚洲精品国产拍免费91在线| 久久久久国产精品一区| 国产精品网曝门| 中文欧美日韩| 亚洲国产一二三| 久久久久中文| 国产在线国偷精品产拍免费yy| 国产精品区免费视频| 合欧美一区二区三区| 亚欧成人精品| 亚洲视频一区在线| 欧美日韩成人在线观看| 在线观看视频一区| 久久精视频免费在线久久完整在线看| 午夜精品在线| 日韩一级精品| 欧美激情成人在线视频| 亚洲欧洲精品成人久久奇米网| 亚洲人人精品| 噜噜噜91成人网| 久久国产精品久久久| 国产午夜精品全部视频在线播放| 在线观看视频免费一区二区三区| 在线精品亚洲一区二区| 久久精品亚洲国产奇米99| 亚洲欧美视频一区| 国内久久精品| 久久精品在线播放| 欧美一级淫片aaaaaaa视频| 国产精品视频免费| 久久精品国产清高在天天线 | 夜夜嗨av色综合久久久综合网 | 亚洲激情在线观看| 久久成人在线| 又紧又大又爽精品一区二区| 噜噜噜在线观看免费视频日韩| 久久综合狠狠综合久久综青草| 国产精品久久久久久久久婷婷| 欧美国产精品一区| 伊伊综合在线| 欧美成人精品三级在线观看| 久久视频这里只有精品| 亚洲欧洲偷拍精品| 亚洲精品极品| 国产精品国内视频| 久久久久久自在自线| 麻豆免费精品视频| 中国成人黄色视屏| 欧美一级精品大片| 亚洲欧洲午夜| 亚洲欧洲av一区二区三区久久| 欧美精品在线一区二区| 一区二区欧美亚洲| 午夜亚洲伦理| 亚洲人成网站在线播| 亚洲一区bb| 亚洲国产成人91精品| 一本色道久久加勒比88综合| 国产一区二区三区自拍| 亚洲精品国产精品国自产观看| 性色av一区二区三区红粉影视| 欧美交受高潮1| 性色av香蕉一区二区| 免费的成人av| 久久精品亚洲一区| 欧美 日韩 国产 一区| 亚洲欧美日韩天堂| 欧美高清视频在线播放| 欧美一区影院| 欧美午夜一区二区| 欧美激情亚洲激情| 国产主播一区二区三区四区| 亚洲精品一区在线观看| 狠狠综合久久av一区二区小说 | 一区二区三区四区五区精品视频 | 欧美日韩国产区一| 久久国产福利| 欧美另类69精品久久久久9999| 亚洲福利视频专区| 亚洲在线不卡| 在线综合视频| 免费欧美日韩| 国产情侣久久| 999亚洲国产精| 91久久久亚洲精品| 欧美与黑人午夜性猛交久久久| 欧美午夜在线一二页| 亚洲成人资源| 亚洲二区三区四区| 久久国产精品亚洲77777| 亚洲欧美日韩另类精品一区二区三区| 一本色道久久综合精品竹菊| 亚洲日韩视频| 蜜桃av一区二区| 欧美顶级少妇做爰| 伊人成人在线视频| 久久精品一区| 欧美一区二区三区四区高清| 亚洲精品在线观看视频| 久久久国产成人精品| 久久国产精品黑丝| 国产伪娘ts一区| 欧美伊人久久久久久久久影院| 在线看片日韩| 老牛影视一区二区三区| 国产午夜精品视频| 欧美自拍丝袜亚洲| 久久久久久一区二区| 国产性做久久久久久| 欧美伊人久久久久久久久影院| 在线日韩电影| 奶水喷射视频一区| 欧美激情第六页| 亚洲日本激情| 欧美日韩在线大尺度| 亚洲桃花岛网站| 久久激情视频久久| 狠狠色丁香婷综合久久| 免费一区二区三区| 日韩亚洲不卡在线| 久久99伊人| 亚洲人成啪啪网站| 国产精品乱子久久久久| 久久久久在线| 一区二区三区久久网| 欧美在线3区| 亚洲国产高清自拍| 欧美日韩精品在线播放| 亚洲欧美精品| 欧美国产激情二区三区| 亚洲图中文字幕| 国产亚洲第一区| 欧美成人精品一区二区| 宅男噜噜噜66一区二区| 久久视频在线视频| 99热这里只有精品8| 国产欧美日本| 欧美激情视频免费观看| 午夜一级久久| 亚洲欧洲日产国产综合网| 久久高清国产| 亚洲视频一二三| 亚洲风情在线资源站| 国产精品久久久久久久久久妞妞| 久久亚洲美女| 日韩视频免费在线| 国语自产偷拍精品视频偷 | 欧美激情二区三区| 亚洲男人的天堂在线观看| 亚洲电影欧美电影有声小说| 国产精品久久夜| 欧美久久久久免费| 久久免费视频在线| 亚洲一区美女视频在线观看免费| 中文高清一区| 91久久嫩草影院一区二区| 国产日韩精品在线播放| 欧美精品色一区二区三区| 久久精品亚洲一区二区| 亚洲欧美一区二区视频| 日韩小视频在线观看| 亚洲电影自拍|