Win32编程:第一个窗口程序(Part.1)

news2024/12/26 23:12:40

Win32系统编程是指在Windows操作系统上使用Win32 API进行软件开发的过程;Win32 API是Windows操作系统提供的应用程序接口,允许程序与操作系统进行交互,实现各种功能。

以下是Win32系统编程的基本概念和步骤:

环境准备
  • 开发工具:推荐使用Microsoft Visual Studio,它集成了丰富的开发工具和调试功能。(笔者使用的VS版本为2017)

  • 编程语言:通常使用C或C++,因为Win32 API主要是用C语言编写的。

基本步骤

接着我们使用VS创建一个Windows桌面程序项目并通过项目中的窗口代码模板进行一些核心概念的解释:

1.创建Windows桌面程序项目

选择Windows桌面应用程序,底下的项目名称、位置以及解决方案名称都可以按照自身喜好进行命名。

创建完成后我们可以看到项目中的相关文件有:

我们对源文件中的代码进行解释:

这个模板程序展示了一个典型的Windows桌面应用程序框架,包括窗口注册、创建、消息处理和简单的菜单操作。

宏定义、全局变量

#define MAX_LOADSTRING 100
​
HINSTANCE hInst;                                // 当前实例
WCHAR szTitle[MAX_LOADSTRING];                  // 标题栏文本
WCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名

#define MAX_LOADSTRING 100:定义了一个名为MAX_LOADSTRING的宏,值为100;这个宏通常用来定义缓冲区的大小。

HINSTANCE hInst:保存当前实例句柄,实例句柄在Windows应用程序中用于标识应用程序的实例。

WCHAR szTitle[MAX_LOADSTRING]:用于存储窗口标题的字符串缓冲区。

WCHAR szWindowClass[MAX_LOADSTRING]:用于存储窗口类名的字符串缓冲区。

前向声明

前向声明则是一种在代码中提前声明某个标识符(如函数或类),使得在定义之前就可以引用它;这在编译时有助于减少依赖和提高编译效率,其实就是声明,函数前向声明:包括窗口类注册、实例初始化、主窗口过程函数、关于对话框过程函数等。

ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
①注册窗口类

ATOM MyRegisterClass(HINSTANCE hInstance):声明了一个函数MyRegisterClass,它的参数是HINSTANCE类型,返回类型是ATOM;该函数通常用于注册窗口类。(ATOM类型之前没见过?直接在VS中选中该ATOM类型,按下F12跳转至类型定义处,其实他就是一个WORD类型,与之前在汇编中写到的字类型一样是16位,2字节)

注册窗口类是创建 Windows 应用程序的一个关键步骤,在 Windows 编程中,窗口类(Window Class)包含窗口的各种属性,如窗口过程(Window Procedure;在 Windows 编程中,窗口过程是一个回调函数,负责处理发送到窗口的所有消息,每个窗口类都必须指定一个窗口过程,以便操作系统能够正确处理窗口的事件和用户交互;例如:用户输入:鼠标点击、键盘输入等。)、背景颜色、光标等。通过注册窗口类,操作系统能够识别和创建该类的窗口实例。

②初始化实例并创建主窗口

BOOL InitInstance(HINSTANCE, int):声明了一个函数InitInstance,它的参数是HINSTANCE类型和一个整数,返回类型是BOOL;该函数用于初始化实例并创建主窗口。

③窗口的消息处理

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM):声明了一个回调函数WndProc,它的参数是HWNDUINTWPARAMLPARAM类型,返回类型是LRESULT,该函数是窗口的消息处理函数。

这边可以看到这个函数声明的结构有点怪,这个时候我们逐个部分来进行分析:

LRESULT:该函数返回一个长整型(Long Pointer)值,表示消息处理的结果。

CALLBACK:这是一个宏,定义了函数的调用约定。在 Windows 编程中,CALLBACK 通常等同于 汇编中的调用约定__stdcall,用于指定函数调用的堆栈清理方式;调用约定规定了函数如何接收参数和返回值、如何在堆栈中管理参数等,CALLBACK 是 WinAPI 中常用的调用约定,确保系统可以正确调用窗口过程。

