对话框窗体如何响应键盘和鼠标事件? 基于对话框窗体的主窗口,如何响应键盘和鼠标事件?请高手赐教!谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 keyboard:use PreTranslateMessage 键盘:Class Wizard ——〉WM_DEYDOWN 创建OnKeyDown函数;鼠标:Class Wizard ——〉WM_MOUSEMOVE 创建OnMouseMove函数;....... 谢谢二位我采用的是添加“add windows messages handel"“OnKeyDown(nChar, nRepCnt, nFlags)但是程序没有响应 PreTranslateMessage(MSG* pMsg) //函数{if(pMsg->message==WM_KEYDOWN{ if(pMsg->wParam==1) { //do }}} 谢谢 zhuwenzheng() 大虾我采用你的方法但是结果还是没有响应 LRESULT CToolDlgDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_MOUSEMOVE: break; case WM_KEYDOWN: break; default : break; }} 如何在对话框中响应键盘按键我们首先想到的是响应WM_KEYDOWN消息,但实际运行却发现没有任何效果。原因是对话框里的控件需要首先对按键作出响应,比如多行编辑框必须首先处理回车,不至于回车使对话框关闭。我们要想在第一时间对对话框的按键做出响应,需要重载PreTranslateMessage,以下的代码实现了在对话框中显示虚拟键值(virtual-key code)BOOL CTestDlg::PreTranslateMessage(MSG* pMsg) { if(pMsg->message == WM_KEYDOWN) { ///或者直接调用OnKeyDown CString strwParam; strwParam.Format("%d ",pMsg->wParam); CDC* pDC = GetDC(); pDC->TextOut(10,10,strwParam); ReleaseDC(pDC); } return CDialog::PreTranslateMessage(pMsg); }此方法也适用于FORMVIEW或其它控件中对键盘按键的响应,以下的代码来自MSDN,实现了当按下上下左右方向键时调用OnKeyDown,我们可以在OnKeyDown中作相应处理。 BOOL CSampleControl::PreTranslateMessage(LPMSG lpmsg) {BOOL bHandleNow = FALSE;switch (lpmsg->message){case WM_KEYDOWN:switch (lpmsg->wParam){case VK_UP:case VK_DOWN:case VK_LEFT:case VK_RIGHT:bHandleNow = TRUE;break;} if (bHandleNow) OnKeyDown(lpmsg->wParam, LOWORD(lpmsg ->lParam), HIWORD(lpmsg->lParam)); break; } return bHandleNow; } 谢谢 zhuwenzheng我调试了你的方法的确可以响应键盘事件但是我现在有一个问题:我在写一个程序,当按下“ESC”键时,让它响应另外一个事件我在单文档窗口中调试是成功的但不知道在对话框窗体中为什么不响应? 你可能没有把DEFAULT的ESC屏蔽掉,解决方法:[问题提出]对话框程序ESC和ENTER健会导致程序退出,在程序进行中不响应ESC,Enter键应该怎么做?[问题解答]BOOL CCXXX::PreTranslateMessage(MSG* pMsg) { if(pMsg->message == WM_KEYDOWN) { switch(pMsg->wParam) { case VK_RETURN://屏蔽回车 return TRUE; case VK_ESCAPE://屏蔽Esc return TRUE; } } return CDialog::PreTranslateMessage(pMsg);} 非模态对话框关闭时的消息? MFC 界面中插入一张图片 Marrco blog 3月份最新更新--API拦截教程(兼散分) 如何读取一个.dat文件,把读出的数据画成波形图? CSocket中关于Receive的严重非法错误 关于CTreeCtrl和CListCtrl问题! 请问一个远程函数调用的问题 关于输入密码的时候用*显示 几个关于vc的问题??? 多表查询数据 图像缩放拷贝,100分马上结帐。 用SetTapePosition的问题,熟悉磁带机的朋友来看看,斑竹看看
use PreTranslateMessage
Class Wizard ——〉WM_DEYDOWN 创建OnKeyDown函数;
鼠标:
Class Wizard ——〉WM_MOUSEMOVE 创建OnMouseMove函数;
.......
我采用的是添加“add windows messages handel"
“OnKeyDown(nChar, nRepCnt, nFlags)
但是程序没有响应
{
if(pMsg->message==WM_KEYDOWN
{
if(pMsg->wParam==1)
{
//do
}
}
}
我采用你的方法
但是结果还是没有响应
{
switch(message)
{
case WM_MOUSEMOVE:
break;
case WM_KEYDOWN:
break;
default :
break;
}
}
原因是对话框里的控件需要首先对按键作出响应,比如多行编辑框必须首先
处理回车,不至于回车使对话框关闭。
我们要想在第一时间对对话框的按键做出响应,需要重载PreTranslateMessage,
以下的代码实现了在对话框中显示虚拟键值(virtual-key code)
BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
///或者直接调用OnKeyDown
CString strwParam;
strwParam.Format("%d ",pMsg->wParam);
CDC* pDC = GetDC();
pDC->TextOut(10,10,strwParam);
ReleaseDC(pDC);
}
return CDialog::PreTranslateMessage(pMsg);
}此方法也适用于FORMVIEW或其它控件中对键盘按键的响应,以下的代码来自MSDN,
实现了当按下上下左右方向键时调用OnKeyDown,我们可以在OnKeyDown中作相应处理。 BOOL CSampleControl::PreTranslateMessage(LPMSG lpmsg)
{
BOOL bHandleNow = FALSE;
switch (lpmsg->message)
{
case WM_KEYDOWN:
switch (lpmsg->wParam)
{
case VK_UP:
case VK_DOWN:
case VK_LEFT:
case VK_RIGHT:
bHandleNow = TRUE;
break;
}
if (bHandleNow)
OnKeyDown(lpmsg->wParam, LOWORD(lpmsg ->lParam), HIWORD(lpmsg->lParam));
break;
}
return bHandleNow;
}
我调试了你的方法
的确可以响应键盘事件
但是我现在有一个问题:我在写一个程序,当按下“ESC”键时,让它响应另外一个事件
我在单文档窗口中调试是成功的
但不知道在对话框窗体中为什么不响应?
[问题提出]
对话框程序ESC和ENTER健会导致程序退出,在程序进行中不响应ESC,Enter键应该怎么做?[问题解答]
BOOL CCXXX::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
switch(pMsg->wParam)
{
case VK_RETURN://屏蔽回车
return TRUE;
case VK_ESCAPE://屏蔽Esc
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}