Windows事件驱动机制-1

合集下载

C语言中的事件驱动编程

C语言中的事件驱动编程

C语言中的事件驱动编程事件驱动编程是一种常见的编程范式,它在许多领域中都有应用,包括计算机图形学、用户界面设计、游戏开发等。

C语言作为一种广泛使用的编程语言,也可以通过一些技巧和库来实现事件驱动编程。

本文将介绍C语言中的事件驱动编程的基本概念、实现方式以及一些常用的库。

一、事件驱动编程概述事件驱动编程是一种基于事件和回调机制的编程方法。

在事件驱动编程中,程序通过监听事件的发生来做出相应的动作。

事件可以是用户的输入、系统的消息、传感器的反馈等。

一旦某个事件发生,相应的回调函数将被调用,来处理该事件。

这种方式相比于传统的顺序执行编程,更加灵活和高效。

二、C语言中的事件驱动编程实践在C语言中,我们可以利用以下技巧和库来实现事件驱动编程。

1. 使用轮询机制轮询机制是最基本的事件驱动编程方法,即程序会不断地检查是否有事件发生。

我们可以使用循环语句不断地检查键盘输入、鼠标点击等事件,然后调用相应的函数来处理。

例如,下面是一个简单的C语言示例代码,使用轮询机制实现对键盘输入的监听:```c#include <stdio.h>int main() {char c;while(1) {if(kbhit()) {c = getch();printf("键盘输入:%c\n", c);}}return 0;}```在这个示例中,程序通过不断调用`kbhit()`函数来检查是否有键盘输入事件发生,如果有,则通过`getch()`函数获取键盘输入的字符,并进行相应的处理。

2. 使用回调函数除了轮询机制,C语言还可以通过回调函数来实现事件驱动编程。

回调函数是指在某个事件发生时被调用的函数。

例如,我们可以使用Windows API中的消息机制,通过注册回调函数来处理系统消息。

下面是一个简单的示例代码:```c#include <windows.h>// 回调函数,用于处理系统消息LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch(uMsg) {case WM_CLOSE:DestroyWindow(hwnd);break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hwnd, uMsg, wParam, lParam);}return 0;}int main() {// 创建窗口HWND hwnd;WNDCLASS wc = {0};wc.lpfnWndProc = WindowProc;wc.hInstance = GetModuleHandle(NULL);wc.lpszClassName = "EventDrivenProgramming";RegisterClass(&wc);hwnd = CreateWindow(wc.lpszClassName, "Event Driven Programming", 0, 0, 0, 0, 0, NULL, NULL, wc.hInstance, NULL);// 消息循环MSG msg;while(GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}return 0;}```在这个示例中,我们定义了一个回调函数`WindowProc`,用于处理Windows系统消息。

事件驱动的C51单片机编程模型

事件驱动的C51单片机编程模型

事件驱动的C51单片机编程模型
庞胜利
【期刊名称】《电脑编程技巧与维护》
【年(卷),期】2009(000)002
【摘要】C语言是嵌入式软件开发的主流语言,分析了C语言在C51系列单片机开发中的必要性和编程要点,特别是高级数据结构和程序库的应用.事件驱动是一种不同于逐句执行的线性结构程序的编程模型,并在Windows、Linux等高级操作系统中得到普遍应用;用C语言实现了在C51单片机应用中的事件驱动模型,讨论了事件源、消息队列、处理函数的具体实现,此模型具有较强的通用性和实用性.
【总页数】4页(P68-71)
【作者】庞胜利
【作者单位】西安邮电学院,继职学院,西安,710061
【正文语种】中文
【中图分类】TP3
【相关文献】
1.C51的结构体数据在单片机编程中的应用 [J], 贠书文;张志;李福凯
2.适用于电网多元数据的通用事件驱动型数据模型 [J], 鲍丽山;何金陵;唐灏;朱朝强;陈立政;;;;;
3.事件驱动的供应链安全评估预警模型研究 [J], 邱永哲;张智南
4.《C51单片机编程与仿真项目课程》线上教学改革与实践 [J], 夏晓玲
5.事件驱动传感器网络中基于学习向量量化模型的数据融合机制 [J], 孙海全;王峥;郭彦;李良;臧志成
因版权原因,仅展示原文概要,查看原文内容请购买。

event原理

event原理

event原理Event原理事件(Event)是计算机科学中的一个重要概念,它是指在计算机系统中的某个特定时刻发生的事情或者动作。

事件可以是用户的输入、系统的响应、传感器的检测等等。

在计算机编程中,我们经常使用事件来触发特定的逻辑处理。

本文将介绍事件的原理和应用。

一、事件的原理1. 事件驱动模型事件驱动模型是指计算机程序的运行方式,它通过监听和响应事件来控制程序的执行流程。

在事件驱动模型中,程序会一直等待事件的发生,当事件发生时,程序会执行相应的处理逻辑。

事件驱动模型的核心是事件循环(Event Loop),它是一个不断循环的过程,用于监听和分发事件。

2. 事件类型事件可以分为不同的类型,常见的事件类型包括鼠标事件、键盘事件、网络事件等。

每种事件类型都有对应的事件处理器,用于处理该类型的事件。

例如,鼠标事件包括鼠标移动、点击、滚动等,键盘事件包括按键按下、释放等。

3. 事件处理器事件处理器是用于处理特定类型事件的代码块。

当事件发生时,系统会调用对应的事件处理器来执行相应的逻辑。

事件处理器可以是预定义的函数,也可以是开发者自定义的函数。

开发者可以根据自己的需求,编写相应的事件处理器来响应事件。

4. 事件监听事件监听是指程序通过注册监听器来监听特定的事件。

当被监听的事件发生时,系统会通知所有注册了监听器的对象。

监听器可以是系统内置的监听器,也可以是开发者自定义的监听器。

通过事件监听,程序可以实时获取事件的发生,并进行相应的处理。

5. 事件触发事件触发是指通过人为或外部条件的变化来主动触发事件。

例如,用户点击按钮时,会触发鼠标点击事件;传感器检测到温度变化时,会触发温度变化事件。

事件触发可以通过调用特定的函数或者改变某些属性来实现。

二、事件的应用1. 图形界面编程在图形界面编程中,事件被广泛应用。

用户的输入操作,如鼠标点击、键盘输入等,都会触发相应的事件。

程序通过监听这些事件,并执行相应的处理逻辑,来实现与用户的交互。

事件驱动 状态机 实例讲解 -回复

