案例:我想使用numpad制作快捷方式,以便用户可以快速使用我的应用程序。我在PreTranslateMessage
中实现了这一点,这很有用。
但是案例是我有一个编辑控件,用户应该在其中输入一些数字。因此,当用户专注于编辑控件(CEdit)时,快捷方式应禁用。
为了解决这个问题,我添加了
CWnd* pControl;
pControl = this->GetFocus();
if(!(pControl->IsKindOf(RUNTIME_CLASS(CEdit)))){
但是现在每当我的应用程序对话框失去焦点时,它就会关闭(see video)并得到以下例外:
这是完整的代码:
// Handles keypresses for fast acces of functions
BOOL COpenFilesDlg::PreTranslateMessage(MSG *pMsg){
CWnd* pControl;
pControl = this->GetFocus();
if(!(pControl->IsKindOf(RUNTIME_CLASS(CEdit)))){ //when this statement is commented the program doesn't crash
if(pMsg->message == WM_KEYDOWN)
{
if((pMsg->wParam == 0x31 || pMsg->wParam == VK_NUMPAD1))
someFunction();
else if((pMsg->wParam == 0x33 || pMsg->wParam == VK_NUMPAD3)){
someOtherFunction();
}
}
}
return CDialog::PreTranslateMessage(pMsg);
}
现在我的问题是:为什么我的程序在没有聚焦时会崩溃,如何以正确的方式检查焦点是否在编辑控件上?
答案 0 :(得分:2)
CWnd::GetFocus
返回指向具有当前焦点的窗口的指针,如果没有焦点窗口,则返回NULL。
pControl = this->GetFocus();
if ( pControl != NULL )
{
if(!(pControl->IsKindOf(RUNTIME_CLASS(CEdit))))
...
}
另一种方法是将pControl
值与指向对话框类的CEdit
类成员(或成员)的指针进行比较。例如,如果CEdit m_edit
是编辑框类成员,则测试:
if ( pControl == (CWnd*)&m_edit )
{
// focus is on m_edit control
}