C++在VS2022开发Windows窗口程序2:API式的Windows窗口程序设计模式

        函数API式的Windows GUI程序设计模式是一种基于Windows API函数的方式来设计和开发Windows图形用户界面(GUI)应用程序的模式。在这种模式下,开发者通过调用Windows API函数来创建窗口、处理消息、绘制图形等,而不依赖于特定的GUI库或框架。

基本思路就是利用WinMain函数来生成窗口,用WndProc函数来处理窗口收到的消息。

API函数式的Windows程序的开发流程
WinMain,Windows GUI 应用程序的入口点,负责初始化应用程序、创建主窗口、消息循环等
1.设计和注册窗口类
2.创建和显示窗口
3.更新窗口
4.消息循环
5.消息响应
WndProc函数,窗口过程函数,负责处理窗口接收到的消息,会处理窗口消息,比如绘制窗口内容、响应用户。

首先是WinMain函数。

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nCmdShow)
{//设计窗口WNDCLASS wc = { 0 };wc.lpszClassName = L"MyWindowsClass";//窗口类名wc.lpszMenuName = NULL;//窗口类菜单资源名称wc.hInstance = hInstance;wc.lpfnWndProc = WndProc;wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);wc.hIcon = NULL;wc.hCursor = LoadCursor(NULL, IDC_APPSTARTING);wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.style = CS_HREDRAW | CS_VREDRAW;//注册窗口RegisterClass(&wc);//创建窗口HWND hwnd = CreateWindow(L"MyWindowsClass",L"我的API程序Up设计窗口",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,500,500,NULL,NULL,hInstance,NULL);//显示窗口ShowWindow(hwnd, SW_SHOW);MoveWindow(hwnd, 600, 200, 500, 500, FALSE);//更新窗口UpdateWindow(hwnd);//消息循环MSG msg = { 0 };while (msg.message!=WM_QUIT){//查看应用程序消息队列,有消息的时候将队列中的消息发送出去if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)){TranslateMessage(&msg);DispatchMessageW(&msg);}}return 0;
}

WNDCLASS 是一个结构体,用于描述窗口类的特征和行为。在 Windows 编程中,创建窗口前需要先注册一个窗口类,WNDCLASS 结构体就是用来定义和描述这个窗口类的。

定义如下:

typedef struct tagWNDCLASS {UINT      style;WNDPROC   lpfnWndProc;int       cbClsExtra;int       cbWndExtra;HINSTANCE hInstance;HICON     hIcon;HCURSOR   hCursor;HBRUSH    hbrBackground;LPCTSTR   lpszMenuName;LPCTSTR   lpszClassName;
} WNDCLASS;

- `style`:窗口类的风格,可以指定一些特定的风格,比如 `CS_HREDRAW` 和 `CS_VREDRAW`,用于确定窗口大小改变时是否需要重绘等。

- `lpfnWndProc`:指向窗口过程函数的指针,用于处理窗口接收到的消息。

- `cbClsExtra`:指定额外的类字节数,通常用于自定义窗口类的扩展信息。

- `cbWndExtra`:指定额外的窗口字节数,通常用于自定义窗口的扩展信息。

- `hInstance`:当前实例的句柄,用于标识窗口类所属的实例。

- `hIcon`:窗口的图标句柄。

- `hCursor`:窗口的光标句柄。

- `hbrBackground`:窗口的背景画刷句柄,用于填充窗口背景。

- `lpszMenuName`:菜单资源的名称。

- `lpszClassName`:窗口类的名称。