事件驱动 状态机 实例讲解 -回复

事件驱动状态机实例讲解-回复什么是事件驱动?事件驱动(Event-driven)是一种计算机编程范例,它通过响应事件的方式来控制程序的执行流程。

事件驱动编程是一种反应性编程方法,它基于事件的发生而触发相应的处理流程。

在事件驱动的程序中,程序状态通常是静态的,只有当外部事件发生时,程序才会进入相应的处理流程,执行相关的代码。

事件驱动的编程模型可以适用于多种情况,如图形用户界面(GUI)开发、网络编程、服务器开发等。

在这些场景下,用户的操作、网络请求、外部设备的输入等都可以被视为事件,并通过事件驱动模型进行处理。

不同于传统的顺序编程模型,事件驱动模型具有以下几个特点:1. 程序按照事件顺序响应:程序会等待事件发生,然后根据事件的顺序依次进行处理。

事件驱动编程通常具有异步的特性,即不会一直等待事件的发生,而是可以同时处理多个事件。

2. 事件处理是离散的:每个事件都会有相应的处理流程,事件之间是相互独立的。

这使得程序能够更好地适应外部环境的变化。

3. 事件驱动编程具有高度的灵活性和可扩展性:由于事件驱动模型基于事件的发生来触发相应的处理流程,使得程序可以根据实际需求进行动态调整和扩展。

4. 事件驱动模型对并发和并行编程友好:事件驱动编程天然支持多线程、多任务并发执行。

不同的事件可以由不同的线程或进程处理,从而提高程序的执行效率和响应性。

什么是状态机?状态机(State machine)是一种将系统行为建模的数学模型。

它描述了一个系统的内部状态以及状态之间的转换规则。

状态机由一组状态和状态转移构成,状态表示系统所处的状态,转移表示状态之间的切换。

状态机可以分为两种类型:有限状态机(Finite-state machine,FSM)和无限状态机(Infinite-state machine)。

有限状态机中,状态的数量是有限的,系统的状态会在不同的输入条件下从一个状态转移到另一个状态,形成一个状态转移图。

无限状态机中,状态的数量是无限的,系统的状态可能具有连续性或无规律性。

第5讲 Windows消息机制及HOOK应用

第5讲 Windows消息机制及HOOK应用
过程 1.编写消息处理模块HookProc LRESULT CALLBACK HookProc 2.编写HOOK管理程序,负责管理HookProc 把HookProc挂接到消息处理队列中(顶端) 从消息处理队列中删除HookProc 。
HOOK管理的关键函数 SetWindowsHookEx UnhookWindowsHookEx CallNextHookEx
第5讲 Windows消息机制及HOOK应用
内容 事件/消息驱动 HOOK机制
1. Windows事件驱动机制
DOS程序的特点 顺序驱动和过程驱动
Windows程序的特点 操作无序 事件驱动 以消息为中心
WINDOWS消息处理过程
队列消息 基本上是用户输入的结果 击键(如WM_KEYDOWN和WM_KEYUP消息) 击键产生的字(WM_CHAR) 鼠标移动(WM_MOUSEMOVE)和鼠标按钮(WM_LBUTTONDOWN) 时钟消息(WM_TIMER) 更新消息(WM_PAINT) 退出消息(WM_QUIT)
消息处理程序C
消息处理程序B
HOOK概念
消息处理程序C 消息处理程序A
消息处理程序B
C就是HOOK程序。即钩子 程序
C → B → A: 消息处理函数链
HOOK本质 一段用于处理系统消息的程序,这段程序由用户编写,挂入该消息的处理函数链中,被 OS自动调用 。
HOOK技术典型应用 木马程序【特征:平时潜伏,消息触发】 屏幕抓词、进程监控、垃圾邮件过滤、软件界面定制、……
while(ParentWnd !=NULL) { glhTargetWnd=ParentWnd; ParentWnd=GetParent(glhTargetWnd); } GetWindowText(glhTargetWnd,szCaption,100); //取目标窗口标题

Windows事件ID及解释大全

Windows事件ID及解释大全

0 操作成功完成1 函数不正确2 系统找不到指定的文件3 系统找不到指定的路径4 系统无法打开文件5 拒绝访问6 句柄无效7存储控制块被损坏8 存储空间不足,无法处理此命令9 存储控制块地址无效10 环境不正确11 试图加载格式不正确的程序12 访问码无效13 数据无效14 存储空间不足,无法完成此操作15 系统找不到指定的驱动器16 无法删除目录17 系统无法将文件移到不同的驱动器18 没有更多文件19 介质受写入保护20 系统找不到指定的设备21 设备未就绪22 设备不识别此命令23 数据错误(循环冗余检查)24程序发出命令,但命令长度不正确25 驱动器找不到磁盘上特定区域或磁道26 无法访问指定的磁盘或软盘27 驱动器找不到请求的扇区28 打印机缺纸29 系统无法写入指定的设备30 系统无法从指定的设备上读取31 连到系统上的设备没有发挥作用。

32 另一个程序正在使用此文件,进程无法访问33 另一个程序已锁定文件的一部分,进程无法访问36 用来共享的打开文件过多38 已到文件结尾39 磁盘已满50 不支持请求51 Windows 无法找到网络路径。

请确认网络路径正确并且目标计算机不忙或已关闭。

如果Windows 仍然无法找到网络路径,请与网络管理员联系52 由于网络上有重名,没有连接。

