微软MFC技术中消息的分类

news2024/9/21 17:39:24

 我是荔园微风,作为一名在IT界整整25年的老兵,今天来聊聊MFC技术中消息的分类。

微软Windows中的消息虽然很多,但是种类并不繁杂,大体上有3种:窗口消息、命令消息和控件通知消息。

窗口消息

窗口消息是系统中最为常见的消息,它是指由操作系统和控制其他窗口所使用的消息。例如,CreateWindow、DestroyWindow和 MoveWindow。下面代码以MFC单文档程序Message为例。

框架类中创建工具栏与状态栏示例:MainFrm.cpp如下:

int CMainFrame::OnCreate (LPCREATESTRUCT lpCreatestruct)
{
  if (CFrameWnd::OnCreate(lpCreateStruct)==-1)
      return -1;

   //创建工具栏
  if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))     
  {
  TRACE0("Failed to create toolbar\n");
  return -1;  //创建失败
    }
   
   //创建状态栏
  if(!m_wndStatusBar.Create(this)||!m_wndStatusBar.SetIndicators (indicators,sizeof (indicators)/sizeof (UINT)))
   {
  TRACEO ("Failed to create status bar\n");
  return -1;    //创建失败
    }  
  return 0;
}
 

第5行中的m_wndToolBar.CreateEx()用来创建工具栏窗口,第14行的m_wndStatusBar.Create()用来创建状态栏窗口。

命令消息

命令消息是一种特殊的窗口消息,它一般与处理用户请求相关,当用户单击一个菜单项或工具栏时,命令消息产生,并被发送到能处理该请求的类对象。命令消息与窗口消息(除WM_COMMAND之外,前缀是WM_的消息)不同,窗口消息与某一窗口紧密相关,应该由接收消息的窗口来处理;而命令消息与具体的窗口无关,只是为本程序完成一个功能操作。

接下来以给视图类加入MouseMove()命令消息为例说明。

(1)在类视图中单击CMessageView,之后会在工程窗口的右上方看到消息添加功能键。如果给视图类添加命令消息,就必须单击视图,如果给框架类添加框架,就必须单击CMainFrame。 VS2005及其以后版本则不同于VC++6.0。在VC++6.0中右击就会出现“Add  windows  Message  Handle...”选项。

(2)单击消息添加功能键第5个按钮,就会在下方看到各种命令消息。

(3)在各种命令消息界面中单击选项“<Add>OnMouseMove”后,在MessageView.cpp中就会自动生成代码,如下面代码所示。至此完成了按钮控件消息的添加。

视图类中的命令消息示例:MessageView.cpp
 

void CMessageView::OnMouseMove (UINT nFlags, CPoint point)
{
  //可以在这里添加你自己的代码

  CView::OnMouseMove(nFlags, point);
}
  

代码可以实现视图窗口中关联光标移动的命令消息。大家可以在第3行添加自己的代,以实現不同的功能。当光标移动时产生一个命令消息传递给视图口。此命消息在视图类的消息映射表现形式如下代码第6行:

BEGIN_MESSAGE_MAP(CMessageView, CView)
  // Standard printing commands
  ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
  ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
  ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFileprintpreview)
    ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()

控件通知消息

控件通知消息用于当一个窗口内的子控件发生了一些事情需要通知父窗口。通知消息只适用于标准的窗口控件(如按钮、编辑框、单选框)以及Windows公共控件(如树状视图、列表视图等)。

例如,单击或双击一个控件、操作控件的滚动条、在控件中选择文本都会产生通知消息。当用户与控件窗口交互时,那么控件通知消息就会从控件窗口发送到它的主窗口。但这种消息并不是为了处理用户命令,而是让主窗口能够实时改变控件的状态,例如加载资源、显示数据。例如滑动一个滚动条,它向父窗口发送的消息可以看作是一个控件通知消息。

窗口消息及控件通知消息主要由窗口类来处理。相对于这两个消息,命令消息的处理对象范围就广得多,它不仅可以由窗口类处理,还可以由文档类、文档模板类及应用类所处理。

对于控件通知消息,本文只列举如下几个常用控件的常用通知消息:

按钮控件

BN_CLICKED:用户单击了按钮。
BN_DOUBLECLICKED:用户击了按钮。
BN_ KILLFOCUS:按钮失去了输入焦点。
BN_SETFOCUS:钮获得输入焦点。
BCN_HOTITEMCHANGE:高亮的条目被改变
NM_THEMECHANGED:主题被改变。

编辑框控件

EN_CHANGE:编辑框中的文本已更新。
EN_ERRSPACE:编辑框内存不足。
EN_HSCROLL:用户单击了水平滚动条。
EN_ KILLFOCUS:编辑框正在失去输入焦点。
EN_MAXITEXT:插的内容被断。
EN_SETFOCUS:编辑框获得输入焦点。
EN_UPDATE:编辑框中的文本将要更新。
EN_VSCROLL:用户单击了垂直滚动条消息含义。
EN_ALIGN_LTR_EC:用户从左到右改变了编辑框的方向。
EN_ALIGN_RTL_EC:用户从右到左改变了编辑框的方向。

