win32创建窗口及按钮(轻量级)

话不多说,都在注释里,上代码:

#include <Windows.h>
#include <stdio.h>

//按钮ID
#define IDC_BUTTON_CLICK 150

//按钮点击事件
void OnButtonClick()
{
	::MessageBox(NULL, L"你好", L"呵呵呵", MB_OK);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM lParam)
{
	switch (msgID)
	{
	case WM_LBUTTONDOWN:
		OutputDebugString(L"左键窗口按下");
		break;
	case WM_CLOSE:
		MessageBoxW(NULL, L"不准关", L"提示", MB_OK);
		//DestroyWindow(hWnd);
		break;
	case WM_CREATE:
		//界面上创建一个按钮
		CreateWindow(L"button",//必须为:button,这是一个按钮类名
			L"点我关闭",//按钮上显示的字符    
			WS_CHILD | WS_VISIBLE,
			200, 200, 70, 30,  //按钮在界面上出现的位置
			hWnd, (HMENU)IDC_BUTTON_CLICK,  //设置按钮的ID,随便设置一个数即可
			GetModuleHandle(NULL), NULL);
		break;
		//销毁窗口
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	case WM_COMMAND: //WM_COMMAND是子窗口向父窗口发送的通知消息
	{
		//控件ID
		WORD wControlID = LOWORD(wParam);
		//消息码
		WORD wCode = HIWORD(wParam);
		if (wControlID == IDC_BUTTON_CLICK &&
			wCode == BN_CLICKED)
		{
			//进入按钮点击事件
			OnButtonClick();
			PostQuitMessage(0);
		}
		break;
	}
	//键盘按钮按下
	case WM_KEYDOWN:
	{
		//详见各按钮id
		//https://learn.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
		//回车
		LPCWSTR lpwzText = L"未知按钮按下";
		if (wParam == VK_ESCAPE)
		{
			lpwzText = L"ESC";
		}
		else if (wParam == VK_RETURN)
		{
			//动态创建一个按钮
			lpwzText = L"回车";
			//界面上创建一个按钮
			CreateWindow(L"button",//必须为:button,这是一个按钮类名
				L"回车",//按钮上显示的字符    
				WS_CHILD | WS_VISIBLE,
				100, 100, 50, 30,  //按钮在界面上出现的位置
				hWnd, (HMENU)(IDC_BUTTON_CLICK + 1),  //设置按钮的ID,随便设置一个数即可
				(HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), NULL);
		}
		::MessageBox(NULL, lpwzText, L"提示", MB_OK);
		UpdateWindow(hWnd);
		break;
	}
	case WM_PAINT:
	{
		//划线必须放到WM_PAINT里
		//https://learn.microsoft.com/en-us/windows/win32/learnwin32/painting-the-window
		//
		//画几条线
		PAINTSTRUCT ps;
		HDC hdc;   // DC(可画图的内存对象) 的句柄
		HPEN hpen; // 画笔
		// 通过窗口句柄获取该窗口的 DC
		hdc = BeginPaint(hWnd, &ps);
		// 创建画笔
		hpen = CreatePen(PS_SOLID, 10, RGB(255, 0, 0));
		// DC 选择画笔
		SelectObject(hdc, hpen);
		// (画笔)从初始点移动到 50,50
		MoveToEx(hdc, 50, 50, NULL);
		// (画笔)从初始点画线到 100,100
		LineTo(hdc, 150, 100);

		EndPaint(hWnd, &ps);
		break;
	}
	default:
		DefWindowProc(hWnd, msgID, wParam, lParam);
	}
	return 1;
}

int __stdcall WinMain(HINSTANCE hIns, HINSTANCE hPreIns, LPSTR lpCmdLine, int nCmdShow)
{
	WNDCLASS wc = { 0 };
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	wc.hCursor = NULL;
	wc.hIcon = NULL;
	wc.hInstance = hIns;
	wc.lpfnWndProc = WndProc;
	wc.lpszClassName = L"Main";
	wc.lpszMenuName = NULL;
	wc.style = CS_HREDRAW | CS_VREDRAW;
	RegisterClass(&wc); //将以上所有赋值全部写入操作系统中
	//在内存创建窗口
	HWND hWnd = CreateWindow(L"Main", L"window", WS_OVERLAPPEDWINDOW, 400, 400, 450, 430, NULL, NULL
		, hIns
		, NULL);

	//关闭最大化按钮
	LONG style = GetWindowLong(hWnd, GWL_STYLE);
	style &= ~(WS_MAXIMIZEBOX);
	SetWindowLong(hWnd, GWL_STYLE, style);

	//显示窗口
	ShowWindow(hWnd, SW_SHOW);
	UpdateWindow(hWnd);
	//消息循环
	MSG nMsg = { 0 };
	while (GetMessage(&nMsg, NULL, 0, 0)) { //从消息队列获取消息
		TranslateMessage(&nMsg);//翻译消息
		DispatchMessage(&nMsg);//派发消息:将消息交给窗口处理函数来处理。
	}

	return 0;
}

创建一个空的win32项目,添加.cpp文件,内容如上。

VS配置:

效果如下:

 

编译生成的程序只有50kb左右,这点比MFC好太多了,尤其是开发一些功能简单的小工具时很方便

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇龍_

若帮助到你,希望能给予鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值