windows窗体程序的创建

#include<iostream>
#include<windows.h>
using namespace std;

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);    //用来处理消息队列

//wWinMain 和 WinMain的区别 可以解决Unicode和ANSI之间的切换问题
int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nShowCmd)
{
	//四个参数:
	//hInstance:当前应用的句柄
	//hprevious instance:上一个应用的句柄 通常设为NULL
	//LPSTR cmdLine:用户和窗体之间的交互

	UNREFERENCED_PARAMETER(hPrevInstance);   //告诉编译器已经使用了这个变量
	UNREFERENCED_PARAMETER(lpCmdLine);       //告诉编译器已经使用了该变量

	WNDCLASSEX wndClass = { 0 };
	wndClass.cbSize = sizeof(WNDCLASSEX);     //窗体类的大小,可以用sizeof来获取
	wndClass.style = CS_HREDRAW | CS_VREDRAW;   //窗体的风格
	wndClass.lpfnWndProc = WndProc;    //窗口函数处理指针
	wndClass.cbClsExtra = 0;     //指定紧跟在窗口类结构后的附加字数
	wndClass.cbWndExtra = 0;     //指定紧跟在窗口类结构后的附加字节数
	wndClass.hInstance = hInstance;   //本模块的实例句柄
	wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);    //图标的句柄
	wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);      //光标的句柄
	wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);    //背景画刷的句柄
	wndClass.lpszMenuName = NULL;        //指向菜单的指针
	wndClass.lpszClassName = TEXT("DX11BookWindowClass");    //指向类名称的指针
	wndClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO);    //和窗口关联的小图标

													   //提交注册表单
	if (!RegisterClassEx(&wndClass)) {
		MessageBox(NULL, TEXT("Register Window failed!"), TEXT("Warning"), MB_OK);
		return -1;
	}

	//设置窗体的大小
	RECT rc = { 0, 0, 640, 480 };  //窗口规模   左上角坐标 宽度 高度
	AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE);

	//创建一个标准的窗体
	HWND hwnd = CreateWindowA("DX11BookWindowClass", "BLACK WIN32 Window", WS_OVERLAPPED, CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.left,
		rc.bottom - rc.top, NULL, NULL, hInstance, NULL);   
	//参数说明:
	//(1)窗口类名:这里有个坑 这里填写的类名必须与上面注册的类名一致
	//(2)窗体标题
	//(3)窗体风格
	//(4)坐标x
	//(5)坐标y
	//(6)宽度
	//(7)高度
	//(8)父类窗体的句柄
	//(9)lpParam--

	if (!hwnd) {
		MessageBox(NULL, TEXT("Register Window failed!"), TEXT("Warning"), MB_OK);
		return -1;
	}

	ShowWindow(hwnd, nShowCmd);

	//窗体创建完毕后 开始消息循环
	MSG msg = { 0 };
	while (msg.message != WM_QUIT)    //如果不退出的话 则一直循环
	{
		if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
			TranslateMessage(&msg);     //获取新的消息
			DispatchMessage(&msg);      //派遣消息
		}
		else {
			
			//Update 更新
  			//Draw   绘制

		}
	}
	return static_cast<int>(msg.wParam); //把expression转换为type-id
}


//消息队列
//每当消息循环获取到新消息后 开始处理消息
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message)    //选择消息类型进行处理
	{
		case WM_PAINT: {    //窗体绘制
			hdc = BeginPaint(hWnd, &ps);
			EndPaint(hWnd, &ps);
		}break;

		case WM_CLOSE: {     //窗体关闭
			PostQuitMessage(0);
			DestroyWindow(hWnd);
		}break;

		case WM_DESTROY: {
			PostQuitMessage(0);
			break;
		}

		default:{
			return DefWindowProc(hWnd, message, wParam, lParam);  //确保每个消息都得到处理
		}
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值