windows消息循环之手撸一个Win32窗口程序

Windows消息循环(Windows Message Loop)

在Windows操作系统中,一个程序通过不断地接收和处理消息来保持活动状态的一种机制。在Windows编程中,消息循环是处理用户输入、操作系统事件和其他消息的关键部分。

在Windows应用程序中,用户与程序交互时,比如点击鼠标、按键盘键等,操作系统会生成相应的消息,并将这些消息发送给程序。程序通过消息循环来接收并处理这些消息,然后做出相应的响应。消息循环通常位于程序的主线程中,不断地等待并处理消息,从而实现用户界面的交互和响应。

步骤与主要函数

消息获取(GetMessage): 程序调用GetMessage函数从消息队列中获取消息。如果消息队列中没有消息,程序会等待直到有消息到来。

消息分发(DispatchMessage): 获取到消息后,程序通常会将消息传递给DispatchMessage函数,该函数负责将消息分发给相应的窗口过程(Window Procedure)。

窗口过程处理消息(Window Procedure): 窗口过程是一个回调函数,它定义了窗口如何处理不同类型的消息。当消息循环传递消息给窗口过程时,窗口过程会根据消息类型执行相应的操作,比如更新界面、响应用户输入等。

消息循环继续: 处理完消息后,程序会回到消息循环的开始,等待下一条消息的到来。

在这里插入图片描述

代码案例

#include <windows.h>
#include <stdio.h>
LPCTSTR clsName = "My";
LPCTSTR msgName = "欢迎学习";LRESULT CALLBACK MyWinProc(HWND unnamedParam1,UINT unnamedParam2,WPARAM unnamedParam3,LPARAM unnamedParam4
);// 1.设计一个窗口类
// 2.注册窗口类
// 3.创建窗口类
// 4.显示以及更新窗口
// 5.循环等待消息int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd
)
{// 定义和配置窗口对象WNDCLASS wndcls;wndcls.cbClsExtra = NULL;wndcls.cbWndExtra = NULL;wndcls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);wndcls.hCursor = LoadCursor(NULL, IDC_ARROW);wndcls.hIcon = LoadIcon(NULL, IDI_APPLICATION);wndcls.hInstance = hInstance;// 交互响应wndcls.lpfnWndProc = MyWinProc;// 定义窗口代号wndcls.lpszClassName = clsName;wndcls.lpszMenuName = NULL;wndcls.style = CS_HREDRAW | CS_VREDRAW;// 注册窗口类RegisterClass(&wndcls);// 创建窗口HWND hwnd;hwnd = CreateWindow(clsName, msgName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL, NULL, hInstance, NULL);//显示和刷新窗口ShowWindow(hwnd, SW_SHOWNORMAL);UpdateWindow(hwnd);MSG msg;while (GetMessage(&msg,NULL, NULL, NULL)) {TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;
}LRESULT CALLBACK MyWinProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam
) {HDC hdc;int ret;switch (uMsg){case WM_CHAR:char szChar[20];sprintf_s(szChar, "按下:%c", wParam);MessageBox(hwnd, szChar, "char", NULL);break;case WM_LBUTTONDOWN:MessageBox(hwnd, "左键", "left", NULL);break;case WM_RBUTTONDOWN:break;case WM_PAINT:PAINTSTRUCT ps;hdc = BeginPaint(hwnd, &ps);TextOut(hdc, 0, 0, "www.baidu,com", strlen("www.baidu.com"));EndPaint(hwnd, &ps);MessageBox(hwnd, "重绘", "left", NULL);break;case WM_CLOSE:ret = MessageBox(hwnd, "是否结束", "left", MB_YESNO);if (ret == IDYES) {DestroyWindow(hwnd);}break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hwnd, uMsg, wParam, lParam);}return 0;
}

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

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

相关文章

再谈启动一个Activity大致时序图

太多了&#xff0c;笔者不想写&#xff0c; 读者可通过PlantUML插件查看如下PUML文件生成的时序图。 补充说明下&#xff0c;Android31版本。 startuml https://plantuml.com/sequence-diagram skinparam dpi 800 scale 15000 width scale 5000 heightautonumber Launcher La…

IT界含金量高的证书,除了软考证书,还有这15种

文章目录 计算机技术与软件专业技术资格考试全国计算机信息高新技术考试思科认证微软认证&#xff1a;华为认证IBM认证国家信息安全水平考试注册信息安全专业人员注册信息安全渗透测试工程师项目管理专业人士资格认证Red Hat认证CompTIA 认证CISSP认证Oracle认证Sun认证AWS认证…

MYSQL中group by分组查询的用法详解(where和having的区别)!

文章目录 前言一、数据准备二、使用实例1.如何显示每个部门的平均工资和最高工资2.显示每个部门的每种岗位的平均工资和最低工资3.显示平均工资低于2000的部门和它的平均工资4.having 和 where 的区别5.SQL查询中各个关键字的执行先后顺序 前言 在前面的文章中&#xff0c;我们…

什么是git,怎样下载安装?

简介&#xff1a; 应用场景&#xff1a; 应用场景&#xff1a;团队企业开发 作用&#xff1a; 安装&#xff1a; 1.网址&#xff1a;Git - Downloads 很卡很慢 2.可以选择镜像网站下载&#xff08;推荐&#xff09; CNPM Binaries Mirror

每日一题 力扣514自由之路

514. 自由之路 题目描述&#xff1a; 电子游戏“辐射4”中&#xff0c;任务 “通向自由” 要求玩家到达名为 “Freedom Trail Ring” 的金属表盘&#xff0c;并使用表盘拼写特定关键词才能开门。 给定一个字符串 ring &#xff0c;表示刻在外环上的编码&#xff1b;给定另一…

企业中不同大数据迁移的区别是什么?