请到“控制面板”中的“系统”更改计算机名,然后重试53 找不到网络路径54 网络很忙55 指定的网络资源或设备不再可用56 已达到网络BIOS 命令限制57 网络适配器硬件出错58 指定的服务器无法运行请求的操作59 出现了意外的网络错误60 远程适配器不兼容61 打印机队列已满62 服务器上没有储存等待打印的文件的空间63 已删除等候打印的文件64 指定的网络名不再可用65 拒绝网络访问66 网络资源类型不对67 找不到网络名68 超出本地计算机网络适配器卡的名称限制69 超出了网络BIOS 会话限制70 远程服务器已暂停,或正在启动过程中71 已达到计算机的连接数最大值,无法再同此远程计算机连接72 已暂停指定的打印机或磁盘设备80 文件存在82 无法创建目录或文件83 INT 24 上的故障84 无法取得处理此请求的存储空间85 本地设备名已在使用中86 指定的网络密码不正确87 参数不正确88 网络上发生写入错误89 系统无法在此时启动另一个进程100 无法创建另一个系统信号灯101 另一个进程拥有独占的信号灯102 已设置信号灯,无法关闭103 无法再设置信号灯104 无法在中断时请求独占的信号灯105 此信号灯的前一个所有权已结束107 由于没有插入另一个软盘,程序停止108 磁盘在使用中,或被另一个进程锁定109 管道已结束110 系统无法打开指定的设备或文件111 文件名太长112 磁盘空间不足113 没有更多的内部文件标识符114 目标内部文件标识符不正确117 应用程序发出的IOCTL 调用不正确118 验证写入的切换参数值不正确119 系统不支持请求的命令120 这个系统不支持该功能121 信号灯超时时间已到122 传递给系统调用的数据区域太小123 文件名、目录名或卷标语法不正确124系统调用级别不正确125 磁盘没有卷标126 找不到指定的模块127 找不到指定的程序128 没有等候的子进程130 试图使用操作(而非原始磁盘I/O)的已打开磁盘分区的文件句柄131 试图将文件指针移到文件开头之前132 无法在指定的设备或文件上设置文件指针133 包含先前加入驱动器的驱动器无法使用JOIN 或SUBST 命令134 试图在已被合并的驱动器上使用JOIN 或SUBST 命令135 试图在已被合并的驱动器上使用JOIN 或SUBST 命令136 系统试图解除未合并驱动器的JOIN137 系统试图解除未替代驱动器的SUBST138 系统试图将驱动器合并到合并驱动器上的目录139 系统试图将驱动器替代为替代驱动器上的目录140 系统试图将驱动器合并到替代驱动器上的目录141 系统试图替代驱动器为合并驱动器上的目录142 系统无法在此时运行JOIN 或SUBST143 系统无法将驱动器合并到或替代为相同驱动器上的目录144 目录不是根目录下的子目录145 目录不是空的146 指定的路径已在替代中使用147 资源不足,无法处理此命令148 指定的路径无法在此时使用149 企图将驱动器合并或替代为驱动器上目录是上一个替代的目标的驱动器150 系统跟踪信息未在CONFIG.SYS 文件中指定,或不允许跟踪151 为DosMuxSemWait 指定的信号灯事件数量不正确152 DosMuxSemWait 没有运行;已设置过多的信号灯153 DosMuxSemWait 列表不正确154输入的卷标超过目标文件系统的长度限制155 无法创建另一个线程156 接收人进程拒绝此信号157 段已被放弃且无法锁定158 段已解除锁定159 线程ID 的地址不正确160 至少有一个参数不正确161 指定的路径无效162 信号已暂停164 无法在系统中创建更多的线程167 无法锁定文件区域170 请求的资源在使用中173 对于提供取消区域进行锁定的请求已完成174 文件系统不支持锁定类型的最小单元更改180 系统检测出错误的段183 当文件已存在时,无法创建该文186 传递的标志不正187 找不到指定的系统信号灯名196 操作系统无法运行此应用程197 操作系统当前的配置不能运行此应用程199 操作系统无法运行此应用程序200 代码段不可大于或等于64K203 操作系统找不到已输入的环境选项205 命令子树中的进程没有信号处理程序206 文件名或扩展名太长207 第2 环堆栈已被占用208 没有正确输入文件名通配符* 或?,或指定过多的文件名通配符209 正在发送的信号不正确210 无法设置信号处理程212 段已锁定且无法重新分配214 连到该程序或动态链接模块的动态链接模块太多215 无法嵌套调用LoadModule230 管道状态无效231 所有的管道范例都在使用中232 管道正在被关闭233 管道的另一端上无任何进程234有更多数据可用240 已取消会话254 指定的扩展属性名无效255 扩展属性不一致258 等待的操作过时259 没有可用的数据了266 无法使用复制功能267 目录名无效275 扩展属性在缓冲区中不适用276 装在文件系统上的扩展属性文件已损坏277 扩展属性表格文件已满278 指定的扩展属性句柄无效282 装入的文件系统不支持扩展属性288 企图释放并非呼叫方所拥有的多用户终端运行程序298 发向信号灯的请求过多299 仅完成部分的ReadProcessMemoty 或WriteProcessMemory 请求300操作锁定请求被拒绝301 系统接收了一个无效的操作锁定确认302 此卷太碎,不能完成这个操作303 不能打开文件,因为它正在被删除487 试图访问无效的地址534算术结果超过32 位535 管道的另一端有一进程536 等候打开管道另一端的进程994 拒绝访问扩展属性995 由于线程退出或应用程序请求,已放弃I/O 操作996 重叠I/O 事件不在信号状态中997 重叠I/O 操作在进行中998 内存分配访问无效999 执行页内操作时的错误1001 递归太深;堆栈溢出1002 窗口无法在已发送的消息上操作1003 无法完成此功能1004 无效标志1005 此卷不包含可识别的文件系统。

语言程序设计基础01

语言程序设计基础01

PART 01 Visual Basic概述什么是程序设计语言?我们想用计算机解决一个问题,必须事先设计好计算机处理问题的步骤,然后把这些步骤按照计算机能够识别的指令编写出来。

并送给计算机执行,计算机才能按照我们的意图完成指定的工作。

我们把计算机能够执行的指令序列称为程序。

编写程序的过程称为程序设计。

显然我们人类是通过程序来告诉计算机该如何处理问题,那么如何与计算机进行交流?人类与计算机的交流存在鸿沟,计算机听不懂人类语言。

假如我们直接对着电脑说出汉语、英语、俄语等其他自然语言跟计算机交流,计算机听不懂。

计算机只能理解0和1的二进制的指令码,这个时候就需要一种填补语言(中间的媒介)来跨越人与计算机交流的鸿沟。

你好语言程序桥梁这种语言不仅我们人类能理解,,而且计算机也能明白,这种特殊的语言成为程序设计语言,实现人与计算机之间的交流。

程序设计语言与现代计算机共同诞生,共同发展,至今已有60多年的历史;形成规模庞大的家族,经历了机器语言、汇编语言和高级语言三个阶段。

计算机语言用二进制代码0和1来表示计算机可直接执行的指令,每条指令让计算机执行一个简单动作。

对人类来说机器语言比较晦涩难懂,但计算机却可以直接理解和执行,为了克服这个问题,在指令中使用助记符,这样形成了汇编语言。

汇编语言以约定的助记符来表示机器指令,每条汇编指令基本上与一条机器指令相对应,与机器语言比较,汇编语言比较直观,用汇编语言编写的程序经过简单的翻译,就可以被机器执行。

