创建一个基本的win32窗口

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

(1)向系统注册一个窗体类

(2)根据窗体类创建窗口

(3)进入消息循环


2.程序结构

(1)主函数的输入参数

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

(2) 窗口类

cpp 复制代码
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) 回调函数

cpp 复制代码
LRESULT CALLBACK WinSunProc(HWND hwnd, UINT uMsg,WPARAM wParam,LPARAM lParam)

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

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

4. 完整代码

cpp 复制代码
#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;//设置窗体的菜单,没有,填NULL
	wndcls.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);//派发消息
	}
}
相关推荐
David猪大卫13 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
HPtiger13 小时前
C++ 入门笔记:从 C 到 C++ 的核心过渡(命名空间、输入输出、缺省参数、重载、引用、内联)
c语言·c++·学习
努力努力再努力wz16 小时前
【Lua 进阶系列】从 C++ 对象到 Lua 变量:一文理解 userdata、Lua 栈与元表绑定机制
c++·junit·lua
慧都产品智能化17 小时前
Qt 表格升级攻略:复用已有编辑器,减少重复开发
c++·qt·编辑器·qt6.3
ShineWinsu17 小时前
对于Qt:QTableWidget常见属性以及QTableWidgetItem类的解析
开发语言·c++·qt·gui·客户端·表格·qtablewidget
ShineWinsu18 小时前
对于Qt:QListWidget常见属性以及QListWidgetItem类的解析
开发语言·c++·qt·客户端·列表·qlistwidget·qlistwidgetitem
坤坤子吖19 小时前
Linux网络编程:自定义应用层协议与 JSON 序列化
linux·服务器·网络·c++·笔记·json
沫璃染墨20 小时前
从零入门计算机网络系列(十八):TCP连接管理详解——从三次握手与四次挥手到TIME_WAIT机制
运维·服务器·网络·c++·网络协议·tcp/ip·tcp
自信1504130575921 小时前
重生之从0开始学习c++之——vector-中篇
c++·学习·算法
ShineWinsu1 天前
对于Qt:QDial常见属性以及信号的解析
开发语言·c++·qt·gui·客户端·旋钮·qdial