当前位置: 首页 > news >正文

创建一个基本的win32窗口

1.建立一个窗口的基本步骤

(1)向系统注册一个窗体类
(2)根据窗体类创建窗口
(3)进入消息循环

在这里插入图片描述
在这里插入图片描述

2.程序结构

(1)主函数的输入参数

int WINAPI WinMain(
HISTANCE hInstance,//当前窗口的句柄
HINSTANCE hPrevInstance,//为了兼容早期的16位系统保留下来的,填NULL
LPSTR lpCmdLine, //传入的命令行参数
int nShowCmd//控制窗口如何显示)

(2) 窗口类

Typedef struct tagWNDCLASSA
{
UINT style;//设置窗口格式
WNDPROC lpfnWndProc;//窗口的回调函数,也就是窗口接收到消息后,交给哪个函数处理,,函数的功能一般是处理消息
Int cbClsExtra;//为类额外分配内存,一般为0
Int cbWndExtra;//为窗口额外分配内存,一般为0
HINSTANCE hInstance;//程序实例,这里就用到了WinMain函数的每一个参数hInstance
HICON hIcon;//设置程序图标
HCURSOR hCursor;//设置鼠标光标
HBRUSH hbrBackground;//设置界面背景色
LPCSTR lpszMenuName;//设置菜单名称(LPCSTR表示一个指向宽字符串的指针) 
LPCSTR lpszClassName;//设置类名称
}WNDCLASSA,*PWNDCLASSA,*NPWNDCLASSA,*LPWNDCLASSA;

(3) 回调函数

LRESULT CALLBACK WinSunProc(HWND hwnd, UINT uMsg,WPARAM wParam,LPARAM lParam)

3.核心机制:进入消循环

MSG msg;
While(GetMessage(&msg,NULL,0,0))//如果消息不是WM_QUIT,返回非零值;如果消息是WM_QUIT,返回零
{
TranslateMessage(&msg);//翻译消息,如果WM_KEYDOWN和WM_KEYUP翻译成一个WM_CHAR消息
DispatchMessage(&msg);//派发消息
}

4. 完整代码

#include<Windows.h>
LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{switch (uMsg)//通过判断消息进行消息响应{case WM_CLOSE:DestroyWindow(hwnd);//销毁窗口并发送WM_DESTROY消息,但是程序没有退出break;case WM_DESTROY:PostQuitMessage(0);//发出WM_QUIT消息,结束消息循环break;default:return DefWindowProc(hwnd, uMsg, wParam, lParam);//对不感兴趣的消息进行缺省处理,必须有该代码,否则程序有问题}return 0;
}int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) {WNDCLASS wndcls; //创建一个窗体类wndcls.cbClsExtra = 0;//类的额外内存,默认为0即可wndcls.cbWndExtra = 0;//窗口的额外内存,默认为0即可wndcls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//获取画刷句柄(将返回的HGDIOBJ进行强制类型转换)wndcls.hCursor = LoadCursor(NULL, IDC_CROSS);//设置光标wndcls.hIcon = LoadIcon(NULL, IDI_ERROR);//设置窗体左上角的图标wndcls.hInstance = hInstance;//设置窗体所属的应用程序实例wndcls.lpfnWndProc = WinSunProc;//设置窗体的回调函数,暂时没写,先设置为NULL,后面补上wndcls.lpszClassName = L"test";//设置窗体的类名wndcls.lpszMenuName = NULL;//设置窗体的菜单,没有,填NULLwndcls.style = CS_HREDRAW | CS_VREDRAW;//设置窗体风格为水平重画和垂直重画RegisterClass(&wndcls);//向操作系统注册窗体//产生一个窗体,并返回该窗体的句柄,第一个参数必须为要创建的窗体的类名,第二个参数为窗体标题名HWND hwnd = CreateWindow(L"test", L"我的第一个窗口",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, 0, 0))//如果消息不是WM_QUIT,返回非零值;如果消息是WM_QUIT,返回零{TranslateMessage(&msg);//翻译消息,如把WM_KEYDOWN和WM_KEYUP翻译成一个WM_CHAR消息DispatchMessage(&msg);//派发消息}
}
http://www.lryc.cn/news/189092.html

相关文章:

  • 如何在 Spring Boot 中使用 WebSocket
  • ubuntu2023装完显卡驱动和CUDA CUDNN开机只有下划线闪烁
  • MySQL三种安装方法(yum安装、编译安装、二进制安装)
  • 《视觉 SLAM 十四讲》第 7 讲 视觉里程计1 【如何根据图像 估计 相机运动】【特征点法】
  • 9. 一个SpringBoot项目运行
  • 如何实现chatGPT批量问答,不用token
  • Arduino驱动LIS2DH三轴加速度传感器(惯性测量传感器篇)
  • B 开组会(可持久线段树+树剖) 武汉大学2023年新生程序设计竞赛(同步赛)
  • vue的axios方法
  • gitlab docker部署,备份,恢复。附踩坑记录
  • 2023品牌新媒体矩阵营销洞察报告:流量内卷下,如何寻找增长新引擎?
  • HarmonyOS/OpenHarmony原生应用-ArkTS万能卡片组件Toggle
  • redis,mongoDB,mysql,Elasticsearch区别
  • 什么是软件测试架构师?
  • 安科瑞ARB5系列弧光保护装置,智能电弧光保护,保障用电安全
  • 查找算法——二分查找法
  • 大数据——Spark Streaming
  • graphviz 绘制二叉树
  • STM32 PA15/JTDI 用作普通IO,烧录口不能使用问题解决
  • 【ARM Coresight 系列文章 9 -- ETM 介绍 1】
  • 设计模式 - 中介者模式
  • HttpServletRequest对象与RequestDispatcher对象
  • Spring Boot启动流程
  • ARM day5
  • 流程引擎概述及组成
  • 定时任务Apscheduler实践案例
  • C#学习系列相关之多线程(五)----线程池ThreadPool用法
  • 京东数据接口|电商运营中数据分析的重要性
  • C++入门(1)
  • redis-6.2.7 集群安装3主3从