从0写软件-Win32应用代码模板

694 字
3 分钟
从0写软件-Win32应用代码模板

本篇文章主要实现内容:#

  1. 注册一个窗口
  2. 在窗口中绘制控件,并实现最简单的交互(输入字符串并设置文本为输入的字符串)

参考文档:#

  1. https://learn.microsoft.com/zh-cn/windows/win32
  2. https://learn.microsoft.com/zh-cn/windows/win32/controls
  3. https://learn.microsoft.com/zh-cn/windows/win32/api/winuser

代码:#

注释都在代码里了

/*
代码编写&本篇文档编写 by AZX
主要实现内容:
1.注册一个窗口
2.在窗口中绘制控件,并实现最简单的交互(输入字符串并设置文本为输入的字符串)
可参考文档:
https://learn.microsoft.com/zh-cn/windows/win32
https://learn.microsoft.com/zh-cn/windows/win32/controls
https://learn.microsoft.com/zh-cn/windows/win32/api/winuser
*/
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
//设置类名&窗口名全局变量
const wchar_t CLASS_NAME[] = L"WindowsSystemTest";
const wchar_t WINDOW_NAME[] = L"WindowsSystemTest";
HWND hwnd, edit1, button1, static1;
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void OnSize(HWND hwnd, int width, int height);
int WINAPI wWinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PWSTR pCmdLine,
int nCmdShow)
{
//设置窗口类
WNDCLASS WndCLASS = {};
WndCLASS.lpfnWndProc = WindowProc; // 使用自定义的过程函数,如果你懒得写这个函数,可以填 DefWindowProc 使用默认过程,这样就可以删掉WindowProc函数
WndCLASS.hInstance = hInstance;
WndCLASS.lpszClassName = CLASS_NAME;
WndCLASS.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
//注册窗口类
RegisterClass(&WndCLASS);
//创建主窗口,以 CLASS_NAME 为类名,WINDOW_NAME 为窗口名,使用默认的大小和位置,和默认的窗口样式(WS_OVERLAPPEDWINDOW)
hwnd = CreateWindowExW(
0L,
CLASS_NAME,
WINDOW_NAME,
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
//检查窗口是否被成功创建,如果是,显示出来,否则退出
if (!hwnd) return 0;
else ShowWindow(hwnd, nCmdShow);
//获取主窗口字体,方便统一字体
int dpi = GetDpiForWindow(hwnd);
int pt = 10;
HFONT hFont = CreateFontW(-MulDiv(pt, dpi, 72),
0, 0, 0, FW_NORMAL, 0, 0, 0,
DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
CLEARTYPE_QUALITY, VARIABLE_PITCH | FF_DONTCARE,
L"Segoe UI");
//创建窗口控件
edit1 = CreateWindowW(L"EDIT", L"请输入文本",
WS_CHILD | WS_VISIBLE | ES_MULTILINE,
10, 10, 114, 20, hwnd, (HMENU)2, hInstance, NULL);
button1 = CreateWindowW(L"BUTTON", L"确定",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP,
10, 35, 114, 20, hwnd, (HMENU)1, hInstance, NULL);
static1 = CreateWindowW(L"static", L"文本",
WS_CHILD | WS_VISIBLE | SS_CENTER,
10, 60, 114, 20, hwnd, (HMENU)3, hInstance, NULL);
//为每个控件统一主窗口的字体
SendMessage(edit1, WM_SETFONT, (WPARAM)hFont, TRUE);
SendMessage(button1, WM_SETFONT, (WPARAM)hFont, TRUE);
SendMessage(static1, WM_SETFONT, (WPARAM)hFont, TRUE);
//重复执行判断逻辑知道窗口关闭
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
//这里添加窗口操作的逻辑
}
return 0;
}
LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch (uMsg) {
//控件传入信息
case WM_COMMAND:
{
switch (LOWORD(wParam)) {
case 1: //1为按钮的ID
//读取并设置文字内容
wchar_t EditText[114];
GetWindowTextW(edit1, EditText, 114);
SetWindowTextW(static1, EditText);
break;
}
return 0;
}
//窗口绘制
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
//这里填入窗口绘制的逻辑
EndPaint(hwnd, &ps);
return 0;
}
// 窗口关闭
case WM_CLOSE:
{
if (MessageBox(hwnd, L"确定退出?", WINDOW_NAME, MB_OKCANCEL) == IDOK)
DestroyWindow(hwnd);
return 0;
}
//窗口销毁
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
}
//其余的信息逻辑
}
//对于这个函数没有处理的一些消息,由默认方式处理
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
从0写软件-Win32应用代码模板
https://azx.xn--0iv.gay/posts/win32app/
作者
WanFoxAZX
发布于
2026-08-29
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
WanFoxAZX
Hello, I'm AZX.
公告
Welcome!
分类
标签
最新动态

还没有发布动态

更多动态
站点统计
文章
10
动态
0
分类
6
标签
5
总字数
2,549
运行时长
0
最后活动
0 天前
站点信息
构建平台
Netlify CI
博客版本
Firefly v6.15.5
文章许可
CC BY-NC-SA 4.0