导航
  • 主页
  • VC/MVC基础类
  • .NET 技术
  • VC/MFC界面
  • VC/MFC 进程
  • VC/MFC 数据库
  • VC/MFC&Web
  • Doc/View

紧急问题求救,100分立马给,对话框里如何截获空格安键和回车键!!!!!!!!!!

chendd2001 2002-08-02 11:57:52
背景:我建立了一个单文当的视图应用程序。
在文当窗口点饥鼠标,弹出一个我的对话框。
但我明明在对话框里写明了onChar,onkeydown,事件,但不反应。
当我按空格时,对话框默认的处理过程是这样,相当于按按钮,如果当前cancel按纽
获得焦点,那么,空格一按,cancel起作用了,关闭对话框。
我想截获空格消息,然后处理我的内容,对话框上的按纽不作出反映
高手请教
...全文
23 点赞 收藏 16
写回复
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
TopBand 2002-08-02
我以前碰到这个问题从来是重载
PreTranslateMessage(MSG* pMsg)
的。这样也不麻烦,而且容易控制。
回复
romanticist 2002-08-02
PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if((UINT(pMsg->wParam)==VK_SPACE)||(UINT(pMsg->wParam)==VK_EXECUTE))
{
return 0;
}
回复
punpuny 2002-08-02
用楼上方法不错,但是也可以在
OnChar( .. )
里面去响应对应的函数!

在OnChar中无法截到这些按键消息。
回复
pp_ipr 2002-08-02
BOOL CCXXX::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
switch(pMsg->wParam)
{
case VK_RETURN:
//do something
case VK_SPACE:
// do something
}
}
return CDialog::PreTranslateMessage(pMsg);
}

回复
我不是大明 2002-08-02
用楼上方法不错,但是也可以在
OnChar( .. )
里面去响应对应的函数!
回复
ShapeRock 2002-08-02
up
回复
punpuny 2002-08-02
在对话框的PreTranslateMessage中去处理,例如
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_CHAR)
{
if (pMsg->wParam == VK_SPACE)
{
// Do you own thing
}
}
}
回复
TopLevel 2002-08-02
重载PreTranslateMessage函数。
回复
chendd2001 2002-08-02
我给分了的,怎么没显示?:punpuny()的90分,10分给了别人
回复
punpuny 2002-08-02
第一,只有默认的IDOK按钮才会接收到这个空格消息,如果可以的话,将这个按钮的ID改掉,比如改为ID_OK,我试了一下,没问题;

第二,如果必须使用默认按钮ID的话,用smlstar(茂材茂才茂财)的方法比较方便。
回复
PioneerMan 2002-08-02
还有一种用钩子
//对话框创建
gKeyBoardHooks=SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC) KeyboardFunc, GetModuleHandle(NULL), GetCurrentThreadId());

//钩子函数
LRESULT CALLBACK KeyboardFunc (int nCode, WPARAM wParam, LPARAM lParam )
{
if(nCode<0)
CallNextHookEx(gKeyBoardHooks, nCode, wParam, lParam);
if(wParam==VK_RETURN||wParam==VK_SPACE ||wParam==VK_UP )
{
//处理事件
return -1L;
}
}
return CallNextHookEx(gKeyBoardHooks, nCode, wParam, lParam);
}

//对话框关闭
UnhookWindowsHookEx(gKeyBoardHooks);
回复
smlstar 2002-08-02
那就继承CEdit生成一个新的类,将PreTranslateMessage(MSG* pMsg)
写在里面。以后的edit空件都是新类的对象。这样就可以了。
回复
etocca 2002-08-02
不要return CDialog::PreTranslateMessage(pMsg);
回复
smlstar 2002-08-02
同意
punpuny()的方法,在PreTranslateMessage(MSG* pMsg)里面
if (pMsg->message == WM_CHAR)
{
if(pMsg->wParam == VK_RETURN) //回车
//

if(pMsg->wParam == VK_SPACE) //空格
//

}

回复
chendd2001 2002-08-02
TO: punpuny() 以及各位,还有一个麻烦,
按了空格后我的功能是实现了,但对话框上的按纽也得到空格事件,相当执行了
一次按按钮动作,我 想让按钮对空格回车无效
回复
蒋晟 2002-08-02
Add an Accelerator key to the table by associating some key to the resource ID "IDC_BUTTON1".


Add the member variable, m_hAccelTable, to the class CAboutBox:


HACCEL m_hAccelTable;
Initialize m_hAccelTable in CAboutBox::CAboutBox:


m_hAccelTable = LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR1));
Use Class Wizard to add an override of the PreTranslateMessage for the CAboutDlg.


In the CAboutBox::PreTranslateMessage() method, add the following lines of code:


BOOL CAboutDlg::PreTranslateMessage(MSG* pMsg) {
if (m_hAccelTable) {
if (::TranslateAccelerator(m_hWnd, m_hAccelTable, pMsg)) {
return(TRUE);
}
}
return CDialog::PreTranslateMessage(pMsg);

}
Compile and run CTestApp
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告