一、积重难返!
- 无论你有没有意识到,在Windows程序设计中,在消息WM_PAINT中输出文本的时,在使用SetTextAlign函数来控制文本对齐的时候,总会有些别扭,说的更直白些是对SetTextAlign函数如何控制文本对齐的原理感到疑惑。有时候为了试图搞清楚其这种控制对齐的原理,我们不惜把SetTextAlign的参数改来改去,但却造成了更多的疑惑:为何第一行总和之后的行格式不一样?为何整整少了一列?为何我改了参数什么事情都没有发生?是我眼睛花了吗(没准这是事实,你可能很快就可以意识到)?
- 于是我们决定跳过这个陷阱,暂且不管“文本对齐”这档子事,不过不久就会发现,在窗口的客户区对文本的输出操作实在过于频繁,每一次我们都得承受这种疑惑带来的苦恼,甚至让我们感到羞耻。终于我们打算直面这个问题,下面我们一起来找些灵感。
二、正式开始前的准备…
- 我们首先需要引用一段经典的代码段来作为下面讨论的基础,下面这段代码引自大师Petzold的著作《Windows程序设计》4.2.10节的SYSMETS1.C源码:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
static int cxChar, cxCaps, cyChar;
HDC hdc;
int i;
PAINTSTRUCT ps;
TCHAR szBuffer[10];
TEXTMETRIC tm;
switch (message) {
... 省略 ...
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
for (i = 0; i < NUMLINES