高级语言的语法规则简单清晰,是由英语单词和数学符号组成,最接近我们人类语言,比较容易掌握和理解。

但高级语言编写的程序,需要经过翻译软件翻译成机器指令后,才能被计算机执行。

现在比较流行的高级语言有:Visual Basic、C语言、Java语言。

Visual Basic是一种面向对象的可视化程序设计,它是在 Basic语言基础上发展起来的、功能强大的Windows应用程序的开发工具。

Windows下设备驱动程序的开发方法

Windows下设备驱动程序的开发方法

目录一、驱动开发环境的搭建 (1)1.1 关于DDK (1)1.2 关于驱动程序的编译 (1)1.3关于驱动程序的运行 (2)二、驱动程序的结构 (3)2.1 驱动程序的头文件 (3)2.2 驱动程序的入口点 (3)2.3 创建设备例程 (4)2.4 卸载驱动例程 (5)2.5 派遣例程 (6)三、编写驱动程序的基础知识 (6)3.1 内核模式下的字符串操作 (6)3.2 内核模式下各种开头函数的区别 (8)3.3 一个示例程序 (10)3.4 补充说明 (10)四、在驱动中使用链表 (10)4.1 内存的分配与释放 (10)4.2 使用LIST_ENTRY (12)4.3 使用自旋锁 (12)五、在驱动中读写文件 (15)5.1 使用OBJECT_ATTRIBUTES (15)5.2 创建、打开文件 (16)5.3 读写文件操作 (16)5.4 文件的其它相关操作 (18)六、在驱动中操作注册表 (18)6.1 创建、打开注册表 (19)6.2 读写注册表 (20)6.3 枚举注册表 (21)七、在驱动中获取系统时间 (21)7.1 获取启动毫秒数 (21)7.2 获取系统时间 (22)八、在驱动中创建内核线程 (23)8.1 创建内核线程 (23)8.2 关于线程同步 (24)九、初探IRP (25)9.1 IRP的概念 (25)9.2 IRP的处理 (26)9.3 IRP派遣例程示例 (27)十、驱动程序与应用层的通信 (29)10.1 使用WriteFile通信 (29)10.2 使用DeviceIoControl进行通信 (32)十二、驱动程序开发实例 (33)12.1 NT驱动程序 (33)12.2 WDM驱动程序 (35)十三、参考资料 (41)一、驱动开发环境的搭建1.1 关于DDK开发驱动程序必备的一个东西就是DDK(Device Development Kit,设备驱动开发包),它跟我们在ring3常听到的SDK差不多,只不过它们分别支持开发不同的程序而已。

windows1

windows1

应用程序的文档/视图结构

MFC 设计的Windows程序采用文档/视图结构

形成应用程序的主窗口需要类对象:

框架窗口类CFrameWnd对象 视图类CView对象 文档类CDocument对象
CWinApp中使用文档模板把上述三个对象组装 在一起,形成完整的程序实体。

应用程序的文档/视图结构
使用Vc++创建windows应用程序

实现自己的文档类与视图类

练习3: 响应鼠标消息
编写可在用户区中绘制一个矩形的应用程序,在按下鼠 标右键后,这个矩形会把它的右上角移动到鼠标位置 而当按下Shift键的同时,按下鼠标右键,则矩形恢复 原位置
处理鼠标消息
利用向导为MyAppView类增加WM_LBUTTONDOWN的消息处理
ห้องสมุดไป่ตู้
使用Vc++创建windows应用程序

将菜单射消息处理函数 将工具栏按钮映到命令

利用classWizard或classView编写消息处理函数 实现菜单与工具栏中的命令save, open



增加对话框 初始化,验证和提取对话框中的数据 创建新增的类
MFC简介

类库是可以在应用程序终使用的互相关联的C++类的集合

MFC是windows应用程序的框架
封装Windows API 函数 定义程序结构,实现标准用户接口 支持多线程, 自动消息处理功能 程序员填写自己应用程序的代码

利用MFC AppWizard构建应用程序框架
向导自动生成代码 利用可视化的资源编辑器设计用户图形界面 由类向导在界面元素与程序代码间建立联系

wincc 内部变量 同步

wincc 内部变量 同步

wincc 內部變量同步在工业自动化领域,WinCC(Windows Control Center)是一款广泛应用于监控和控制系统的软件。

它具有强大的数据采集、处理和显示功能,可以实现人机交互的目的。

在实际应用中,WinCC内部变量同步是一个关键环节,它保证了监控数据的一致性和实时性。

本文将详细介绍WinCC内部变量同步的原理、方法和优化策略。

一、WinCC内部变量同步原理WinCC内部变量同步主要依赖于两个方面:一是数据采集模块,负责从各种传感器、执行器等设备中获取实时数据;二是数据处理和显示模块,负责对采集到的数据进行处理和展示。

在这个过程中,同步机制起到了关键作用,确保了数据在各个模块之间的传递和处理能够顺利进行。

1.数据采集同步:WinCC 通过与各种设备通信,如Modbus、Profibus、以太网等,实现数据的实时采集。

在数据采集过程中,WinCC 会将采集到的数据存储在内部变量中,并以一定的时间间隔进行更新,确保数据的实时性。

2.数据处理和显示同步:WinCC内部拥有丰富的图形库和控件,可以方便地实现数据的可视化。

在数据处理和显示过程中,WinCC 会根据内部变量的值来更新图形界面,以实时反映设备运行状态。

二、WinCC内部变量同步方法1.事件驱动同步:WinCC支持事件驱动的同步方式,当某个设备或变量发生变化时,会自动触发同步操作。

这种方式具有响应速度快、实时性好的特点,适用于对实时性要求较高的场景。

2.定时器驱动同步:WinCC提供了定时器功能,可以设置定时器周期性地触发同步操作。

这种方式适用于对实时性要求不高的场景,可以降低系统资源消耗。

3.手动同步:用户可以通过WinCC提供的同步功能,手动触发同步操作。

这种方式适用于特定场景下的人工干预,如设备调试和故障处理等。

三、WinCC内部变量同步优化策略1.优化数据采集:针对不同类型的设备和通信协议,选择合适的采集方式和参数,提高数据采集的实时性和准确性。

深入分析Windows消息机制

深入分析Windows消息机制

