2023/4/10

147 阅读1分钟

2023/4/10

MFC键盘下响应事件:
需要重载PreTranslateMessage(MSG* pMsg)函数

BOOL CCalculateDlg::PreTranslateMessage(MSG* pMsg){
    if(pMsg == WM_KEYDOWN)
    {
        int nKeyDonw = pMsg->wParam;
        SHORT nKeyState = GetKeyMessage(VK_SHIFT);
        if(nKeyDown == 83 && nKeyState)    //按下Shift和s键
        {
            //toDo
        }
    }
    return CDialog::PreTranlateMessage(pMsg);
}

SHORT GetKeyState(int nVirKey):参数nVirKey如果是数字或者是字母,则是对应的ASCII码值,对于其他按键必须是虚拟键码。返回值,若低位为1,BYTE Caps_Lock = LOBYTE(GetKeyState(VK_CAPITAL)),则按键处于长按状态;若高位为1,BYTE Caps_Lock = HIBYTE(GetKeyState(VK_CAPITAL)),则按键处于开启状态。该函数只能在PreTranslateMessage中使用。

BOOL CCalculateDlg::PreTranslateMessage(MSG* pMSG)
{
    switch(pMSG->message)
    {
    case: WM_KEYDONW
        if(pMSG->wParam == 'A')   //字母必须是大写
        {
            if(!LOBYTE(GetKeyState(16))     //如果没有长按Shift
            {
                if(HIBYT(GetKeyState(16)))
                    MessageBox(TEXT("按下A,且SHIFT键处于开启状态"));
                else
                    MessageBox(TEXT("按下A,且SHIFT键处于关闭状态"));
            }
        }
        break;
    }
    return CDialog::PreTranslateMessage(MSG* pMSG);
}

在使用长按Shift + 其他键时,需要注意,先检测其他键的输入,在检测Shift是否长按。

取消回车与ECS的原有功能:
在PreTranslateMessage函数中,对if ((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_RETURN))和if ((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_ESCAPE))进行重写,将原来的操作进行覆盖,或者对OnOK函数进行重写。

MessageBox、AfxMessageBox:
function MessageBox(hWnd:HWND, TEXT, Caption:PChar, Type:Word) : Integer
hWnd:对话框父对话框句柄
TEXT:显示文本
Caption:标题
Type:对话框类型常量,类型常量可由按键组合,缺省按键,显示图标,运行模式四种类型常量组合而成,用 | 连接。
该函数返回整型,用于对话框按钮的识别。
在MessageBox中显示变量:

CString str;
str.Format(_T("%d%s", age_int, address_string));
MessageBox(str);

AfxMessageBox不能设置标题,但可以在除CWnd及其派生类以外的类中使用,是MFC框架中提供的函数,提供了多种重载;MessageBox是Windows Api函数。