赞助

MFC 屏蔽输入框(CEdit、ComboBoxB)非数字输入

转载:https://blog.csdn.net/foreverhuylee/article/details/25378221

关于PreTranslateMessage

MFC消息控制流最具特色的地方是CWnd类的虚拟函数PreTranslateMessage(),通过重载这个函数,我们可以改变MFC的消息控制流程,甚至可以作一个全新的控制流出来。只有穿过消息队列的消息才受PreTranslateMessage()影响,采用SendMessage()或其他类似的方式向窗口直接发送的而不经过消息队列的消息根本不会理睬PreTranslateMessage()的存在。  

 顾名思义,PreTranslateMessage就是消息发送给窗口之前,提前拦截消息,然后对消息进行处理(即,改变了MFC的消息控制流程)

要注意一下两点:

1、是否调用TranslateMessage()和DispatchMessage()是由一个名称为PreTranslateMessage()函数的返回值决定的,如果该函数返回TRUE,则不会把该消息分发给窗口函数处理。
2、传给PreTranslateMessage()的消息是未经翻译过的消息,它没有经过TranslateMessage()处理。可以在该函数中使用(pMsg->wParam==VK_RETURN)来拦截回车键。

 根据以上说明我们在自己的Dlalog里面重写BOOL PreTranslateMessage(MSG* pMsg)函数

BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
    // TODO: 在此添加专用代码和/或调用基类


    CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);

    ASSERT(pEdit && pEdit->GetSafeHwnd());//如果对话框上有多个编辑控件,我们只想对指定对象过滤的话,我们可以在外面加层判断,是哪个控件

    if (GetFocus() == GetDlgItem(IDC_EDIT1))//对指定控件消息过滤
    {
        if (pMsg->message == WM_CHAR)
        {
            //VK_0 ~ VK_9 are the same as ASCII '0' ~'9'(0x30~ 0x39)
            //屏蔽除数字、小数点、符号(-)、回退之外所有的输入 小数点(.) ASCII-->46  VK_INSERT(-) 负号
            if (pMsg->wParam != '.' && !(pMsg->wParam >= '0' && pMsg->wParam <= '9') && pMsg->wParam != VK_BACK&& pMsg->wParam != VK_INSERT)
            {
                return TRUE;// 使消息不再进行处理
            }
        }
        else if (pMsg->message == WM_KEYDOWN)//屏蔽 ESC、空格、回车
        {
            if (pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_SPACE || pMsg->wParam == VK_RETURN)
            {
                return TRUE;// 使消息不再进行处理
            }
        }
    }

    return CDialogEx::PreTranslateMessage(pMsg);
}

 

 

posted @ 2020-04-26 23:20  车臣  阅读(937)  评论(0编辑  收藏  举报