在PreTranslateMessage中检查类时出现CInvalidArgumentException

时间:2015-06-03 09:44:27

标签: c++ exception visual-c++ mfc

案例:我想使用numpad制作快捷方式,以便用户可以快速使用我的应用程序。我在PreTranslateMessage中实现了这一点,这很有用。

但是案例是我有一个编辑控件,用户应该在其中输入一些数字。因此,当用户专注于编辑控件(CEdit)时,快捷方式应禁用

为了解决这个问题,我添加了

CWnd* pControl;
pControl = this->GetFocus();
if(!(pControl->IsKindOf(RUNTIME_CLASS(CEdit)))){

但是现在每当我的应用程序对话框失去焦点时,它就会关闭(see video)并得到以下例外:

CinvalidArgException

这是完整的代码:

// 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);
}

现在我的问题是:为什么我的程序在没有聚焦时会崩溃,如何以正确的方式检查焦点是否在编辑控件上?

1 个答案:

答案 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
}