三、C语言创建桌面程序:文字的输出 TextOut 和 DrawText

一、BeginPaint 和 EndPaint 函数

当发生 WM_PAINT事件时,应用程序开始绘图。绘图之前需要先调用 BeginPaint 函数通知 Windows,告诉它当前程序需要使用显示器,你安排一下吧。BeginPaint 函数执行完毕就返回设备环境句柄,接下来就可以使用函数绘图了。
绘图结束后,也需要调用 EndPaint 函数通知Windows,告诉它绘图结束了,你可以继续后面的工作了。

二、TextOut 函数

extOut 函数可以在客户区输出一段文本,原型为:

BOOL TextOut(HDC hdc,  //设备环境句柄int nXStart,  //开始输出位置的x坐标int nYStart,  //开始输出位置的y坐标LPCTSTR lpString,  //要输出的字符串int cbString  //字符串的长度
);

每当发生WM_PAINT事件时,窗口就会发生重绘,这个时候需要向窗口输出文字:

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam,  LPARAM lParam){HDC         hdc;  //设备环境句柄PAINTSTRUCT ps;  //存储绘图环境的相关信息switch (message){case WM_PAINT://开始绘图并返回环境句柄hdc = BeginPaint (hwnd, &ps);//输出文字TextOut(hdc, 50, 50, TEXT ("Hello World!"), 12);//结束绘图并释放环境句柄EndPaint (hwnd, &ps) ;return 0 ;case WM_DESTROY:PostQuitMessage(0) ;return 0 ;}return DefWindowProc(hwnd, message, wParam, lParam) ;
}

三、DrawText函数

TextOut 在一个起点开始输出文本,可以精确定位,不能自动换行;DrawText 在指定区域内输出文本,可以控制格式对齐(居左、居中、居右),可以换行。
DrawText 在内部其实也是调用TextOut ,不过它作了很多处理,比如 DrawText 无需知道输出多少个字符。更重要的是,DrawText 可以处理换行符而 TextOut 不能,从这个角度看,DrawText 应该是一种更高级的用法,是在TextOut基础上的封装。

DrawText 的原型是

int DrawText(HDC hDC,  //设备环境句柄LPCTSTR lpString,  //将要输出的字符串int nCount,  //字符串的长度LPRECT lpRect,  //指向一个矩形区域的结构体 RECT 的指针UINT uFormat  //输出格式
);

1)如果 nCount 为 -1,则表明 lpString 指向的字符串是以’\0’结束的,DrawText 会自动计算字符数。

2)参数 uFormat 有四种取值,它们可以任意组合:

  • DT_CALCRECT:这个参数比较重要,可以使 DrawText 函数计算出输出文本的尺寸。如果输出文本有多行,DrawText 函数使用 lpRect 定义的矩形的宽度,并扩展矩形的底部以容纳输出文本的最后一行。如果输出文本只有一行,则 DrawText 函数改变矩形的右边界,以容纳下正文行的最后一个字符。出现上述任何一种情况。
  • DT_CENTER:指定文本水平居中显示。
  • DT_VCENTER:指定文本垂直居中显示。该标记只在单行文本输出时有效,所以它必须与DT_SINGLELINE结合使用。
  • DT_SINGLELINE:单行显示文本,回车和换行符都不断行。
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){HDC         hdc;  //设备环境句柄PAINTSTRUCT ps;RECT        rect;switch (message){//窗口绘制消息case WM_PAINT:hdc = BeginPaint (hwnd, &ps) ;GetClientRect (hwnd, &rect) ;DrawText(hdc, TEXT("Hello World!"), -1,  &rect, DT_CENTER | DT_VCENTER);EndPaint (hwnd, &ps) ;return 0 ;//窗口销毁消息case WM_DESTROY:PostQuitMessage(0) ;return 0 ;}return DefWindowProc(hwnd, message, wParam, lParam) ;
}

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注