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

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.mzph.cn/bicheng/29854.shtml

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

相关文章

element-plus的form表单组件之checkbox组件

单个checkbox 绑定的响应式的值类型为bool类型,同一个组的checkbox多选其值对应值的数组,类型根据checkbox的value值而来。 label只用来显示具体的值,根据value属性来设置。 element-plus的checkbox提供多种特性。 如单选,多选…

关机充电动画:流程与定制

关机充电动画:流程与定制 基于MTK平台Android 11分析 生成logo.bin 关机充电动画是由一系列的bmp图片组成的,这些图片资源存在于vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo目录下(当然不仅保护关机充电动画&#xff0c…

【软件工程】【22.10】p2

关键字: 软件开发基本途径、初始需求发现技术、UML表达事物之间关系、RUP需求获取基本步骤、项目过程建立涉及工作、项目规划过程域的意图和专用目标 判定表、分支覆盖、条件覆盖 三、简答 四、应用 这里条件覆盖有待商榷

SpringBoot配置第三方专业缓存技术jetcache方法缓存方案

jetcache方法缓存 我们可以给每个方法配置缓存方案 JetCache 是一个基于 Java 的缓存库,支持多种缓存方案和缓存策略,主要用于提升应用程序的性能和响应速度。它提供了多种缓存模式和特性,可以根据需求选择合适的缓存方案。 JetCache 的主…

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

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

Scikit-Learn支持向量机回归

Scikit-Learn支持向量机回归 1、支持向量机回归1.1、最大间隔与SVM的分类1.2、软间隔最大化1.3、支持向量机回归1.4、支持向量机回归的优缺点2、Scikit-Learn支持向量机回归2.1、Scikit-Learn支持向量机回归API2.2、支持向量机回归初体验2.3、支持向量机回归实践(加州房价预测…

TikTok账号养号的流程分享

对于很多刚开始运营TikTok的新手小白来说,都会有一个同样的疑问,那就是:TikTok到底需不需要养号?这里明确告诉大家是需要养号的,今天就把我自己实操过的养号经验和策略总结出来,分享给大家。 一、什么是Ti…

国产24位I2S输入+192kHz立体声DAC音频数模转换器CJC4344

CJC4344是一款立体声数模转换芯片,内含插值滤波器、multi bit数模转换器、输出模拟滤波器。CJC4344系列支持大部分的音频数据格式。CJC4344基于一个带线性模拟低通滤波器的四阶multi-bitΔ-Σ调制器,而且本芯片可以通过检测信号频率和主时钟频率&#xf…

【面试八股总结】Redis数据结构及底层实现

一、五种基本数据结构 Redis 提供了丰富的数据类型,常见的有五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合&#xff0…

C语言中的内存动态管理

1.为什么有动态内存管理 int a20;//开辟4个字节 int arr[10]{0};//开辟40个字节 上述的代码有两个特点 1.开辟空间的大小是固定的。 2.数组在申明的时候已经固定了大小,无法更改。 这样写代码不够灵活,所以c语言中引入了动态内存管理,让程序…

Springboot整合Kafka消息队列服务实例

一、Kafka相关概念 1、关于Kafka的描述 Kafka是由Apache开源,具有分布式、分区的、多副本的、多订阅者,基于Zookeeper协调的分布式处理平台,由Scala和Java语言编写。通常用来搜集用户在应用服务中产生的动作日志数据,并高速的处…

Milvus 2.4 向量库安装部署

1、linux 已有docker环境 2、安装fio命令 yum install -y fio 2、mkdir test-data fio --rwwrite --ioenginesync --fdatasync1 --directorytest-data --size2200m --bs2300 --namemytest ctrlc 3、lscpu 4、docker -v 6、安装docker compose组件 yum -y install python3-…

Maven下载安装、环境配置(超详细)(包括Windows、IDEA)

目录 一、引言 二、下载和安装 Maven (1)首先保证 Java 的环境是正常的。 1、电脑桌面上右击 " 此电脑 ",点击属性。 2、点击高级系统设置。 3、点击环境变量。 4、找到系统变量中的 Path。 5、点击新建,然后把…

深度剖析ElasticSearch分页原理与深分页问题|ES深分页问题|ES分页原理剖析

文章目录 ES分页|Paginate search resultsES深分页的问题一页获取数据量太大,报错分页深度太大,报错官方解释 其他解决方案Search after解决两个问题 有没有深分页查询的必要性?search after & PIT的使用方式1.创建pit2.首次查询3.之后的…

【C++】#20,#21

#20类和对象 #include <iostream>using namespace std;class Box{public: //公有 double length; //ctrle复制本行 double width;double height;void getVolume(){ //方法带&#xff08;&#xff09; cout<<"盒子体积为&#xff1a;"<<le…

我在高职教STM32——LCD液晶显示(1)

大家好&#xff0c;我是老耿&#xff0c;高职青椒一枚&#xff0c;一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次&#xff0c;同行应该都懂的&#xff0c;老师在课堂上教学几乎是没什么成就感的。正因如此&#xff0c;才有了借助 CSDN 平台寻求认同感和成就…

十、数据结构(图的基础)

文章目录 什么是图图的分类图算法的复杂度 图的模拟怎么储存一个图邻接矩阵&#xff1a;邻接矩阵的定义方式优劣分析 邻接表优劣分析实现代码 链式前向星实现代码优劣分析 图的遍历某个点的连通性拓扑排序1.拓扑排序的概念2.图的入度和出度3.基于 B F S BFS BFS的拓扑排序复杂度…

uniapp公用返回组件

uniapp写一个公用的头部组件&#xff0c;包含home和返回。 页面中的引用 2.在components文件夹下&#xff0c;新建一个navBar.vue <template><view class"view-wrap"><view :style"{ height: barHeight }"></view><view cla…

web前端之vue一键部署的shell脚本和它的点.bat文件、海螺AI、ChatGPT

MENU 前言vite.config.ts的配置deploy文件夹的其他内容remote.shpwd.txtdeploy.bat 前言 1、在src同级新建deploy.bat文件&#xff1b; 2、在src同级新建deploy文件夹&#xff0c;文件夹中新建pwd.txt和remote.sh文件&#xff1b; 3、配置好后&#xff0c;直接双击deploy.bat文…

Flat Ads:轻松玩转Kwai广告,开启全球营销新篇章

在当今数字化时代,短视频平台已成为人们生活中不可或缺的一部分。其中,快手旗下的一款海外短视频应用——Kwai 在海外新兴的拉美、中东、东南亚等多个市场迅速崛起并赢得了广大用户的喜爱。 作为全球头部短视频平台,Kwai 已遍布世界30多个国家,月活超过10亿,APP下载量位居拉美、…