返回首页


简介
我搜索,并搜查了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 = At​​lLoadAccelerators(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。

回答

评论会员:wejr 时间:2011/12/06
我有问题,如果这个加速器实现对话比复制/粘贴编辑控制功能不起作用。如果删除TranslateAccelerator它的工作原理。

	

if( ! m_haccelerator.IsNull() )

{

  if( m_haccelerator.TranslateAccelerator( m_hWnd, pMsg ) )

    return TRUE;

}

return CWindow::IsDialogMessage(pMsg);


我该如何解决这个问题优雅?
(现在我补充ID_EDIT_COPY,ID_EDIT_PASTE加速器manualy着重点窗口,但这种方法是不是很好)

Jirka
评论会员:伊戈尔Vigdorchik 时间:2011/12/06
WTL有CAccelerator类,帮助一点。
评论会员:hanjack 时间:2011/12/06
我如何使用一个无模式对话框?
评论会员:米哈伊莫高 时间:2011/12/06
您好,请你告诉我如何使用不同的加速器schama(S)为每个应用程序的对话框,没有modifiying一般的运行循环?预先感谢。
评论会员:rbuchana 时间:2011/12/06
不知道有没有这样做.....{ BR}我相信别人,这里虽然有?

对不起。
评论会员:巴勃罗Aliskevicius 时间:2011/12/06
你可能已经注意到行
m_haccelerator = At​​lLoadAccelerators(IDR_MAINFRAME); 你可以有多个加速器表,用不同的ID不同的对话框,

其实,如果你有几个对话框,您要为落实加速器,你可能也想提取到一个mixin的部分代码...

希望这有助于,


巴勃罗