接着后面的WndProc就是函数名称、(HWND, UINT, WPARAM, LPARAM)就是函数的参数列表;函数名称就没什么好说的了,我们来说一下参数列表中的类型:

HWND:这是一个句柄类型,表示窗口的句柄(Window Handle),每个窗口在系统中都有一个唯一的句柄,用于标识窗口,通过 hWnd,窗口过程可以知道消息是发送给哪个窗口的。
​
UINT:这是一个无符号整数类型,表示消息的类型。Windows 系统中定义了大量的消息(例如 WM_PAINT、WM_COMMAND、WM_DESTROY 等),用来通知窗口各种事件。(定义源代码:typedef unsigned int        UINT;)
​
WPARAM:这是一个消息特定的附加信息类型,通常是无符号整数或指针;WParam 的具体意义取决于消息的类型。例如,对于 WM_KEYDOWN 消息,wParam 包含被按下的键的虚拟键码。(定义源代码:typedef UINT_PTR            WPARAM;)
​
LPARAM:这是另一个消息特定的附加信息,通常是长指针或结构体;lParam 的具体意义同样取决于消息的类型。例如,对于 WM_MOUSEMOVE 消息,lParam 包含鼠标指针的 X 和 Y 坐标。(定义源代码:typedef LONG_PTR            LPARAM;)
④处理“关于”对话框

INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM):声明了一个回调函数About,它的参数是HWNDUINTWPARAMLPARAM类型,返回类型是INT_PTR。该函数用于处理“关于”对话框的消息。这个声明的结构与主窗口的消息处理函数相似,这边就不做赘述了。

下篇接着说这四个函数的具体实现。

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

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

相关文章

Unity URP 仿原神角色渲染过程记录

想学一下NPR渲染,话不多说,先搞一只芙再说,边做边学 一、资源整理 终于是把东西全都集齐了 1、纹理设置 首先要把将Diffuse和Lightmap的压缩改成"无"或"高质量"。 法线贴图的纹理类型改成"法线贴图"。 除颜…

Go语言RPC开发深度指南:net/rpc包的实战技巧和优化策略

Go语言RPC开发深度指南:net/rpc包的实战技巧和优化策略 概览理解net/rpc的核心概念RPC的基本原理net/rpc的工作模式关键特性 快速开始准备RPC服务和客户端的基础环境构建一个基础的RPC服务端构建一个基础的RPC客户端 开发一个实际的RPC服务设计服务接口实现服务客户…

pdf怎么压缩到2m以内或5m以内的方法

PDF作为一种广泛使用的文档格式,已经成为我们工作和生活中不可或缺的一部分。然而,有时候PDF文件内存会比较大,给我们的存储和传输带来了很大的不便。因此,学会压缩 PDF 文件是非常必要的。 打开"轻云处理pdf官网"&…

隐藏element的DateTimePicker组件自带的清空按钮

管理台页面使用到el-date-picker,type datetimerange 但是组件自带了清空按钮,实际上这个控件业务上代表开始时间和结束时间是一个必填选项,所有想要把清空按钮隐藏掉。 查看了文档https://element.eleme.io/#/zh-CN/component/datetime-p…

react 自定义鼠标右键点击事件

功能:鼠标右键点击节点时,出现“复制”功能,点击其他部位,隐藏“复制”;鼠标右键事件的文案,始终在鼠标点击位置的右下方;点击复制,提示复制成功 效果图: 代码&#xff1…

win11 之下载安装 allure

1. 下载 https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/2.25.0/allure-commandline-2.25.0.zip 2. 配置系统变量 path 下添加解压后的bin目录 3. 验证是否安装成功 输入 allure

git使用摘樱桃的方式,实现特定需求进行提交合并

文章目录 先checkOut到主要的分支(需求提交到这) 然后双击点别的需求分支,对提交内容选定 进行摘樱桃操作 然后双击回到主要分支,会发现那2个提交内容代码已经在主要分支的本地里,选中其 右键选择Squash Commits进行合并 标注自己的需求标题提交名更改后, 最后进行push推送到…

利用AI云防护实现高效负载均衡