组合框控件

CBN_SELCHANGE:在组合框中选择了一项。
CBN_EDITCHANGE:用户修改了编辑框中的文本。
CBN_CLOSEUP:组合框的列表框被关闭。
CBN_DBLCLK:用户双击了一个字符串。
CBN_DROPDOWN:组合框的列表框被拉出。
CBN_EDITUPDATE:编辑框内的文本即将更新。
CBN_ERRSPACE:组合框内存不足。
CBN_KILLFOCUS:组合框推动输入焦点。
CBN_SELENDCANCEL:用户的选择应当被取消。
CBN_SELENDOK:用户的选择是合法的。
CBN_SETFOCUS:组合框获得输入焦点。

首先新建一个基于对话框的 MFC工程 MFC_message,然后在对话框上添加了一个按钮,命名为“确定”。要实现单击此按钮完成相应的功能。因此控件通知消息的类型为BN_CLICKED。具体实现步骤如下:

(1)在资源视图中右击“确定”按钮控件,出现菜单有一项叫添加事件处理程序。给按钮添加消息命令,直接双击此按钮即可。但此种做法有个缺点,就是控件消息响应函数的名字只能是系统默认的,不能随意改变。

(2)选择菜单中的“添加事件处理程序..”命令后,出现新的画面。

(3)在“消息类型”列表框中选择BN_CLICKED选项,“类列表”选项默认为CMFC_MessageDlg,此处不变。在“函数处理程序名称”列表框中可以为按钮的单击事件响应函数命名,因此大家可以随便取名。之后单击右下方第一个“添加编辑”按钮即可。以上3步完成后,系统会在文件中自动生成如下代码:

头文件 MFC_MessageDlg.h

afx_msg void OnBnClickedOk();

 源件MFC_MessageDlg.cpp:

按钮控件单击消息映射表现形式如下代码6行:

BEGIN_MESSAGE_MAP (CMEC_MessageDlg, CDialog)
  ON_WM_SYSCOMMAND()
  ON_WM_PAINT()
  ON_WM_QUERYDRAGICON()
  ON_BN_CLICKED(IDOK, &CMFC_MessageDlg::OnBnClickedOk)
END_MESSAGE_MAP()

而具体函数定义体如下:

视图类中的命令消息示例:MFC_MessageDlg.cpp

void CMFC_MessageDlg::OnBnClickedOk()
{
  //可以在此添加你自己的按钮控制消息

  OnOK();
}

由上面定义体可知,当单击“确定”按钮时,就会关闭对话框。如果你想改变此功能,可以从第4行开始写入新的代码。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/729253.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全(黑客)自学路线

一.零基础学习 在网络安全的学习过程中&#xff0c;基础知识是一个绕不过的问题&#xff0c;Web知识本身就非常丰富&#xff0c;覆盖范围也非常广泛。 首先是大家比较熟悉的浏览器、数据库、服务器&#xff1b; 以及由简到难的HTML、JavaScript和CSS、PHP、Java、.net&#…

【Flutter】使用 Drift 实现 Flutter 数据持久化

文章目录 一、前言二、版本信息三、Drift 简介四、如何安装和设置 Drift五、基础使用1. 创建数据库和表2. 插入、查询、更新和删除数据3. 使用事务 六、总结 一、前言 你是否渴望成为 Flutter 的专家&#xff0c;掌握更多的技巧和最佳实践&#xff1f;我们有个好消息要告诉你&…

【vue3】学习笔记--组件通信方式

学习vue3总是绕不开vue2 vue2组件通信方式总结&#xff1a; 1、props&#xff1a;可以实现父子组件&#xff0c;子父组件&#xff0c;甚至兄弟组件通信 2、自定义事件&#xff1a;实现子父组件通信 3、全局事件总线$bus:可以实现任意组件通信 4、pubsub&#xff1a;发布订阅模…

目标检测常用的评价指标

目标检测常用的评价指标 1 IoU&#xff08;Intersection over Union&#xff09;2 GIoU&#xff08;Generalized IoU&#xff09;3 DIoU&#xff08;Distance-IoU&#xff09;4 CIoU&#xff08;Complete-IoU&#xff09;5 EIoU&#xff08;Efficient-IoU&#xff09;6 SIoU7 W…

爬虫入门07——requests中携带cookie信息

爬虫入门07——requests中携带cookie信息 对于需要登陆的网站如果不携带cookie是无法获取我们所需内容的就以查看我在CSDN中的订单为例&#xff0c;在登陆后可以查看到订单信息 而当我们使用Python代码发出请求时&#xff0c;是不携带cookie&#xff0c;因此无法拿到订单相关信…

Flink的状态是否支持任务间共享

背景&#xff1a; 在日常编写代码的过程中&#xff0c;我们经常会在方法内部new很多的其他类对象来进行编码工作&#xff0c;那么对于这种情况怎么让new出来的对象是一个我们特意创建出来的一个mock实例&#xff0c;从而让我们能完全控制new出来的对象的所有行为呢&#xff1f…

