CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

请教一个Windows的消息问题,看来简单,其实很深奥,请高手指教,100分相送!谢谢!

楼主quyuan(quyuan)2004-09-01 11:47:01 在 VC/MFC / 基础类 提问

BOOL   CGnDlg::PreTranslateMessage(MSG*   pMsg)  
  {  
  if(pMsg->message==WM_KEYDOWN)  
  {  
            bool   result;  
                          switch(pMsg->wParam)  
  {  
  case   VK_RETURN:  
   
  result=this->game->Compare(this->pInput->input_number);  
   
  if   (TRUE==result)  
  {  
  GameOver(TRUE);  
  break;  
  }  
  if(7==game->g_count)  
  {  
  GameOver(FALSE);  
  break;  
  }  
  break;  
  }  
  }  
  return   CDialog::PreTranslateMessage(pMsg);  
  }  
   
  void   CGnDlg::GameOver(bool   win)  
  {  
  if(TRUE==win)  
  {  
  AfxMessageBox("You   Win!");  
  if(game!=NULL)    
  {  
  delete   game;  
  game=NULL;  
  }  
        this->pInput->EnableWindow(0);<-就是这个语句造成反复执行case   VK_RETURN:中的内容  
   
   
  }else  
  {  
  AfxMessageBox("You   Lost!");  
   
        this->pInput->EnableWindow(0);<-就是这个语句造成反复执行case   VK_RETURN:中的内容  
   
   
  }  
  }  
   
   
  代码如上:我把gameover中的this->pInput->EnableWindow(0);去掉后,就不会反复调用case   VK_RETURN:中的内容了,也就是说this->pInput->EnableWindow(0);产生了WM_KEYDOWN消息,而且无论case   VK_RETURN:和case   VK_F2:中的内容都会执行,为什么会造成这种原因? 问题点数:100、回复次数:11Top

1 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2004-09-01 11:52:01 得分 0

PreTranslateMessage中你需要判断消息来自于什么窗口,也就是pMsg->hWnd。Top

2 楼he_zhidan(何志丹:www.dzlishi.net,www.vcshare.net)回复于 2004-09-01 11:59:28 得分 0

AfxMessageBox("You   Win!");  
  就是不是用回车关闭的Top

3 楼he_zhidan(何志丹:www.dzlishi.net,www.vcshare.net)回复于 2004-09-01 12:00:02 得分 0

可能是这产生的Top

4 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2004-09-01 12:03:36 得分 0

在PreTranslateMessage中弹出消息框很容易让程序当掉的哟。Top

5 楼quyuan(quyuan)回复于 2004-09-01 12:09:18 得分 0

to     he_zhidan(何志丹:www.vcshare.net)   :  
  我用鼠标和键盘的结果都是一样的  
   
  to     DentistryDoctor(牙科医生)   你说的关系好像不大吧,因为它总是产生wm_keydownTop

6 楼quyuan(quyuan)回复于 2004-09-01 12:20:04 得分 0

to     DentistryDoctor(牙科医生)   :我把对话框去掉也一样的Top

7 楼flyelf(空谷清音)回复于 2004-09-01 12:25:26 得分 80

if   (TRUE==result)  
  {  
  GameOver(TRUE);  
  // break;  
  return   TRUE;  
  }  
  Top

8 楼laiyiling(陌生人[MVP])回复于 2004-09-01 12:30:12 得分 20

如果WM_KEYDOWM目标窗口是Control消息流向如下:下面所说的“处理了”的意思是返回true.  
          CWinThread::PUMPMESSAGE()从消息队列中取得WM_KEYDOWM  
                                                ↓  
            CWinThread::PreTranslateMessage处理--->使用WalkPreTranslateTree让从该控件遍列其父窗口直到主                                                                                         窗口,让他们依次处理,如果其中一个处理了则结束循环。  
                                                                        其实是分别调用他们的PreTranslateMessage  
                                                ↓未处理  
                                ::TranslateMessage-->产生WM_CHAR消息放入消息队列(不考虑其他情况)  
                                                ↓  
                                ::DispathMessage     -->让该控件窗口消息函数WindowProc处理,遍列消息表找到WM_KEYDOWN的消息影射函数OnKeyDown在其中处理  
                                                                                              ↓   未处理  
                                                                          到该控件的DefWindowProc中作最后的处理,如记录按键的次数以供后                                                                         面处理。  
                                                ↓  
                                  该消息处理结束,再取的下一个消息WM_CHAR  
                                                ↓  
              CWinThread::PreTranslateMessage处理-->和上面处理WM_KEYDOWM一样    
                         
        可以在CAppDlg::PreTranslateMessage()、CDebugEdit::PreTranslateMessage()、CDebugEdit::WindowProc()、CDebugEdit::OnChar()、CDebugEdit::DefWindowProc()处理输入字符,但后面的必须保证前面消息流正常运行,正确处理之后保证返回true  
   
  如果你使用在CDebugEdit::OnKeyDown()中使用MessageBox作提示的话,这里就有个问题了。你会先得到CDebugEdit::OnChar()中的MessageBox提示。这是因为当产生一个MessageBox时会有一个消息循环并且从消息循环中取得下一个消息,也就是刚刚由TranslateMessage产生的WM_CHAR(因为消息是FIFO的,WM_CREATE还在后面呢)。当然该MessageBox不会处理这个消息,所以就到了CDebugEdit::OnChar()中,就弹出了一个MessageBox。  
  同样道理也接受不到WM_KEYUP,因为该消息是产生MessageBox时发出的。这时的焦点窗口是该MessageBox的确定按纽。Top

9 楼crystal521(【云淡风轻】)回复于 2004-09-01 13:08:47 得分 0

upTop

10 楼quyuan(quyuan)回复于 2004-09-01 13:14:10 得分 0

to     laiyiling(最熟悉的陌生人)   :  
  我把对话框去掉了,可问题依旧在阿Top

11 楼quyuan(quyuan)回复于 2004-09-01 13:17:46 得分 0

to   flyelf(空谷清音)   :  
  我用你的方法就可以了,能告诉我为什么吗?我可以把分数全给你,谢谢你了!Top

相关问题

  • 关于VC++的简单又深奥的问题,请专家解惑
  • 来看 来看 很简单的问题!!!
  • Windows服务简单问题
  • 200分的大难题!!!!(我不会,也许高手看来很简单!!)
  • 关于windows消息的简单问题
  • 很简单:windows 网络编程
  • 关于Windows API的简单问题
  • 关于 windows API 的简单问题
  • 我是一个新手,遇到一个高手看来极其简单的问题,帮忙看看吧!谢谢.
  • 看来给的分是少了,原本以为很简单的一个问题:中文乱码问题!

关键词

  • 消息
  • 控件
  • 循环
  • game
  • cdebugedit
  • 处理
  • pretranslatemessage
  • pinput
  • keydowm
  • gameover

得分解答快速导航

  • 帖主:quyuan
  • flyelf
  • laiyiling

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo