使用Windows API创建一个窗口

38 阅读1分钟

实现代码

#include <Windows.h>
HINSTANCE hIns;
HWND hwnd;

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

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {

	// 创建窗口类
	WNDCLASSEX wcx;
	hIns = hInstance;
	MSG msg;
	BOOL fGotMessage;

	wcx.cbSize = sizeof(wcx);
	wcx.style = CS_HREDRAW | CS_VREDRAW;  //  窗口变化时候,水平和垂直方向进行重绘
	wcx.lpfnWndProc = MainWndProc;   // 指定窗口过程函数
	wcx.cbClsExtra = 0;
	wcx.cbWndExtra = 0;

	wcx.hInstance = hInstance;
	// 窗口Icon
	wcx.hIcon = LoadIcon(NULL, IDI_APPLICATION);  // 加载图标

	wcx.hCursor = LoadCursor(NULL, IDC_ARROW);  // 加载鼠标指针
	// 窗口背景
	wcx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);  // 通过库存对象设置背景

	wcx.lpszMenuName = NULL;
	wcx.hIconSm = (HICON)LoadImage(
		hInstance,
		MAKEINTRESOURCE(5),
		IMAGE_ICON,
		GetSystemMetrics(SM_CXSMICON),
		GetSystemMetrics(SM_CYSMICON),
		LR_DEFAULTCOLOR
	);
	
	wcx.lpszClassName = L"MainWClass";  // 类名称,创建窗口时候填入该名称

	//注册窗口类
	if (!RegisterClassEx(&wcx)) {
		return 1;
	}

	// 创建窗口
	hwnd = CreateWindow(
		L"MainWClass",  // 使用我们前面创建注册的窗口类
		L"Hello",  // 窗口Title
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		(HWND)NULL,
		(HMENU)NULL,
		hInstance,
		(LPVOID)NULL
	);

	if (!hwnd) {
		return 1;
	}

	// 显示窗口
	ShowWindow(hwnd, nCmdShow);

	// 显示窗口执行以后更新一下窗口
	UpdateWindow(hwnd);

	// 是否收到消息
	while ((fGotMessage = GetMessage(&msg, (HWND)NULL, 0, 0)) != 0) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);  // 转发消息

	}
	// 将消息发给窗口过程函数来处理消息
	return msg.wParam;
}

// 窗口过程函数,处理消息
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
	switch (uMsg)
	{
	// 点击鼠标左键
	case WM_LBUTTONDOWN:
		MessageBox(hwnd, L"Hello window 窗口内容", L"窗口标题", MB_OK);
		return 0;
	// 窗口关闭的消息, 如果不处理的话窗口关不掉
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	default:
		return DefWindowProc(hwnd, uMsg, wParam, lParam); // 消息很多,我们不需要的默认转给Windows处理
	}
}

int main() {
	return WinMain(GetModuleHandle(NULL), NULL, GetCommandLineA(), SW_SHOW);
}

执行代码,运行效果如下

image.png