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

chendd2001 2002-08-02 11:57:52
背景:我建立了一个单文当的视图应用程序。
在文当窗口点饥鼠标,弹出一个我的对话框。
但我明明在对话框里写明了onChar,onkeydown,事件,但不反应。
当我按空格时,对话框默认的处理过程是这样,相当于按按钮,如果当前cancel按纽
获得焦点,那么,空格一按,cancel起作用了,关闭对话框。
我想截获空格消息,然后处理我的内容,对话框上的按纽不作出反映
高手请教
...全文
92 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