话不多说,都在注释里,上代码:
#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好太多了,尤其是开发一些功能简单的小工具时很方便