微软MFC技术中消息的分类

 我是荔园微风,作为一名在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深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

离线环境下安装微软Visual Studio 2022 生成工具

1. 前言 最近&#xff0c;在学习cython的时候&#xff0c;需要安装windows下的C/C编译、链接工具。开始觉得传统的msvc太大了&#xff0c;想要尝试Mingw&#xff0c;但是都是编译错误。无奈之下&#xff0c;还是要安装msvc。 微软提供了Visual Studio 2022 Build Tools &…

12.JavaWeb-Node.js+创建Vue项目

1.Node.js的概念 传统的Web服务器中&#xff0c;每个请求都会创建一个线程&#xff0c;这会导致线程数的增加&#xff0c;从而影响服务器的性能和扩展性&#xff0c;Ryan Dahl借助Chrome的V8引擎提供的能力实现了Node.js——可以在服务端运行的JavaScript&#xff08;可以把Nod…

高数(下) 第九章:多元函数微分学 及其应用

文章目录 Ch9. 多元函数微分学 及其应用(一) 二重极限&#xff08;二元函数的极限&#xff09;(二) 多元函数的连续性(三) 偏导数1.偏导数的定义2.二阶混合偏导数相等3.变限积分求偏导 (四) 二元可微&#xff1a;全增量、全微分(五) 多元复合函数 求导法则(六) 多元隐函数 的求…

Mac如何在终端使用diskutil命令装载和卸载推出外接硬盘

最近用 macOS 装载外接硬盘的时候&#xff0c;使用mount死活装不上&#xff0c;很多文章也没详细的讲各种情况&#xff0c;所以就写一篇博客来记录一下。 如何装载和卸载硬盘&#xff08;或者说分区&#xff09; mount和umount是在 macOS 上是不能用的&#xff0c;如果使用会…

R语言——字符串处理

paste(abc, def, gh, sep ) #粘贴字符串 substr(abcdefg, 2, 3) # 取特定字符串 gsub(abc, , c(abc, abcc, abcbc)) # 将字符串中abc替换为空 strsplit(a;b;c, ;, fixed T) # 按照;切分字符串 strsplit(a222b2.2c, 2.2, fixed F) # 按照正则表达式分隔&#xff0c;这里的.是…

解放运营人员:钡铼技术S475物联网网关实现养殖环境的远程监控与告警

在养殖行业中&#xff0c;对环境参数的精确监测与控制至关重要。然而&#xff0c;传统的监测方法往往存在诸多痛点&#xff0c;如数据采集不准确、传输速度慢、可视化效果差等。为了解决这些问题&#xff0c;钡铼技术公司推出了其旗舰产品——S475多功能RTU&#xff0c;该产品在…

外包干了2个月,技术退步明显...

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

云原生之深入解析K8S的请求和限制

一、Kubernetes 限制和请求 在 Kubernetes 中使用容器时&#xff0c;了解涉及的资源是什么以及为何需要它们很重要。有些进程比其它进程需要更多的 CPU 或内存&#xff0c;这很关键&#xff0c;永远不应该让进程饥饿&#xff0c;知道了这一点&#xff0c;那么应该正确配置容器…

Visual Studio 2017下的C++开发环境搭建

Visual Studio 是Microsoft旗下的开发工具包系列产品&#xff0c;是一个基本完整的开发工具集&#xff0c;它包括整个软件生命周期中所需要的大部分工具&#xff0c;如UML工具、代码管控工具、集成开发环境(IDE)等等&#xff0c;是最流行的Windows平台应用程序的集成开发环境。…

【Springboot集成Neo4j完整版教程】

&#x1f680; Neo4j &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;C…

低代码平台的价格范围及购买成本分析

Zoho Creator是一款强大而灵活的低代码应用程序开发平台&#xff0c;可帮助企业快速、高效地创建各种应用程序。但是&#xff0c;很多人可能会担心它的价格问题。在这篇文章中&#xff0c;我们将深入探讨Zoho Creator的定价策略和计划&#xff0c;以帮助您更好地理解其价格结构…

vue+elementui实现联想购物商城,样式美观大方

目录 一、首页效果图对比 1.联想商城首页截图&#xff1a; 2.作者项目效果图&#xff1a; 二、商品详情效果图对比 1.联想官方截图&#xff1a; 2.作者项目截图&#xff1a; 三、项目实现 1.数据分离维护 2.首页推荐列表数据处理 3.商品详情数据动态获取完成交互 4.商品详…

Spring MVC是什么?详解它的组件、请求流程及注解

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 前言 本文将讲解Spring MVC是什么&#xff0c;它的优缺点与九大组件&#xff0c;以及它的请求流程与常用的注解。 目录 一、Spring MVC是什…

「深度学习之优化算法」(十)烟花算法

1. 烟花算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读)   烟花算法(Firework Algorithm,FWA)是一种受烟花爆炸产生火星,并继续分裂爆炸这一过程启发而得出的算法。算法的思想简单,但具体实现复杂。算法提出时间并不长,但是已经有了不少的改进研究和较为全…

网络安全(黑客)内网渗透基础知识

0x01 内网概述 内网也指局域网&#xff08;Local Area Network&#xff0c;LAN&#xff09;是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理、应用软件共享、打印机共享、工作组内的历程安排、电子邮件和传真通信服务等功能。 内…

K8s集群部署最新Jenkins 2.387.1

K8s集群部署最新Jenkins 2.387.1 概述环境准备设置存储目录并启动NFS服务安装 NFS 服务端 动态创建 NFS存储&#xff08;动态存储&#xff09;部署jenkins服务 概述 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作…

5、架构:通用 Schema 设计

作为前端开发一定会非常熟悉 AST 抽象语法树&#xff08;Abstract Syntax Tree&#xff09;&#xff0c;当浏览器加载 JS 代码时&#xff0c;它会首先将代码转换为一棵抽象语法树&#xff08;AST&#xff09;&#xff0c;然后再根据 AST 来渲染对应的 DOM 结构&#xff0c;对于…

[工业互联-16]:工业Windows操作系统与实时性方案

目录 第1章 Windows操作系统 1.1 简介 1.2 Windows架构 第2章 工业Windows操作系统 2.1 简介 2.2 常见的工业Windows操作系统版本 2.3 定制化工业Windows 第3章 EtherCAT实时Windows方案 3.1 实时Windows的缘由 3.2 总体框架 3.3 ROS2方案 3.4 方案1&#xff1a;使…

Sumifs函数(excel)

SUMIFS 函数是一个数学与三角函数&#xff0c;用于计算其满足多个条件的全部参数的总量。excel如何使用Sumifs函数&#xff1f; 工具/原料 联想ThinkPad X1 windows7 WPS office2021 方法/步骤 首先运行office软件&#xff0c;打开一份表格&#xff0c;今天我们要计算以“…

ASL-QPSO|改进量子粒子群自适应算法及其实现(Matlab)

作者在前面的文章中介绍了量子粒子群算法&#xff0c;量子粒子群算法不但继承粒子群算法的优点&#xff0c;还有它自身计算模型更加简洁&#xff0c;控制参数更少等更加突出的优势&#xff0c;但依然存在着一定的局限性。 例如也会存在着早熟收敛的问题&#xff0c;随着迭代次数…