然后是WndProc函数,由于我们暂时不需要处理什么特殊的窗口消息,因此WndProc函数里面只有一个窗口关闭消息处理功能,当窗口关闭时,自动结束窗口的程序进程。

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{switch (uMsg){//当收到窗口销毁消息时,将窗口程序进程释放掉case WM_DESTROY:PostQuitMessage(0);break;}return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

运行效果如下:

通过函数API式的模式进行WindowsGUI程序编程,可以使得我们的程序模块变得更加的清晰,功能更加的明确。

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

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

相关文章

mass storage:RAID Structure , Error Detection and Correction

RAID Structure RAID – redundant array of inexpensive disks multiple disk drives provides reliability via redundancyIncreases the mean time to failureMean time to repair – exposure time when another failure could cause data lossMean time to data loss bas…

【TB作品】stm32单片机,红外遥控器,温控风扇,模拟空调,PWM风扇

空调机 硬件:stm32、oled显示器、ds18b20温度传感器、风扇驱动和风扇、红外接收器、遥控器 软件功能: (1)显示室内温度 (2)显示当前模式:常态、除湿、通风 (3)显示当前风…

Ubuntu Apache2 搭建Gerrit 环境

一、前言 时隔多年,好久没有更新CSDN 博客了,主要原因有如下两点: 1、平时工作繁忙,无暇更新。 2、工作内容涉及信息安全,一些工作经验积累不便更新到互联网上。 最近一直在折腾搭建Gerrit 环境,最开始…

win11安装VMware虚拟机,启动系统后蓝屏,安装虚拟机卡在虚拟网卡界面的解决办法

机缘和遇到的问题 由于最近618换了台新笔记本电脑,然后系统自带的操作系统是windows 11 家庭版本,由于工作需要用到window10的环境,不得不安装一个虚拟机来解决问题,然后就把这次安装VMware虚拟机遇到的坑给大家分享一下&#xf…

研二自学嵌入式开发,就业导向,学习路线该如何规划?

研二才来问这个问题,有点晚,离你开始找工作还有大概8~9个月,你应该用应试思维来应对找工作这个事,尤其当前这个经济形势下。 刚好我有一些资料,是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入…

基于Openmv的追小球的云台

介绍 在这篇文章,我会先介绍需要用到且需要注意的函数,之后再给出整体代码 在追小球的云台中,比较重要的部分就是云台(实质上就是舵机)的控制以及对识别的色块位置进行处理得到相应信息后控制云台进行运动 1、舵机模…

asp.net core反向代理

新建项目 新建空白的asp.net core web项目 安装Yarp.ReverseProxy包版本为2.2.0-preview.1.24266.1 编写代码 namespace YarpStu01;public class Program {public static void Main(string[] args){var builder WebApplication.CreateBuilder(args);builder.Services.AddRev…

JavaWeb——MySQL:DQL

3. DQL:查询 查询是使用最多、最频繁的操作,因为前面的修改以及删除,一般会交给数据库专业的人员,对于非数据库专业人员来说,老板一般会放心的让你对数据库只进行查询操作; 3.2 条件查询(where&#xff09…

浏览器自带的IndexDB的简单使用示例--小型学生管理系统

浏览器自带的IndexDB的简单使用示例--小型学生管理系统 文章说明代码效果展示 文章说明 本文主要为了简单学习IndexDB数据库的使用&#xff0c;写了一个简单的增删改查功能 代码 App.vue&#xff08;界面的源码&#xff09; <template><div style"padding: 30px&…

2024年通信技术与计算机科学国际学术会议(ICCTCS 2024)

2024年通信技术与计算机科学国际学术会议&#xff08;ICCTCS 2024&#xff09; 2024 International Academic Conference on Communication Technology and Computer Science&#xff08;ICCTCS 2024&#xff09; 会议简介&#xff1a; 2024年通信技术与计算机科学国际学术会议…

Leetcode.1735 生成乘积数组的方案数

题目链接 Leetcode.1735 生成乘积数组的方案数 rating : 2500 题目描述 给你一个二维整数数组 q u e r i e s queries queries &#xff0c;其中 q u e r i e s [ i ] [ n i , k i ] queries[i] [n_i, k_i] queries[i][ni​,ki​] 。第 i i i 个查询 q u e r i e s [ i …

JAVA SDK 整合 AI 大语言模型

目前主流模型厂商的 SDK 并没有很好的支持 JAVA 环境&#xff0c;主流还是使用的 Python &#xff0c;如果希望将 AI 功能集成到业务中来&#xff0c;则需要找找有没有一些现成的开源项目&#xff0c;但是这种项目一般需要谨慎使用&#xff0c;以防有偷取 app_key 等风险问题 前…

如何在Linux下使用git(几步把你教会)

目录 一、注册github账号 二、新建项目 1.点击右上角自己的头像&#xff0c;然后点击Your repositories。 2.点击New。 3.配置新项目信息。 4.点击Create repository即可成功创建。 三、安装git 四、配置git 五、初始化git仓库 1.先进入想要使用git的目录。 2.初始化…

数据时代的数字企业

1.写在前面 讨论数据治理在数字企业中的影响和必要性&#xff0c;并介绍数据治理的核心内容和实践方法。作者强调了数据质量、数据安全、数据隐私和数据合规等方面是数据治理的核心内容&#xff0c;并介绍了具体的实践措施和案例分析。企业需要重视这些方面以实现数字化转型和…

多孔散热器简介

今天给大家分享关于多孔散热器的一些构造、散热情况。 更多资讯&#xff0c;请关注B站【莱歌数字】&#xff0c;有视频教程~~ 常见的散热器通常由不渗透水、空气和其他液体的无孔材料制成。固体铝和铜是行业标准。 但散热器也可以作为半多孔材料或多孔涂层。研究和应用表明&…

防静电监控系统全方位防静电监测,保障产品质量

在当今高度精密的电子制造领域&#xff0c;产品质量的保障至关重要。哪怕是微小的静电干扰&#xff0c;都可能导致电子元件损坏、性能下降&#xff0c;从而影响整个产品的质量和可靠性。为了应对这一挑战&#xff0c;某电子工厂车间引入了先进的防静电监控系统&#xff0c;实现…

11g rac db安装软件时找不到 节点的问题处理

问题 在安装11.2.0.4db软件时数据库软件无法识别集群的两个主机 处理方法 [oracleracdg1-1 database]$ cd /u01/app/oraInventory/ [oracleracdg1-1 oraInventory]$ ls ContentsXML logs oraInst.loc orainstRoot.sh oui [oracleracdg1-1 oraInventory]$ cd ContentsXML/…

Qt | QSS自定义部件的外观

01、简介 一、自定义部件外观基础 1、有 3 种方法可实现自定义界面外观:重新实现 paintEvent()函数,使用 QStyle 类的绘制函数,子类化 QStyle,本小节仅介绍方法 1 和 2 的使用方式,方法 3 见下一节。 2、方法一:Qt 通过 QWidget::paintEvent()函数实现界面外观的绘制,…

Linux运行jar包:Invalid or corrupt jarfile

你们好&#xff0c;我是金金金。 场景 maven打包springboot项目得到一个jar包&#xff0c;我通过xshell上传到虚拟机环境里面&#xff0c;试图运行它&#xff0c;结果Invalid or corrupt jarfile&#xff1a;jar 文件无效或损坏 排查 jdk版本是否一致&#xff1f;结果&#xf…

参数页面设计

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 namespace 参数页面设计 {public partial class Form1 : Form{List<PMs> PMs new List<PMs>();public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){for (int …