原文
使用代码
给快捷键
声明一个句柄
,并添加CMessageFilter
.
#pragma once
class CMainDlg : public CDialogImpl<CMainDlg>,public CUpdateUI<CMainDlg>,public CMessageFilter,//..public CIdleHandler
{
private:HACCEL m_haccelerator;//..
//.......
};
然后在OnInitDialog
中,给快捷键
资源赋值m_haccelerator
变量,在此例中为IDR_MAINFRAME
.
LRESULT CMainDlg::OnInitDialog(UINT /*`uMsg`*/, WPARAM /*`wParam`*/,LPARAM /*l参数*/, BOOL& /*b已处理*/)
{//.......绑定键...m_haccelerator = AtlLoadAccelerators(IDR_MAINFRAME);//`注册`对象以过滤消息和空闲更新CMessageLoop* pLoop = _Module.GetMessageLoop();ATLASSERT(pLoop != NULL);pLoop->AddMessageFilter(this);pLoop->AddIdleHandler(this);//...............return TRUE;
}
然后要重载PreTranslateMessage
函数.
BOOL CMainDlg::PreTranslateMessage(MSG* pMsg)
{if(m_haccelerator != NULL){if(::TranslateAccelerator(m_hWnd, m_haccelerator, pMsg))return TRUE;}return CWindow::IsDialogMessage(pMsg);
}
此外,在构造器
中,初化快捷键的句柄
.
CMainDlg::CMainDlg()
{//..................m_haccelerator = NULL;//..................
}
如果未按无模式
设置对话框
,则需要按无模式
,才能使PreTranslateMessage
正常工作.这很容易…
int WINAPI _tWinMain(HINSTANCE hInstance,HINSTANCE /*`hPrev`实例*/, LPTSTR lpstrCmdLine, int nCmdShow)
{_Module.Init(NULL, hInstance);CMessageLoop myMessageLoop;_Module.AddMessageLoop(&myMessageLoop);CMainDlg dlgMain;dlgMain.Create(NULL);dlgMain.ShowWindow(nCmdShow);int retValue = myMessageLoop.Run();_Module.RemoveMessageLoop();_Module.Term();return retValue;
}
并确保包含atlmisc.h
.