维护 大 多 数 可视 对 象 的 句 柄( 口、 话 框 、 钮 、 辑 框 窗 对 按 编
等) 。句 柄 决 定 消 息 被 发 送 到 哪 个 窗 口 。
() 1 标准 消息 : 了 WM OMMAND, 除 C 所有 的 以 WM 开
头 的消 息都是标 准消 息 。如 窗 口、 鼠标 移动 、 口大 小改变 窗
() 2 命令 消息 : 自于 菜单 、 来 加速键 、 具栏按钮 的消 息, 工 这类 消息都 以 WM O C MMA ND形 式呈现 。 (1 3 通知 消息 : 由控件 产生 的消 息 。 按键和 鼠标 的单击 列 表框 都会产 生这 类消 息[ 这 类消 息 的 目的是 为 了向父 窗 口 4 ] , ( 常 是 对 话 框 ) 通 知 事 件 的 发 生 , 它 也 是 以 WM 通 C MMA O ND形 式呈现 的。 () 4 用户 白定义 的消息 。 2 2 消息结构 . 在 Wid ws n o 程序 中 ,消息本 身是作 为一个 记 录传递 给 应用 程序 的 , 个记 录 中包含 了消 息 的类 型 以及其 它信 息 , 这 由 MS G结 构体表示 。MS G结构体 的定义如 下 :
事件驱 动意 味着 操作系 统 的每一 部分 之 间 以及 操作 系统 与
在 MS G结构 中, 息是 由一个 消息 名称( N 1 两个 消 uI T 和 参数( AR M, P R WP A L A AM) 组成 。当用户进 行 了输入 或者窗 口的状态 发生改 变时 , 系统都会 发送消息 到某一个 窗 口。例 如, 当菜单 点中之后会 有 WM O C MMA D消息发送 。 中, N 其 WP A 的高字 节( WO D( aa ) AR M HI R wP r m)是命令 的 I 号 , D 是 菜单 I D。同时 , 用户 能定义 自己的消息名称 , 也能利用 自定 义 消息来 发送通知和 传送数据 。

windows事件ID及解释大全(非常完整)

windows事件ID及解释大全(非常完整)

windows事件ID及解释⼤全(⾮常完整)/doc/50c31df1ba0d4a7302763a37.html /search.asp这个⽹站可以查询⽇志ID的含义,如下图:代码错误信息解释--------------------------------------------0 操作成功完成。

1 函数不正确。

2 系统找不到指定的⽂件。

3 系统找不到指定的路径。

4 系统⽆法打开⽂件。

5 拒绝访问。

6 句柄⽆效。

7 存储控制块被损坏。

8 存储空间不⾜,⽆法处理此命令。

9 存储控制块地址⽆效。

10 环境不正确。

11 试图加载格式不正确的程序。

12 访问码⽆效。

13 数据⽆效。

14 存储空间不⾜,⽆法完成此操作。

15 系统找不到指定的驱动器。

16 ⽆法删除⽬录。

17 系统⽆法将⽂件移到不同的驱动器。

18 没有更多⽂件。

19 介质受写⼊保护。

20 系统找不到指定的设备。

21 设备未就绪。

22 设备不识别此命令。

23 数据错误(循环冗余检查)。

24 程序发出命令,但命令长度不正确。

25 驱动器找不到磁盘上特定区域或磁道。

26 ⽆法访问指定的磁盘或软盘。

27 驱动器找不到请求的扇区。

28 打印机缺纸。

29 系统⽆法写⼊指定的设备。

30 系统⽆法从指定的设备上读取。

31 连到系统上的设备没有发挥作⽤。

32 另⼀个程序正在使⽤此⽂件,进程⽆法访问。

33 另⼀个程序已锁定⽂件的⼀部分,进程⽆法访问。

36 ⽤来共享的打开⽂件过多。

38 已到⽂件结尾。

39 磁盘已满。

50 不⽀持请求。

51 Windows ⽆法找到⽹络路径。

请确认⽹络路径正确并且⽬标计算机不忙或已关闭。

如果 Windows 仍然⽆法找到⽹络路径,请与⽹络管理员联系。

52 由于⽹络上有重名,没有连接。

请到“控制⾯板”中的“系统”更改计算机名,然后重试。

53 找不到⽹络路径。

54 ⽹络很忙。

55 指定的⽹络资源或设备不再可⽤。

56 已达到⽹络 BIOS 命令限制。

事件驱动MFC原理介绍

事件驱动MFC原理介绍

MFC程序基于消息,而使用事件驱动(Message Based,Event Driven)。

也就是说MFC就是一个死循环,里面有很多的条件,每个条件对应一个方法。

这些条件就是有消息类定义,当用户触发事件时,将发送消息到响应的窗口。

当程序收到消息时进行解析,判断如果符合条件,将运行当前事件的处理方法。

[cpp]1MSG msg;2while(GetMessage(&msg,NULL,NULL,NULL))3 {4 TranslateMessage(&msg);5 DispatchMessage(&msg);6 }每一个程序都存在上述的循环,而MSG是一个结构,是Windows内设的一种数据格式,可以在WinUser.h中找到,代码如下:[cpp]7/*8 * Message structure9 */10typedef struct tagMSG {11HWND hwnd;12UINT message;13WPARAM wParam;14LPARAM lParam;15DWORD time;16 POINT pt;17 #ifdef _MAC18DWORD lPrivate;19#endif20 } MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;接受并处理消息的主角是窗口,每一个窗口都必须要有能够处理消息的方法,称为“窗口函数”(Window Procedure/Function)。

当窗口获得消息后,必须判断消息的类别,将消息转换(TranslateMessage(&msg)转换键盘消息),然后将消息传递到(DispatchMessage(&msg))窗口函数去处理。

窗口函数是一个回调函数(用户定义的函数用于Windows操作系统调用的函数),它的形式如下所示。

[cpp]LRESULT CALLBACK WinProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) 其中wParam和lParam的意义因消息的不同而不同,但可以知道的是wParam的位数是随着操作系统的位数而定的,在32位的操作系统中为32位,当然64位的就为64位。

Windows事件ID及解释大全

Windows事件ID及解释大全

Windo‎w s 事件‎I D及解释‎大全(XP‎、2000‎、2003‎)(0-2‎000) ‎代码‎错误信息解‎释---‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-----‎-0 操‎作成功完成‎。

1 函‎数不正确。

‎2 系统‎找不到指定‎的文件。

‎3系统找‎不到指定的‎路径。

4‎系统无法‎打开文件。

‎5 拒绝‎访问。

6‎句柄无效‎。

7 存‎储控制块被‎损坏。

8‎存储空间‎不足,无法‎处理此命令‎。

9 存‎储控制块地‎址无效。

‎10 环境‎不正确。

‎11 试图‎加载格式不‎正确的程序‎。

12 ‎访问码无效‎。

13 ‎数据无效。

‎14 存‎储空间不足‎,无法完成‎此操作。

‎15 系统‎找不到指定‎的驱动器。

‎16 无‎法删除目录‎。

17 ‎系统无法将‎文件移到不‎同的驱动器‎。

18 ‎没有更多文‎件。

19‎介质受写‎入保护。

‎20 系统‎找不到指定‎的设备。

‎21 设备‎未就绪。

‎22 设备‎不识别此命‎令。

23‎数据错误‎(循环冗余‎检查)。

‎24 程序‎发出命令,‎但命令长度‎不正确。

‎25 驱动‎器找不到磁‎盘上特定区‎域或磁道。

‎26 无‎法访问指定‎的磁盘或软‎盘。

27‎驱动器找‎不到请求的‎扇区。

2‎8打印机‎缺纸。

2‎9系统无‎法写入指定‎的设备。

‎30 系统‎无法从指定‎的设备上读‎取。

31‎连到系统‎上的设备没‎有发挥作用‎。

32 ‎另一个程序‎正在使用此‎文件,进程‎无法访问。

‎33 另‎一个程序已‎锁定文件的‎一部分,进‎程无法访问‎。

36 ‎用来共享的‎打开文件过‎多。

38‎已到文件‎结尾。

3‎9磁盘已‎满。

50‎不支持请‎求。

51‎Wind‎o ws 无‎法找到网络‎路径。

请确‎认网络路径‎正确并且目‎标计算机不‎忙或已关闭‎。

如果 W‎i ndow‎s仍然无‎法找到网络‎路径,请与‎网络管理员‎联系。

5‎2由于网‎络上有重名‎,没有连接‎。

04讲 Windows运行机制及应用

04讲 Windows运行机制及应用
lpszMenuName style hCursor cbWndExtra 鼠标指针的句柄。改成员必 表示窗口实例之后分配的额 描述类风格。该成员可以是 指向 NULL结束的字符串,该 须为一个指针资源的句柄。如 外的字节数。系统将该值初始 “Class Styles”的任意组合。 字符串描述菜单的资源名,如 果 化为 hCursor 0.如果使用资源文件里的 为NULL,应用程序必 同在资源文件里显示的名字一 lpfnWndProc CLASS指令创建对话框,并用 须在指针移入应用程序窗口时 样。 WNDCLASS注册该对话框时, 显式设置指针类型。 指向窗口过程的指针。必须 lpszClassName cbWndExtra必须设置成 使用CallWindowProc函数调用窗 DLGWNDOWEXTRA。 hbrBackground 指向NULL结束的字符串,它 口过程。 背景画刷的句柄。该成员或 描述了窗口类名。这个类名可 cbClsExtra 以是由 RegisterClass或者 hInstance 者是用于绘制背景的物理画刷 RegisterClassEx 表示窗口类结构之后分配的 注册的名字,或 包含该类实例的句柄,该实 的句柄,或者是一个颜色值。 额外的字节数。系统将该值初 者是任何预定义的控件类名。 例包含了窗口过程。 颜色值必须为如下标准系统颜 始化为 0. 色值 (值 1必须加到选定颜色 中)。如果颜色值给定后,必须 hIcon 将该值转换成如下HBRUSH类 类图标的句柄。该成员必须 型。 为一个图标资源的句柄。如果 hIcon为NULL,系统将提供默认 图标。
苏曙光.软件学院.华中科技大学
9
9
z lresult sendmessage(hwnd hwnd,uint msg,wparam wparam,lparam lparam)

Windows窗口开发原理(窗口的创建消息机制)

Windows窗口开发原理(窗口的创建消息机制)

Windows窗⼝开发原理(窗⼝的创建消息机制)在windows应⽤程序中,窗⼝是其⾮常重要的⼀个元素。

并且窗⼝是通过窗⼝句柄来标识的。

句柄(HANDLE)是windows程序中⼀个重要的概念,其标识各种资源,包括图标句柄(HICON)、光标句柄(HCURSOR)和画刷句柄(HBRUSH)。

下⾯以⼀个带有⾃定义的画刷、光标和图标的windows窗⼝为例,讲解win32窗⼝的创建过程。

windows消息机制windows程序是基于事件驱动⽅式的程序设计模式,主要是基于消息的。

⽐如当⽤户在窗⼝中画图的时候,按下⿏标左键,此时os会感知到这⼀事件,于是将此事件包装成⼀个消息,投递到应⽤程序的消息队列中,然后应⽤程序从消息队列中取出消息,经过transltor翻译、分发消息,然后交由os调⽤窗⼝过程函数(应⽤程序注册的回调函数)或(DefWindowProc系统默认的回调处理函数)进⾏处理。

创建⼀个窗⼝的基本流程设计窗⼝类窗⼝的特征是由WNDCLASS结构体来定义的,其定义了这个窗⼝的基本属性,所以我们只需填充结构体各成员信息即可。

typedef struct tagWNDCLASSW {UINT style;WNDPROC lpfnWndProc;int cbClsExtra;int cbWndExtra;HINSTANCE hInstance;HICON hIcon;HCURSOR hCursor;HBRUSH hbrBackground;LPCWSTR lpszMenuName;LPCWSTR lpszClassName;} WNDCLASSWtypedef WNDCLASSW WNDCLASS;//WNDCLASS是WNDCLASSW的别名View Code这⾥要⾸先说明下各类型定义//LRESULT :long// UINT:unsigned int//WPARAM:unsigned int//LPARAM:unsigned int//LPCWSTR:const w_chart_t *;// typedef WORD ATOM; //BUGBUG - might want to remove this from minwin// typedef unsigned short WORD;// typedef unsigned long DWORD;//LPCWSTR const w_char_t * 宽字符//LPCSTR const char *wchar_t szAppclassName[] = _T("FirstWin32");WNDCLASS wc;wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;//窗⼝类的样式(要让窗⼝在⽔平和垂直尺⼨发⽣变化时发⽣重绘,我们可以使⽤⽤位或|操作符将其组合起来) //WNDPROC 函数指针类型wc.lpfnWndProc = WindowProc;//窗⼝回调函数/窗⼝处理函数wc.cbClsExtra = 0;//窗⼝类的附加内存⼤⼩wc.cbWndExtra = 0;//窗⼝附加内存⼤⼩wc.hInstance = hInstance;//当前应⽤程序实例句柄wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));//加载⾃定义的图标句柄//wc.hCursor = LoadCursor(NULL,IDC_CROSS);//光标句柄;加载系统光标,也可以采⽤下⾯的⽅式加载⾃定义的光标wc.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR1));wc.hbrBackground = CreateSolidBrush(RGB(255, 255, 0));//红绿蓝三原⾊0~255,[0最暗,255最亮]wc.lpszMenuName = NULL;//菜单名wc.lpszClassName = szAppclassName;//窗⼝类型名 spy++(vs->⼯具选项)其中的第⼆个成员变量lpfnWndProc是⼀个函数指针,指向窗⼝过程函数,窗⼝过程函数时⼀个回调函数。

Windows应用程序的基本结构

Windows应用程序的基本结构
Windows应用程序框架结构
哈尔滨工程大学
概述
理解Window编程所使用的事件驱动模型 Window编程的基本框架
Windows平台下可视化开发工具
可视化开发系统集成了一系列系统可用资源和开发工具 1、程序调试工具包括源程序语法检查、可执行程序修改 和运行监视等 2、源程序编辑器和编译器 3、资源管理器,包括图形化窗口及组成元素的多种对象 的编辑器 4、系统函数库和系统函数开发工具 5、可选择并构成具体语句或源程序结构的例程库及Help
DOS程序主要使用顺序的,过程驱动的程序设计方法。顺序的, 过程驱动的程序有一个明显的开始,明显的过程及一个明显的结 束,因此程序能直接控制程序事件或过程的顺序。
而Windows的驱动方式是事件驱动,就是不由事件的顺序来控制, 而是由事件的发生来控制,所有的事件是无序的,作为一个 windows程序员,在你编写程序时,你并不知道用户先按哪个按 纽,也不知道程序先触发哪个消息。你的任务就是对正在开发的 应用程序要发出或要接收的消息进行排序和管理。
过程驱动方法和事件驱动方法
启动 输入姓名 输入第一次测试成绩 输入第二次测试成绩 输入第三次测试成绩 计算平均成绩
结束
启动 消息处理
结束
输入姓名 输入第一次成绩 输入第二次成绩 输入第三次成绩
计算平均成绩
Dos编程和Windows编程不同
dos下的C编程的main()一样,windows下的入口 是WinMain()函数。
句柄是什么?
在Win32里,句柄是指向一个无值型对象(void *)的指针, 是一个4字节长的数据”。句柄并不是一个真正意义上的指针。 从结构上看,句柄的确是一个指针,尽管它没有指向用于存储 某个对象的内存位置,而实际上句柄指向的是一个包含了对该 对象进行的引用的位置。我们天气热摇扇子的时候只要抓住扇 柄便可以控制整个扇子的运动了,在程序中也差不多是这个意 思。通常一个句柄就可以传递我们所要做的事情。有经验的开 发者肯定清楚,编写程序总是要和各种句柄打交道的,句柄是 系统用来标识不同对象类型的工具,如窗口、菜单等,这些东 西在系统中被视为不同类型的对象,用不同的句柄将他们区分 开来。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Windows的事件驱动机制在Windosw系统中,程序的设计围绕事件驱动来进行。

当对象有相关的事件发生时(如按下鼠标键),对象产生一条特定的标识事件发生的消息,消息被送入消息队列,或不进入队列而直接发送给处理对象,主程序负责组织消息队列,将消息发送给相应的处理程序,使相应的处理程序执行相应的动作,做完相应的处理后将控制权交还给主程序。

在这种机制中,对象的请求仅仅是向队列中添加相应的消息,耗时的处理则被分离给处理函数。

这种结构的程序中各功能模块界限分明,便于扩充,能充分利用CPU 的处理能力,使系统对外界响应准确而及时。

Windows事件驱动机制我们当中不少使用VC、Delphi等作为开发语言的程序员是一步步从DOS 下的Basic、C++中走过来的,而且大多在刚开始学习编程时也是先从DOS下的编程环境入手的,因此在习惯了DOS下的过程驱动形式的顺序程序设计方法后,往往在向Windows下的开发环境转型的过程中会对Windows所采取的事件驱动方式感到无法适应。

因为DOS和Windows这两种操作系统的运行机制是截然不同的,DOS下的任何程序都是使用顺序的、过程驱动的程序设计方法。

这种程序都有一个明显的开始、明显的过程以及一个明显的结束,因此通过程序就能直接控制程序事件或过程的全部顺序。

即使是在处理异常时,处理过程也仍然是顺序的、过程驱动的结构。

而Windows的驱动方式则是事件驱动的,即程序的流程不是由事件的顺序来控制,而是由事件的发生来控制,所有的事件是无序的,所为一个程序员,在编写程序时,并不知道用户会先按下哪个按纽,也就不知道程序先触发哪个消息。

因此我们的主要任务就是对正在开发的应用程序要发出的或要接收的消息进行排序和管理。

事件驱动程序设计是密切围绕消息的产生与处理而展开的,一条消息是关于发生的事件的消息。

Windows的消息循环Windows操作系统为每一个正在运行的应用程序保持有一个消息队列。

当有事件发生后,Windows并不是将这个激发事件直接送给应用程序,而是先将其翻译成一个Windows消息,然后再把这个消息加入到这个应用程序的消息队列中去。

应用程序需要通过消息循环来接收这些消息。

在MFC中使用了对WinAPI进行了很好封装的类库,虽然可以为编程提供一个面向对象的界面,使Windows程序员能够以面象对象的方式进行编程,把那些进行SDK编程时最繁琐的部分提供给程序员,使之专注于功能的实现,但是由于引入了很好的封装特性,使我们不能直接操纵部分核心代码。

对于消息的循环和接收也只是通过类似于下面的消息映射予以很简单的表示:BEGIN_MESSAGE_MAP(CTEMMSView, CFormView)//{{AFX_MSG_MAP(CTEMMSView)ON_WM_LBUTTONDOWN()ON_COMMAND(ID_OPENDATA, OnOpenData)ON_WM_TIMER()ON_WM_PAINT()//}}AFX_MSG_MAPEND_MESSAGE_MAP()虽然上述消息映射在编程过程中处理消息非常简练方便,但显然是难于理解消息是如何参与循环和分发的。

因此有必要通过SDK(Software Developers Kit,软件开发工具箱)代码深入到被MFC封装的Windows编程的核心中来研究其具体是如何工作的。

在SDK编程中,一般是在Windows应用程序的入口点WinMain函数中添加处理消息循环的代码以检索Windows送来的消息,然后WinMain再把这些消息分配给相应的窗口函数并处理它们:……MSG msg; //定义消息名while (GetMessage (&msg, NULL, 0, 0)){TranslateMessage (&msg) ; //翻译消息DispatchMessage (&msg) ; //分发消息}return msg.wParam ;上述几句虽然简单但却是所有Windows程序的关键代码,担负着获取、解释和分发消息的任务,下面就重点对其功能和作用进行分析:MSG结构在头文件中定义如下:typedef struct tagMSG{HWND hwnd; //消息将要发送到的那个窗口的句柄,用这个参数可以决定让哪个窗口接收消息。

UINT message; //消息号,它唯一标识了一种消息类型。

每种消息类型都在Windows文件进行了预定义。

WPARAM wParam; //一个32位的消息参数,这个值的确切意义取决于消息本身。

LPARAM lParam; //同上。

DWORD time; //消息放入消息队列中的时间,在这个域中写入的并非当时日期,而是从Windows启动后所测量的时间值。

Windows用这个域来使用消息保持正确的顺序。

POINT pt; //消息放入消息队列时的鼠标坐标。

} MSG, *PMSG;GetMessage消息循环以GetMessage调用开始,它从消息队列中取出一个消息。

该函数的四个参数可以有控制地获取消息,第一个参数指定要接收消息的MSG结构的地址,第二个参数表示窗口句柄,一般将其设置为空,表示要获取该应用程序创建的所有窗口的消息;第三、四参数用于指定消息范围。

后面三个参数被设置为默认值,用于接收发送到属于这个应用程序的任何一个窗口的所有消息。

在接收到除WM_QUIT之外的任何一个消息后,GetMessage()返回TRUE;如果GetMessage收到一个WM_QUIT消息,则返回FALSE以退出消息循环,终止程序运行。

因此,在接收到WM_QUIT之前,带有GetMessage()的消息循环可以一直循环下去。

当除WM_QUIT的消息用GetMessage读入后,首先要经过函数TranslateMessage()对其进行解释,但对大多数消息来说并不起什么作用。

这里起关键作用的是DispatchMessage()函数,把由GetMessage 获取的Windows消息传送给在MSG结构中为窗口所指定的窗口过程。

在消息处理函数处理完消息之后,代码又循环到开始去接收另一个消息,这样就完成了一个完整的消息循环。

由于Windows操作系统是一种非剥夺式多任务操作系统。

只有在应用程序主动交出CPU控制权后,Windows才能把控制权交给其他应用程序。

在消息循环中,一定要有能交出控制的系统函数才能实现协同式多任务操作。

能完成该功能的只有GetMessage、PeekMessage和WaitMessage这三个函数,如果在应用程序中长期不去调用这三个函数之一其他任务则无法执行。

GetMessage函数在找不到等待应用程序处理的消息时,会自动交出控制权,由Windows把CPU的控制权交给其他等待获取控制权的应用程序。

由于任何Windows应用程序都含有一个消息循环,这种隐式交出控制权的方式可以保证合并各个应用程序共享控制权。

一旦发往该应用程序的消息到达应用程序队列,即开始执行GetMessage语句的下一条语句。

DispatchMessage窗口过程处理消息通常以switch语句开始,对于它要处理的每一条消息ID 都跟有一条case语句,这在功能上同MFC的消息映射有些类似: switch(uMsgId){case WM_TIMER://对WM_TIMER定时器消息的处理过程return 0;case WM_LBUTTONDOWN://对WM_ LBUTTONDOWN鼠标左键单击消息的处理过程return 0;……default://其他消息由这个默认处理函数来处理return DefWindowProc(hwnd,uMsgId,wParam,lParam);}在处理完消息后必须返回0,这很重要,否则Windows将要不停地重试下去。

对于那些在程序中不准备处理的消息,窗口过程会把它们都扔给DefWindowProc进行缺省处理,而且还要返回那个函数的返回值。

在消息传递层次中,可以认为DefWindowProc函数是最顶层的函数。

该函数发出WM_SYSCOMMAND消息,由系统执行Windows环境中多数窗口所公用的各种通用操作,如更新窗口的正文标题等等。

在MFC下可以用下述部分代码实现与上述SDK代码相同的功能:BEGIN_MESSAGE_MAP(CTEMMSView, CFormView)//{{AFX_MSG_MAP(CTEMMSView)ON_WM_LBUTTONDOWN()ON_WM_TIMER()//}}AFX_MSG_MAPEND_MESSAGE_MAP()消息映射表雏形Windows程序是基于消息来驱动的,程序中利用一个while循环来等待消息,然后做判断,再做适当的处理。

每一个Windows程序都有一个循环如下:MSG msg;while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}消息映射表是消息类型与对应处理函数的一一对映关系。

MSGMAP_ENTRY 结构:struct MSGMAP_ENTRY {UINT nMessage; //消息类型LONG (*pfn)(HWND, UINT, WPARAM, LPARAM); //该消息处理函数指针};这是C语言对数据和处理数据的方法封装起来的一种具体实现方式(面向对象思想)。

消息与消息处理函数对应关系_messageEntries[]:struct MSGMAP_ENTRY _messageEntries[] ={WM_CREATE, OnCreate,WM_PAINT, OnPaint,WM_SIZE, OnSize,WM_COMMAND, OnCommand,WM_SETFOCUS, OnSetFocus,WM_CLOSE, OnClose,WM_DESTROY, OnDestroy,} ;命令消息类型对应表_commandEntries[]:struct MSGMAP_ENTRY _commandEntries ={IDM_ABOUT, OnAbout,IDM_FILEOPEN, OnFileOpen,IDM_SAVEAS, OnSaveAs,}于是程序的消息分类处理函数可以这样设计,代替switch:for(for i=0; i < dim(_messageEntries); i++) { // 訊息對照表if (message == _messageEntries[i].nMessage)return((*_messageEntries[i].pfn)(hWnd, message, wParam, lParam));其中#define dim(x) (sizeof(x) / sizeof(x[0])),用来获得结构数组长度。

相关文档
最新文档