| 网站首页 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛 |
 
| 技术教程首页 | 开发语言 | WEB开发 | .NET技术 | 数据库 | 操作系统 | 网页制作 |
 
 
您现在的位置: 编程中国 >> 技术教程 >> 开发语言 >> C++ >> C++技术资料 >> 正文
  ►  Windows编程基础 - 文本显示
Windows编程基础 - 文本显示
作者:未知    阅读人次:……    文章来源:未知    发布时间:2004-12-21    网友评论()条
 



  表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] 下一页

 

 
文章录入:静夜思    责任编辑:静夜思 
  • 上一篇文章:

  • 下一篇文章:

  •  
    相关文章
    原创地带
    24小时热门帖子