• 创建一个基本的win32窗口


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

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

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

    2.程序结构

    (1)主函数的输入参数

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

    (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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    (3) 回调函数

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

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

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

    4. 完整代码

    #include
    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);//派发消息
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
  • 相关阅读:
    顶级“Redis 笔记”, 缓存雪崩 + 击穿 + 穿透 + 集群 + 分布式锁,NB 了
    【附源码】Python计算机毕业设计双笙映画
    小满nestjs(第十六章 nestjs 响应拦截器)
    SpringBoot XML和JavaConfig
    宏macro
    shiro反序列化漏洞(CVE-2016-4437)
    【语音编码】基于matlab ADPCM编解码(Matlab代码实现)
    Spring技术原理之Bean生命周期原理解析
    sqlyog导入csv失败的解决方法
    未登录也能知道你是谁?浏览器指纹了解一下!
  • 原文地址:https://blog.csdn.net/weixin_44923692/article/details/133777481