微软MFC技术中的消息队列及消息处理(下)

这篇具有很好参考价值的文章主要介绍了微软MFC技术中的消息队列及消息处理(下)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 微软MFC技术中的消息队列及消息处理(下),Visual Studio技术,microsoft,mfc,c++,windows

我是荔园微风,作为一名在IT界整整25年的老兵,今天来聊聊微软MFC技术中的消息队列及消息处理。

MFC应用程序中由Windows 系统以消息的形式发送给应用程序的窗口。窗口接收和处理消息之后,把控制返回给Windows。Windows系统在同一时间可显示多个窗口。此系统利用消息队列来记录鼠标和键盘输入到相应窗口等消息。如果用户移动鼠标或敲一下键盘,鼠标或键盘的设备驱动器都会把此输入转换成消息,并把它们放到系统消息队列中去。Windows从系统队列中每次读取一条消息, 然后将其从队列中删除,之后处理它们发送到相应的窗口过程。

消息队列是一种先进先出的队列型数据结构,它实际上是系统内核中的一个内部链表。用户可以从消息队列中添加消息和读取消息,而消息则被顺序地插入到队列中。其中发送进程将消息添加到队列末尾,接收进程会从队列头读取消息。

今天我们接之前的《微软MFC技术中的消息队列及消息处理(上)》继续往下讲。

详解具体实例——消息的处理

首先用visual studio 2022新建一个工程名为Win32_message的Win32应用程序。工程建好后,新建一个源文件,命名为 Win32_message.cpp。此程序实现的功能是创建一个窗口,当按键盘上的按键时,会出现一个消息盒子,如“所按键的字符值是98”。如果按下Backspace键时,一旦消息发送成功,会出现有“发送后退消息成功”提示语句的消息盒子,否则,会出现“发送后退消息失败”等类似其他消息响应。我们来看看下面的代码,先看此程序的入口函数WinMain()。

Win32应用程序入口函数示例:Win32_message.cpp

//Win32应用程序入口函数WinMain()
int WINAPI WinMain(
  HINSTANCE hInstance,      //指向当前实例的句柄
  HINSTANCE hPrevInstance,      //指向先前实例的句柄
  LPSTR lpCmdLine,      //命令行
  int nCmdShow         //显示状态
)
{
  WNDCLASS wndclass;      //创建一个窗口类 
  wndclass. cbClsExtra=0;     //窗口类无扩展
  wndclass. cbWndExtra=0;    //窗口实例无扩展
  wndclass. hbrBackground=(HBRUSH)GetStockObject (BLACK_BRUSH);  //窗口背景为黑
  wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);    //窗口采用箭头光标
   wndclass. hIcon=LoadIcon(NULL, IDI_APPLICATION);  //窗口的最小化图标为缺省
  wndclass. hInstance=hInstance:  //当前实例句柄
  wndclass. lpfnWndProc=WinHouProc    //定义窗口处理函数
  wndclass.lpszClassName="VC++";      //窗口类为“VC++”
  wndclass.lpszMenuName=NULL;        //窗口无菜单
  wndclass.style=CS_HREDRAW|CS_PARENTDC;          //设置窗口类型
  RegisterClass(&wndclass);        //注册窗口类

  HWND hwnd;
  hwnd=CreateWindow("VC++","消息机制",WS_OVERLAPPEDWINDOW,0,0, 600, 400, NULL, NULL, hInstance, NULL);       //创建窗口

  ShowWindow(hwnd, SW_SHOWNORMAL);         //显示窗口
  UpdateWindow(hwnd);                 //更新窗口

  MSG msg;
  while(GetMessage 6msg, NULL,0,0))       //获取消息
  {
      TranslateMessage (&msg);
      DispatchMessage (&msg);
   }
  return 0;
}

从代码可以大致看出此程序的运行机制。要想显示一个窗口并执行各种命令,应先创建一个窗口。第9行对应创建窗口类这一步,而第16行表明将函数 WinHouProc()赋给此窗口的消息响应函数。第20行对应注册窗口类,这样一个窗口类已形成。接下来第23行就要定义一个窗口的大小、位置、窗口显示名字等信息。窗口也创建好之后,第26~27行就要显示窗口并实时更新此窗口的状态。最后第30行就是要处理关联此窗口的各种消息,判断当前是否得到消息,并形成循环。

讨论完入口函数,就要介绍此窗口的消息响应函数,代码为下面所示的消息响应函数WinHouProc()。

Win32应用程序消息响应函数示例:Win32_message.cpp