在当今高度数字化的世界里,保证网站和应用的高可用性和响应速度对企业的业务连续性和用户体验至关重要。传统的负载均衡技术虽然能够分发流量,但在面对突发流量、DDoS攻击或资源动态调整时往往力不从心。本文将探讨如何借助AI云防护服务,不仅…

问题解决:局域网下多台电脑实现共享打印机

看了很多篇解决措施,都没有解决,自己鼓弄了好久,终于解决了,如下步骤所示,实测好用。 首先先保证本电脑已打开网络共享 其次关闭防火墙(有时会出现奇怪问题,最好关闭) 接着访问IP…

Chatgpt教我打游戏攻略

宝可梦朱 我在玩宝可梦朱的时候,我的同行队伍里有黏美儿,等级为65,遇到了下雨天但是没有进化,为什么呢? 黏美儿(Goomy)要进化为黏美龙(Goodra),需要满足以下…

【贪吃蛇】C语言教程

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…

音频处理软件adobe audition使用教程

教程1笔记 基本操作 点击文件-》新建-》多轨会话: 编辑-》首选项,设置自动保存时间: 导入素材,文件-》导入素材,或者直接拖动进来文件! 导出多轨混音: 更改为需要导出的格式wav,mp3等格式&am…

Netty中Reactor线程的运行逻辑

Netty中的Reactor线程主要干三件事情: 轮询注册在Reactor上的所有Channel感兴趣的IO就绪事件。 处理Channel上的IO就绪事件。 执行Netty中的异步任务。 正是这三个部分组成了Reactor的运行框架,那么我们现在来看下这个运行框架具体是怎么运转的~~ 这…

Windows 命令行界面常用命令

Windows 命令行界面常用命令 首先我们通过WIN R,输入cmd进入命令行界面。 1. dir - 列出当前目录下的文件和子目录 用法: dir2. cd - 切换目录 用法: cd 目录路径返回上一级目录: C:\Users\YourUsername\Documents> cd …

c语言中的字符函数

1.字符分类函数 c语言中有一系列函数是专门做字符分类的&#xff0c;也就是一个字符属于什么类型的字符。这些函数的使用需要包含一个头文件是ctype.h 可能你看这些感觉很懵&#xff0c;我以islower举例 #include<ctype.h> int main() {int retislower(A);printf("…

Android OTA 升级基础知识详解+源码分析

前言&#xff1a; 本文仅仅对OTA升级的几种方式的概念和运用进行总结&#xff0c;仅在使用层面对其解释。需要更详细的内容我推荐大神做的全网最详细的讲解&#xff1a; https://blog.csdn.net/guyongqiangx/article/details/129019303?spm1001.2014.3001.5502 三种升级方式…

编码器原理和功能介绍

目录 概述 1 编码综述 2 增量式旋转编码器 2.1 功能介绍 2.2 实现原理 3 绝对式编码器 3.1 实现原理 3.2 二进制编码器 3.3 格雷码编码器 4 旋转式编码器原理 5 编码器基本参数 5.1 分辨率 5.2 精度 5.3 最大响应频率 5.4 信号输出形式 6 自制简易编码器 概述 …

matlab入门基础笔记

1、绘制简单三角函数&#xff1a; 绘制正弦曲线和余弦曲线。x[0:0.5:360]*pi/180; plot(x,sin(x),x,cos(x)); &#xff08;1&#xff09;明确x轴与y轴变量&#xff1a; 要求为绘制三角函数&#xff1a; X轴&#xff1a;角度对应的弧度数组 Y轴&#xff1a;对应sin(x)的值 求…

【数据结构C++】表达式求值(多位数)课程设计

&#x1f4da;博客主页&#xff1a;Zhui_Yi_ &#x1f50d;&#xff1a;上期回顾&#xff1a;图 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f387;追当今朝天骄&#xff0c;忆顾往昔豪杰。 …

使用Ollama+OpenWebUI本地部署阿里通义千问Qwen2 AI大模型

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;AI大模型部署与应用专栏&#xff1a;点击&#xff01; &#x1f916;Ollama部署LLM专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月17日22点50分 &#x1f004;️文章质量&#xff…