BOOL CMfcSnakeDlg::PreTranslateMessage(MSG* pMsg) { // TODO: 在此添加专用代码和/或调用基类 if (START && DEAD == false) { if (my_snake.direc != 2 && (pMsg->wParam == VK_UP || pMsg->wParam == 'w' || pMsg->wParam == 'W')) my_snake.direc = 1; else if (my_snake.direc != 1 && (pMsg->wParam == VK_DOWN || pMsg->wParam == 's' || pMsg->wParam == 'S')) my_snake.direc = 2; else if (my_snake.direc != 4 && (pMsg->wParam == VK_LEFT || pMsg->wParam == 'a' || pMsg->wParam == 'A')) my_snake.direc = 3; else if (my_snake.direc != 3 && (pMsg->wParam == VK_RIGHT || pMsg->wParam == 'd' || pMsg->wParam == 'D')) my_snake.direc = 4; } /*if (pMsg->message == WM_KEYDOWN) { if (pMsg->hwnd == GetDlgItem(IDC_EDIT_score)->m_hWnd) { return true; } }*/ //return CDialogEx::PreTranslateMessage(pMsg); return FALSE; }
时间: 2023-07-19 15:53:31 浏览: 103
这段代码是贪吃蛇游戏中的消息处理函数,会在用户按下键盘键时被调用。它的作用是根据用户按下的键盘键来控制贪吃蛇的移动方向。
函数中首先判断游戏是否已经开始并且贪吃蛇是否已经死亡。如果游戏已经开始并且贪吃蛇还没有死亡,就根据用户按下的键盘键来控制贪吃蛇的移动方向。如果用户按下的键盘键不是上下左右方向键或 w/a/s/d 键,则函数不做任何处理。最后,函数返回 FALSE,表示消息已经被处理。
相关问题
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) { UINT nKeyCode = (UINT)pMsg->wParam; if(pMsg->message == WM_KEYDOWN) { if((nKeyCode == _T('C')) && (::GetKeyState(VK_CONTROL) & 0x8000)) { return TRUE; } } return CFrameWndEx::PreTranslateMessage(pMsg); } 解释代码
这段代码是 MFC 应用程序中的 CMainFrame 类的 PreTranslateMessage 函数,用于在消息循环之前处理键盘消息。它会检查按下的键是否为 Ctrl + C 组合键,如果是则返回 TRUE,否则调用基类的 PreTranslateMessage 函数进行处理。
具体来说,这段代码检查消息的类型是否为 WM_KEYDOWN(键盘按下)消息,并且按下的键是否为字符 'C',并且 Ctrl 键也同时被按下。如果这些条件都满足,就说明用户按下了 Ctrl + C 组合键,这时函数返回 TRUE,表示该消息已经被处理并不再需要传递给后续的消息处理器处理。否则,函数调用基类的 PreTranslateMessage 函数来处理该消息。
重写了 基类 PreTranslateMessage 但是该方法没有任何消息过来 mfc
如果你已经重写了基类`CWnd`的`PreTranslateMessage()`方法,但发现没有接收到预期的消息,有几种可能的情况:
1. **消息过滤**: 如果你在`PreTranslateMessage()`中设置了特定的条件来拦截消息,而这些条件未满足,那么消息就不会传递到你的重写方法。例如,你可能只对某些类型的按键消息感兴趣,其他类型的消息会被忽略。
```cpp
// 假设我们只关心键盘按下事件
virtual BOOL CMyWindow::PreTranslateMessage(MSG* pMsg) override {
if (pMsg->message == WM_KEYDOWN)
// 处理键盘按下...
return base_class::PreTranslateMessage(pMsg); // 调用基类处理其他消息
}
```
2. **消息队列**: `PreTranslateMessage()`仅作用于那些在消息队列中等待处理的消息。如果消息是通过`SendMessage()`或者其他方式直接发送给窗口的,它们会跳过预翻译阶段。
3. **错误实现**: 检查你的代码逻辑,确保在处理消息时没有错误,比如忘记调用基类的方法以继续消息处理链。
如果上述情况都不是问题,可能是由于窗口的可见性或焦点状态导致的。确保你的窗口处于激活状态,并且可以接收消息。如果窗口隐藏或不可见,消息可能不会传递给它。
相关问题--:
1. MFC中的`PreTranslateMessage`如何区分不同来源的消息?
2. 如何调试查看是否有消息进入`PreTranslateMessage`?
3. 如何让窗口始终能接收到`PreTranslateMessage`?
阅读全文