简介
我搜索,并搜查了CodeProject上,但从来没有发现使用加速器和WTL的对话框为例。我已经在广泛MFC对话框使用的加速器,但无法弄清楚如何将此功能添加到WTL的对话框。很多事情一样,这是很容易做到的,一旦你已经想通了。那么,这里去....使用代码
声明一个处理加速器,并添加CMessageFilter,如果它已经没有这样做。的#pragma一次CMainDlg类:公共CDialogImpllt; CMainDlggt; 公共CUpdateUIlt; CMainDlggt; 公共CMessageFilter
60; 公共CIdleHandler{私人: HACCEL m_haccelerator;//.......};
然后在你的OnInitDialog,分配m_haccelerator变量加速器的资源,在这个例子是IDR_MAINFRAME.LRESULT CMainDlg::的OnInitDialog(UINT / * uMsg * /,WPARAM / * wParam参数* /, LPARAM / * lParam参数* /,BOOLamp; / * bHandled * /){ / / ...... / /绑定键... m_haccelerator = AtlLoadAccelerators(IDR_MAINFRAME); / /注册对象的消息过滤和空闲更新 CMessageLoop * pLoop = _Module.GetMessageLoop(); ATLASSERT(pLoop = NULL); pLoop - GT; AddMessageFilter(本); pLoop - GT; AddIdleHandler(本);
//............... 返回TRUE;}
然后,我们需要重载PreTranslateMessage函数... BOOL CMainDlg::的PreTranslateMessage(MSG * PMSG){ (m_haccelerator!= NULL) { (::TranslateAccelerator(m_hWnd,m_haccelerator,PMSG)) &
#160; 返回TRUE; } 返回CWindow的:IsDialogMessage(PMSG);}
此外,在你的构造函数,初始化处理的accelerator.CMainDlg:CMainDlg(){ //.................. m_haccelerator = NULL; //..................}
如果没有被无模式对话框,它需要的PreTranslateMessage来工作。这是很容易做到... INT WINAPI _tWinMain(HINSTANCE的hInstance, HINSTANCE / * hPrevInstance * /,LPTSTR lpstrCmdLine,INT nCmdShow){ _Module.Init(NULL,HINSTANCE); CMessageLoop myMessageLoop;
; _Module.AddMessageLoop(AMP; myMessageLoop);
CMainDlg dlgMain; dlgMain.Create(NULL); dlgMain.ShowWindow(nCmdShow); retValue = myMessageLoop.Run(); _Module.RemoveMessageLoop();
60;_Module.Term(); 返回retValue;}
,并确保包括atlmisc.h。