LRESULT CALLBACK WinHouProc(
  HWND hwnd,          //窗口句柄
  UINT uMsg,          //消息标识符
  WPARAM WParam,      //第一个消息参数
  LPARAM lParam        //第二个消息参数
)
{
  switch(uMsg)
  {
  case WM_CHAR:
      switch(wParam)      //显示所按键值
     {
      case 0x08:         //后退键
           if(PostMessage (hwnd, WM_KEYDOWN, VK_DELETE, 1L))
                MessageBox(hwnd,"发送后退消息成功","VC++",0);
             else
                 MessageBox(hwnd,"发送后退消息失败","VC++",0);
             break;
      default:
            break;
       }
    char szChar[20];
    sprintf(szChar,"所按字符值是%d",wParam);      //转换按键值类型
     MessageBox(hwnd, szChar, "VC++", 0);        //显示按键的值
      break;
   case WM_CLOSE:       //有提示消息的关闭窗口
      if(IDYES=MessageBox(hwnd,"是否结束?","VC++",MB_YESNO)   //判断
           DestroyWindow(hwnd);       //銷毀窗口
      break;
  case WM_DESTROY:                //强制关闭
    PostQuitMessage(0);       //发送关闭消息
    break;
  default:
    return DefWindowProc(hwnd,uMsg,wParam,lParam);     //返回窗口过程
   }
  return 0;
}

代码说明了3种功能:显示按键值、有提示消息的关闭、强制关闭。第14行是PostMessage()函数的应用,如果后退消息发送成功,就提示“发送后退消息成功”。第31行 PostQuitMessage()是 PostMessage()传递关闭消息的一种简单形式。

但是要注意的是,如果是在比VC++6.0和VS2003高级的版本上运行以上所编的程序时,就是立刻报一大堆错,应修改一下工程的编码选项:项目属性——常规——字符集——使用多字节字符集。否认显示文字部分会出现乱码。因为VC++6.0与VS2003默认使用ANSI编码,而VS2022及以上版本默认采用 Unicode。

作者简介:荔园微风,1981年生,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。文章来源地址https://www.toymoban.com/news/detail-566031.html

到了这里,关于微软MFC技术中的消息队列及消息处理(下)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Visual Studio 2022的MFC框架——theApp全局对象

      我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来重新审视一下Visual Studio 2022下开发工具的MFC框架知识。  MFC中的WinMain函数是如何与MFC程序中的各个类组织在一起的呢?MFC程序中的类是如何与WinMain函数关联起来的呢? 面对这个问题,我们来分析一下。 双击我在

    2024年02月11日
    浏览(38)
  • 微软MFC技术运行机制

    我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下微软MFC技术运行机制。 很多初学者误以为VC++开发必须使用MFC,其实不一定的。MFC的使用只能是提高程序在某些情况下的开发效率,而不能替代整个Win32程序设计。我认为我们有必要再来好好讲讲MFC的本质、MFC中的

    2024年02月08日
    浏览(43)
  • 微软MFC技术简明介绍

    我是荔园微风,作为一名在IT界整整25年的老兵,今天来看一下微软MFC技术简明介绍 微软公司于1992年上半年推出了C/C++ 7.0 产品时初次向世人介绍了MFC 1.0,这个产品包含了20,000行C++原始代码,60个以上的Windows相关类,以及其它的一般类如时间、数据处理、文件、内存、诊断、

    2024年02月11日
    浏览(39)
  • HALCON的综合应用案例【01】: 3D 算法处理在 Visual Studio 2019 C# 环境中的集成实例

    HALCON 为一款比较流行的商业视觉处理软件,他提供了多种开发的模式,可以在HALCON中开发,也可以将HALCON的设计通过导出库的形式集成到其他开发环境里面,以方便系统集成。本文为笔者自己的一个3D 视觉检测项目,利用HALCON的3D 库开发算法,然后,将算法集成到 MS-VS-C#的环

    2024年02月06日
    浏览(49)
  • Visual Studio 2022的MFC框架——AfxWinMain全局对象和InitInstance函数

    我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来重新审视一下Visual Studio 2022下开发工具的MFC框架知识。  在看这篇帖子前,请先看我的另一篇帖子《Visual Studio 2022的MFC框架——应用程序向导》。 当程序调用了CWinApp类的构造函数,并执行了CMfcApp类的构造函数,且产

    2024年02月10日
    浏览(37)
  • 微软 Visual Studio 迎来 AI 建议命名功能

    目录 1微软 Visual Studio 迎来 AI 建议命名功能 2专访核桃编程CEO曾鹏轩:实操是掌握编程技能的唯一办法 IT之家 12 月 19 日消息,使用付费 GitHub Copilot Chat 扩展的 Visual Studio Preview 用户,现在可以使用 AI 来建议变量、方法和类的名称。 微软表示,该扩展不仅仅是建议一个名称,

    2024年02月03日
    浏览(36)
  • Microsoft Message Queue(MSMQ:微软消息队列)简介

    最近在安装公司的一个产品时,接触到了MSMQ,在此对MSMQ做一个简单的介绍,以便各位能对它有一个快速、直观的认识。本文针对于Microsoft Message Queue,以下提到的消息队列均指代Microsoft Message Queue。 2.1、消息队列是什么 MSMQ是一个Windows上的功能。主要用于多个应用之间实现相

    2024年02月09日
    浏览(60)
  • 如何在微软官网上下载旧版本的visual studio

    想在微软官网下载旧版本的VS. 太长不想看的可以直接戳网址进入最终的界面:Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 想从官网首页一步一步进入到最终下载界面的可以看下面详细步骤:          1.进入微软官网首页,Microsoft - 云、计算机、应用和游戏,依次点

    2023年04月23日
    浏览(57)
  • 离线环境下安装微软Visual Studio 2022 生成工具

    最近,在学习cython的时候,需要安装windows下的C/C++编译、链接工具。开始觉得传统的msvc太大了,想要尝试Mingw,但是都是编译错误。无奈之下,还是要安装msvc。 微软提供了Visual Studio 2022 Build Tools ,其可以独立于vs2022安装,总算是可以减少点体积。 注意:MSbuild和msvc的关系,

    2024年02月16日
    浏览(50)
  • Visual Studio在Debug模式下,MFC工程中包含Eigen库时的定义冲突的问题

    EigensrcCorePlainObjectBase.h(143,5): error C2061: 语法错误: 标识符“THIS_FILE” EigensrcCorePlainObjectBase.h(143,1): error C2333: “Eigen::PlainObjectBase::operator new”: 函数声明中有错误;跳过函数体 EigensrcCoreCwiseNullaryOp.h(341,27): error C2039: “setConstant”: 不是 “Eigen::PlainObjectBase” 的成员 以上仅

    2024年02月14日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包