关于对话框中按钮与方向键的屏蔽有关问题
关于对话框中按钮与方向键的屏蔽问题,高手请进
我用基于对话框做了一个俄罗斯方块的程序,上面有“开始”“暂停”“设置”几个按钮。当按下方向键是。就会产生对按钮的焦点转移。而不响应我自己设计的按下方向键,响应消息函数。重写了PreTranslateMessage也不管用。不知道是什么原因。求高手指点,本人是菜鸟,最好写出一点点代码例子。
下面是我重写的PreTranslateMessage
------解决方案--------------------
很奇怪的代码:
if(pMsg->wParam==WM_KEYDOWN)
{
switch(pMsg->wParam)
既然判断pMsg->wParam是WM_KEYDOWN了,为什么又去catch这个值呢?应该是pMsg->lParam吧?
------解决方案--------------------
由于你的catch总是进入default,所以最后总是执行到return CDialog::PreTranslateMessage(pMsg);因此你这段代码就成了典型的垃圾代码了......
我用基于对话框做了一个俄罗斯方块的程序,上面有“开始”“暂停”“设置”几个按钮。当按下方向键是。就会产生对按钮的焦点转移。而不响应我自己设计的按下方向键,响应消息函数。重写了PreTranslateMessage也不管用。不知道是什么原因。求高手指点,本人是菜鸟,最好写出一点点代码例子。
下面是我重写的PreTranslateMessage
- C/C++ code
BOOL CTETRISDlg::PreTranslateMessage(MSG* pMsg) { // TODO: 在此添加专用代码和/或调用基类 if(!m_bTimeOutFlag) {// if(pMsg->wParam==WM_KEYDOWN) { switch(pMsg->wParam) { case VK_LEFT: if(CanMoveLeft()) MoveLeft(); return TRUE; case VK_RIGHT: if(CanMoveRight()) MoveRight(); return TRUE; case VK_DOWN: if((!IsGameOver())&&CanDown()) { if(m_speedOfLevel!=SPEED_FASTER) { KillTimer(1); m_preSpeed=m_speedOfLevel; m_speedOfLevel=SPEED_FASTER; SetTimer(1,m_speedOfLevel,NULL); } } return TRUE; case VK_SPACE: if((!IsGameOver())&&CanDown()) { if(m_speedOfLevel!=SPEED_FASTER) { KillTimer(1); m_preSpeed=m_speedOfLevel; m_speedOfLevel=SPEED_FASTEST; SetTimer(1,m_speedOfLevel,NULL); } } return TRUE; case VK_UP: if(CanRotate()) Rotate(); return TRUE; case VK_RETURN: return TRUE; default:break; }//switch }//if(pMsg->message==WM_KEYDOWN) else if(pMsg->message==WM_KEYUP) //键盘松开消息 { switch(pMsg->wParam) { case VK_DOWN: if(!IsGameOver()) { KillTimer(1); m_speedOfLevel=m_preSpeed; SetTimer(1,m_speedOfLevel,NULL); } break; case VK_SPACE: if(!IsGameOver()) { m_speedOfLevel=m_preSpeed; KillTimer(1); SetTimer(1,m_speedOfLevel,NULL); } else KillTimer(1); break; default:break; } }//switch }//else if else //如果是等待时间 { if(pMsg->message==WM_KEYDOWN) { switch(pMsg->wParam) { case VK_LEFT: case VK_RIGHT: case VK_DOWN: case VK_SPACE: case VK_UP: case VK_RETURN: return TRUE; default:break; } } else if(pMsg->message==WM_KEYUP) { switch(pMsg->wParam) { case VK_DOWN: case VK_SPACE: return TRUE; default:break; } } } return CDialog::PreTranslateMessage(pMsg); }
------解决方案--------------------
很奇怪的代码:
if(pMsg->wParam==WM_KEYDOWN)
{
switch(pMsg->wParam)
既然判断pMsg->wParam是WM_KEYDOWN了,为什么又去catch这个值呢?应该是pMsg->lParam吧?
------解决方案--------------------
由于你的catch总是进入default,所以最后总是执行到return CDialog::PreTranslateMessage(pMsg);因此你这段代码就成了典型的垃圾代码了......