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函数。