• <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>

            大龍的博客

            常用鏈接

            統(tǒng)計(jì)

            最新評(píng)論

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

            如何在對(duì)話框程序中讓對(duì)話框捕獲WM_KEYDOWN消息

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

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

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

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

            第二步:在CWinSunApp類上點(diǎn)擊右鍵,選擇Add Member Varialbe,增加一個(gè)類型為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()函數(shù)中添加如下代碼:

            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類上點(diǎn)擊右鍵,選擇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)

                   {

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

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

                          {

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

                                 if(lpMsg->message==WM_KEYDOWN)

                                 {

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

                                 }

                          }

                   }

                   return CWinApp::ProcessMessageFilter(code, lpMsg);

            }

             

            第五步:在WinSunDlg.cppCWinSunDlg類)中的OnInitialDialog()函數(shù)中加入以下代碼:

            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

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

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

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

            }

             

            第六步:在對(duì)話框窗口銷毀后,將CWinSunApp類中的變量m_hwndDlg置為NULL,為此我們CWinSunDlg類上點(diǎn)擊右鍵,選擇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;

            }

             

            至此,我們的工作就做完了,現(xiàn)在我們可以按Ctrl+F5運(yùn)行程序,看到我們想要的結(jié)果。當(dāng)然,如果我們想捕獲WM_KEYUPWM_CHAR消息,也是類似,這就交給讀者下來(lái)自行完成了。想要瀏覽更多技術(shù)文章,請(qǐng)登錄網(wǎng)站:http://www.sunxin.org

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


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            久久精品国内一区二区三区| 性欧美丰满熟妇XXXX性久久久 | 精品视频久久久久| 久久国产香蕉一区精品| 亚洲欧美另类日本久久国产真实乱对白 | 91麻豆国产精品91久久久| 久久久久高潮毛片免费全部播放 | 性做久久久久久久| 国内精品久久久久久中文字幕| 久久只有这精品99| 亚洲国产精品婷婷久久| 久久婷婷是五月综合色狠狠| 99久久精品影院老鸭窝| yy6080久久| 精品视频久久久久| 精品国产VA久久久久久久冰| 久久亚洲电影| 99久久伊人精品综合观看| 久久WWW免费人成一看片| 久久久91精品国产一区二区三区 | 潮喷大喷水系列无码久久精品| 久久久久无码精品| 国产亚洲欧美成人久久片| 亚洲AV无码一区东京热久久| 日产久久强奸免费的看| www亚洲欲色成人久久精品| 狼狼综合久久久久综合网| 国产99久久久国产精品小说| 久久精品亚洲男人的天堂| 中文字幕成人精品久久不卡 | 国产精品久久久久国产A级| 99久久香蕉国产线看观香 | 久久棈精品久久久久久噜噜| 一本大道久久东京热无码AV| 久久精品无码一区二区app| 97精品伊人久久久大香线蕉| 久久免费精品视频| 国产精品99久久不卡| 久久久久久国产a免费观看不卡| 99久久精品免费| 精品久久久久久无码人妻热|