分析:在WM_CREATE消息中获取字母宽度与高度修改后存入变量,在WM_PAINT消息中打印时直接在TextOut函数里面使用变量进行设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <windows.h>
#include <strsafe.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR CmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("MyWindows"); // 注意使用TEXT包裹语句
HWND hwnd; // 窗口句柄
MSG msg; // 消息结构
WNDCLASS wndclass; // 窗口类, 定义窗口基本属性
wndclass.style = CS_HREDRAW | CS_VREDRAW; // CS->ClassStyle, H->horizontal 水平的, V->vertical 垂直的, redraw 重绘
wndclass.lpfnWndProc = WndProc; // 指定窗口过程(回调函数)
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0; // 预留的额外空间, 一般设为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 = szAppName; // 窗口类名

if (!RegisterClass(&wndclass)) // 注册窗口, 注册成功返回ATOM类型(对应了字符串在ATOM表的位置); 注册失败返回0
{
MessageBox(NULL, TEXT("这个程序需要在Windows NT才能执行!"), szAppName, MB_ICONERROR);
}

hwnd = CreateWindow(szAppName,
TEXT("快乐小凳凳"),
WS_OVERLAPPEDWINDOW, // 窗口风格
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);

ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);

while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
TCHAR szBuffer[128];
int i;
size_t iTarget;
TEXTMETRIC tm;
static int cxChar, cyChar;

switch (message)
{
case WM_CREATE:
hdc = GetDC(hwnd);
GetTextMetrics(hdc, &tm);
cxChar = tm.tmAveCharWidth; // 平均宽度(大写字母一般取平均宽度的1.5倍)
cyChar = tm.tmHeight + tm.tmExternalLeading;
ReleaseDC(hwnd, hdc);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
for (i = 0; i < 10; i++)
{
StringCchPrintf(szBuffer, 128, TEXT("%d: %s"), i + 1, TEXT("I love WY!"));
StringCchLength(szBuffer, 128, &iTarget);
TextOut(hdc, cxChar, i * cyChar, szBuffer, iTarget);
}
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0); // 正式关闭窗口
return 0;
}

return DefWindowProc(hwnd, message, wParam, lParam);
}