【雕爷学编程】Arduino动手做(154)---AFMotor电机扩展板模块3

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

数模混合项目:模拟跨数字走线注意事项

数模混合项目中&#xff0c;模拟在数字上走线是常有的事&#xff0c;这里需要注意几个点: 1.模拟电源在数字上走线影响不大&#xff0c;但尽量走top metal和AP层。 2.模拟高频线&#xff0c;尤其是时钟&#xff0c;尽量不要在数字上走线&#xff0c;非要走&#xff0c;最好下…

数据总线学习

为啥要数据总线 使用服务化方式发布&#xff0c;业务端和中间件完全解耦合。一处生产&#xff0c;处处消费设计理念。提供用户可定制的托管化通用消费方案&#xff08;如同步mysql到缓存&#xff0c;同步mysql到es&#xff0c;消费mysql到大数据等托管服务&#xff09; 特性 …

python configparser模块常用方法以及常见报错处理

configparser 是 Python 中一个用于处理配置文件的标准库&#xff0c;可以帮助你生成、读取和修改配置文件的内容 1. 生成配置文件 import configparser# 创建一个配置文件对象 config configparser.ConfigParser()# 添加配置项和值 config[Section1] {key1: value1, key2: …

java 科学计算库 Smile

官网 https://haifengl.github.io/ github https://haifengl.github.io/ 简介 统计机器智能和学习引擎&#xff0c;或者简称 Smile&#xff0c;是一个有前途的现代机器学习系统&#xff0c;在某些方面类似于 Python 的 scikit-learn。它是用 Java 开发的&#xff0c;也提供…

私域账号防范手册

微信为什么要养号吗&#xff1f;为什么会被封&#xff1f;是什么原理&#xff0c;怎么解封&#xff0c;这些你的了解吗&#xff1f; 来看看这篇文章&#xff0c;这些都能给你解答。

向日葵远程命令执行漏洞(CNVD-2022-10270) 漏洞复现

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 漏洞描述02 影响范围03 利用方式05 实战案例06 修复方案 01 漏洞描述 向日葵远程控制是一款面向企业和专业人员的远程pc管理和控制的服务软件。可以在任何有网络的情况下&#xff0c;轻松访问并控制…

Linux命令之nc命令

一、命令简介 nc是netcat的简写&#xff0c;是一个功能强大的网络工具&#xff0c;有着网络界的瑞士军刀美誉。nc命令在linux系统中实际命令是ncat&#xff0c;nc是软连接到ncat。nc命令的主要作用如下&#xff1a; 实现任意TCP/UDP端口的侦听&#xff0c;nc可以作为server以T…

vue3中的包装响应式数据ref、reactive、toRef、toRefs

一、ref Vue 3中拥有一个新的特性叫做ref&#xff0c;它是一个函数&#xff0c;用于包装响应式数据。与Vue 2的data选项不同&#xff0c;ref可以在普通JavaScript中使用&#xff0c;而不仅仅是在Vue组件中。ref可以将普通的JavaScript数据变成响应式的&#xff0c;这意味着当被…

Python接口自动化测试post请求和get请求,获取请求返回值

引言 我们在做python接口自动化测试时&#xff0c;接口的请求方法有get,post等&#xff1b;get和post请求传参&#xff0c;和获取接口响应数据的方法&#xff1b; 请求接口为Post时&#xff0c;传参方法 我们在使用python中requests库做接口测试时&#xff0c;在做post接口测试…

Go语言-数组和切片有什么异同?

slice 的底层数据是数组&#xff0c;slice 是对数组的封装&#xff0c;它描述一个数组的片段。两者都可以通过下标来访问单个元素。 数组是定长的&#xff0c;长度定义好之后&#xff0c;不能再更改。在 Go 中&#xff0c;数组是不常见的&#xff0c;因为其长度是类型的一部分…

2023年第一届证券基金行业先进计算峰会在沪成功召开

2023年7月7日&#xff0c;在中国计算机学会集成电路设计专委会、中国通信学会金融科技发展促进中心、中国电子工业标准化技术协会新一代计算标准工作委员会和证券基金信息技术创新联盟WG1工作组的指导下&#xff0c;由中科驭数主办的2023年第一届证券基金行业先进计算峰会在上海…

以太网电子产品高低温循环测试

参考标准&#xff1a;《GB/T 2423.22-2012 环境试验 第2部分&#xff1a;试验方法 试验N&#xff1a;温度变化》&#xff1a;试验用来确定元器件、设备或其他产品耐受环境温度快速变化的能力。 1、测试影响因素 温度变化试验用来确定一次或连续多次的温度变化对试验样品的影响…

linux报错 /bin/bash^M:解释器错误:没有那个文件或目录

在Linux中运行脚本时&#xff0c;会出现linux报错 /bin/bash^M:解释器错误:没有那个文件或目录。这是因为我们将在Windows下编写的脚本拷贝到Linux环境中运行时会出现运行不了的情况。主要还是Windows的换行符为\r\n,而Linux环境中的换行符号为\n。 解决方法有&#xff1a;  …