表2-4 DrawText 函数
| 用 途 |
该函数在lpRect参数指定的矩形中格式化文本。 |
| 原 型 |
| int DrawText( |
|
| HDC hDC |
设备对象句柄 |
| LPSTR lpString, |
指向要绘制的字符串 |
| int nCount |
要绘制的字符个数。若其为-1,则lpString必须指向以空字符(即‘\0’)结尾的字符串 |
| LPRECT lpRect |
指向一个RECT类型的变量,在该变量所指定矩形内进行文本的格式化(矩形以逻辑坐标表示,见第三章) |
| WORD wFormat |
以下列常量使用“位或”运算得到的值(表2-4-1) |
| ); |
| |
| 返回值 |
返回本文的高度。 |
表2-4-1 wFormat 值
| 类型 |
说明 |
| DT_BOTTOM |
与DT_SINGLELINE组合使用,指定底对齐 |
| DT_CENTER |
文本水平居中 |
| DT_VCENTER |
垂直对中文本(与DT_SINGLELINE组合使用) |
| DT_LEFT |
文本左对齐 |
| DT_RIGHT |
文本右对齐 |
| DT_TOP |
顶对齐(与DT_SINGLELINE组合使用) |
| DT_SINGLELINE |
绘制在一行中。回车换行符不打断该行 |
上面的程序有一个小问题,窗口对象每当收到WM_PAINT消息时都要调用函数GetClientRect()来获得用户区的大小。这样,对程序的效率有些影响,因为窗口对象在大多数情况下收到WM_PAINT消息时,用户区的大小(或说整个窗口的大小)并没有改变,例如,在窗口被对话框覆盖的情况下等。
每当窗口的大小发生变化时,Windows都要向窗口对象直接发送一条WM_SIZE消息(不通过应用程序的消息队列),消息的lParam参数的低位字中含有用户区的宽度,而高位字中含有用户区的高度,并使用设备单位(像素)表示(有关设备单位的内容在第三章介绍)。在Windows.h中定义的宏LOWORD和HIWORD可用来分离参数lParam的高位字和低位字。下面是使用WM_SIZE消息重新设计的程序。
// 2-4-2.c LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps;
static RECT rect;
switch(message)
{
case WM_SIZE:
rect.right = LOWORD(lParam);
rect.bottom = HIWORD(lParam);
return 0L;
case WM_PAINT:
hDC = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
DrawText(hDC, "Hello, Welcome to Windows!", -1,
&rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
EndPaint(hwnd, &ps);
return 0L;
case WM_DESTROY:
PostQuitMessage(0);
return 0L;
}
return DefWindowProc(hwnd, message, wParam, lParam);
} 注意,由于处理消息WM_SIZE的代码所准备的数据是提供其它消息(WM_PAINT)使用的,它们只有在窗口函数再次被进入时才能被使用,因此,变量rect被说明为静态变量。当在不同的消息之间共享一些数据时,必须注意使用静态生存期的变量。
当调用ShowWindow()函数时(例如,第一章中程序中的主函数),Windows也要使用WM_SIZE消息调用窗口函数,因为这时窗口第一次被显现出来。
2.5、字体的大小与多行信息显示 虽然DrawText()函数也可以显示多行信息,但在显示多行信息时, 经常使用的是函数TextOut()。为了显示多行信息,我们必须了解显示设备对象度量字体尺寸的方法,因此,本节先介绍这方面的内容。在本节给出的程序示例中,我们还要介绍WM_CREATE消息和借用显示设备对象的另一种方法。
字样是一种基本的字符图案,具有特定的的衬线和笔划宽度,而字体指的是具有相同字样和尺寸的字符集。字体的尺寸用点来度量,点是印刷业中使用的度量字体的最小度量单位,每一英寸大约有72个点。有关字体的更详细的内容在以后章节介绍。
应用程序可以使用Windows提供的不同字体,也可以使用在应用程序的可执行文件中定义和包含的专用字体。本节仅介绍应用程序如何获得有关字体尺寸方面的信息。使用TextOut函数显示多行文本时,需要确定字体字符的大小,以便根据字符的高度和宽度在用户区中显示多行文本。根据字符的高度可以在文本的相继行之间留出空距,而根据字符的宽度在文本的各列之间留出空距。
结构类型TEXTMETRIC描述了与一种字体有关的基本信息,它的各域所给出的字体大小以逻辑单位表示(关于逻辑单位的介绍参见下一章)。该结构类型包含有许多域,图2-2给出了与字体垂直尺寸有关的五个域的定义。
 |
| 图2-1 TEXTMETRIC结构类型中定义垂直尺寸字体的域 |
tmInternalLeading的值是允许在一个字符上加上重音号的空隙量,tmExternalLeading的值是字体的设计者推荐的空隙量,在显示多行文本时程序员可以拒绝使用这个空隙量。
在TEXTMETRIC结构类型中,有两个域用来定义字符的宽度:tmAveCharWidth表示字体字符的平均宽度,tmMaxCharWidth表示字体最宽的字符的宽度。Windows中使用两种类型的字体,一类是固定宽度的字体,固定宽度的字体的每个字符的宽度是一样的,这样tmAveCharWidth和tmMaxCharWidth两值相等;另一类是可变宽度的字体,对于这类字体,每个字符占用的宽度不一样。例如, 字符“w”和“i”的宽度就不同,使用可变宽度的字体可以绘制紧凑的文本。
可以使用函数GetTextExtent计算出一个特定的文本行的宽度和高度,使用函数GetTextMetrics可以得到字符的有关尺寸,这两个函数的说明见表2-5。
表2-5-1 GetTextExtent 函数
| 用 途 |
该函数使用设备对象当前使用的字体计算一个文本行宽度和高度(逻辑单位),在计算时不考虑当前裁剪区。 |
| 原 型 |
| DWORD GetTextExtent( |
|
| HDC hDC |
设备对象句柄 |
| LPSTR lpString, |
指向一个字符串 |
| int nCount |
所要计算字符数。 |
| ); |
| |
| 返回值 |
返回字符串的尺寸,高度在高位字上,宽度在低位字上。 |
表2-5-2 GetTextMetrics 函数
| 用 途 |
返回设备对象当前所使用的字体字符的有关尺寸。 |
| 原 型 |
| DWORD GetTextMetrics( |
|
| HDC hDC |
设备对象句柄 |
| LPTEXTMETRIC lpMetric, |
指向TEXTMETRIC类型的变量的指针,有关尺寸被放入该变量中。 |
| ); |
| |
| 返回值 |
若调用成功,返回非零,否则返回零。 |
上一页 [1] [2] [3] [4] 下一页