在大数据时代&#xff0c;企业面临着海量数据的管理、分析和应用挑战。为了克服数据存储、传输和处理中的难题&#xff0c;如数据量巨大、网络环境多变、存储成本高昂以及安全风险上升等&#xff0c;企业必须对数据进行备份、同步、分发或归档。这一过程中&#xff0c;数据的复…

STM32CubeMX教程31 USB_DEVICE - HID外设_模拟键盘或鼠标

目录 1、准备材料 2、实验目标 3、模拟鼠标实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.0、工程基本配置 3.1.1、时钟树配置 3.1.2、外设参数配置 3.1.3、外设中断配置 3.2、生成代码 3.2.0、配置Project Manager页面 3.2.1、设初始化调用流程 3.2.2、外设中…

【C++】输入输出、缺省参数、函数重载

目录 C的输入和输出 缺省参数 概念 缺省参数的分类 全缺省参数 半缺省参数 函数重载 概念 C支持函数重载的原理--名字修饰 C的输入和输出 #include<iostream> // std是C标准库的命名空间名&#xff0c;C将标准库的定义实现都放到这个命名空间中 using namespace …

python基础之ORM操作Mysql数据库

首先简单介绍下SQLalchemy库和sqlacodegen库。 SQLalchemy 库是一个流行的 Python 数据库工具&#xff0c;用于与各种关系型数据库进行交互。它提供了一个统一的 API&#xff0c;使得开发人员可以使用相同的代码来操作不同的数据库&#xff0c;而无需关心数据库的具体细节。 …

【WinRAR技巧】WinRAR整理密码是什么意思?

之前给大家介绍过WinRAR自动加密的设置方法&#xff0c;今天再介绍一种RAR压缩包加密方法&#xff1a;整理密码。 什么是整理密码&#xff1a; 在加密rar文件的时候&#xff0c;点击下拉框选择密码&#xff0c;不用输入密码 设置方法&#xff1a; 前面的操作步骤和设置自动…

ubuntu22.04@laptop安装配置VNC服务端

ubuntu22.04laptop安装&配置VNC服务端 1. 源由2. 系统安装3. VNC安装3.1 系统更新3.2 lightdm安装3.3 x11vnc安装3.4 x11vnc配置3.5 x11vnc自启动3.6 x11vnc状态查询 4. 演示视频 1. 源由 最近系统搞TensorFlow, OpenCV, Python&#xff0c;折腾各种环境&#xff0c;把系统…

GitLab升级16.8.0失败

漏扫报警Gitlab高危漏洞&#xff0c;于是立即升级。 yum命令提示有16.8.0可以升级&#xff0c;输入y 1G的软件包下载完毕&#xff0c;检测正常&#xff0c;安装软件包... 之后报错退出。 根据错误提示了解到由于上一次gitlab-ctl reconfigure执行失败导致执行升级程序退出。…

自动化测试脚本编写(超详细)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 自动化测试脚本 什么是自动化测试&#xff1f; 自动化测试是验…

C++类和对象(中)

✨Blog&#xff1a;&#x1f970;不会敲代码的小张:)&#x1f970; &#x1f251;推荐专栏&#xff1a;C语言&#x1f92a;、Cpp&#x1f636;‍&#x1f32b;️、数据结构初阶&#x1f480; &#x1f4bd;座右铭&#xff1a;“記住&#xff0c;每一天都是一個新的開始&#x1…

如何在Win系统安装Jupyter Notbook并实现无公网ip远程访问本地笔记

文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下载安装2.2 Jupyter Notebook的配置2.3 Cpolar下载安装 3.Cpolar端口设置3.1 Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 在数据分析工作中&#xff0c;使用最多的无疑就是各种函数、图表、…

Mybatis-Plus基础

typora-copy-images-to: img Mybatis Plus 今日目标&#xff1a; 了解mybatisplus的特点能够掌握mybatisplus快速入门能够掌握mybatisplus常用注解能够掌握mybatisplus常用的增删改查能够掌握mybatisplus自动代码生成 1 MybatisPlus简介 1.1 MybatisPlus概述 ​ MyBatis-…

【前端web入门第二天】03 表单-下拉菜单 文本域 label标签 按钮 【附注册信息综合案例】

文章目录: 1. 下拉菜单 2. 文本域3.label标签 4.按钮- button 4.1 reset重置按钮结合form表单区域使用 5.无语义的布局标签 6.字符实体 注册信息综合案例 表单第二节 1. 下拉菜单 标签: select嵌套option,select是下拉菜单整体&#xff0c;option是下拉菜单的每一项。 代码…

MySQL运维实战(5.1) 字符和编码的基本概念

作者&#xff1a;俊达 字符和编码 字符 字符是符号&#xff0c;是人们用于交流的各类符号&#xff0c;如26个英文字母、汉字、标点符号、数学运算符、其他语言的字母和符号。 编码 编码是计算机中以二进制方式存储字符的方式。每个字符都有一个对应的编码值&#xff0c;计算机…

HarmonyOS --@state状态装饰器

在声明式UI中&#xff0c;是以状态驱动视图更新。 状态&#xff08;state&#xff09;&#xff1a;指驱动视图更新的数据&#xff08;被装饰器标记的变量&#xff09;。 试图&#xff08;view&#xff09;&#xff1a;基于UI描述渲染得到用户界面 State装饰器标记的变量必须初…

JavaScript DOM属性和方法之attribute属性对象

在HTML的DOM中&#xff0c;attribute对象表示HTML属性。HTML属性始终属于HTML元素&#xff0c;它在DOM节点中被称为属性节点。在DOM中&#xff0c;NamedNodeMap对象表示元素属性节点的无序集合&#xff0c;我们可以通过指定的索引访问指定的属性。通过element对象的attribute属…