65.9K
CodeProject 正在变化。 阅读更多。
Home

绘制垂直文本

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.37/5 (15投票s)

2006年8月28日

4分钟阅读

viewsIcon

84889

downloadIcon

2108

GDI DrawText 的扩展

Screenshot

引言

您是否曾想绘制垂直文本,但输出比例失调?这里就是答案。一个简单的纯 Win32 函数,无需 MFC。该函数与 DrawText() 的行为几乎完全相同,只是输出是垂直的。

背景

起初,我想打印表格。我的应用程序中的数据有自己的显示方式,因此添加对表格的支持似乎没有意义;我选择绘制它们。在这里画一条线,在那里画一条线,这很容易而且快捷。问题出现在我想插入标题文本时。许多英文单词太长,无法以这种方式水平显示,垂直显示是最合理的做法。但我找不到能够提供令人愉悦输出的函数。所以我自己写了一个。

Using the Code

如果您熟悉 DrawText() 函数,那么使用这个函数将毫无问题。它几乎是相同的。首先,将所需文件包含到您的项目中。在任何您想使用该函数的地方,包含头文件 #include "VertDraw.h"。该函数的原型是

int DrawVertText(    HDC hdc,            // Handle to the Device context
        LPCTSTR lpString,                // Null terminated string
        int nCount,                      // Length of string in bytes
        LPRECT lpRect,                   // Pointer to a rect
        UINT uFormat,                    // Optional drawing flags
        UINT HcharSpacing = 3,           // Pixels between characters
        UINT VcharSpacing = 5 );         // Pixels between columns

参数几乎与 DrawText() 相同,只是最后两个不同。

传递给 lpStringstring 必须以 NULL 结尾。该函数完全兼容 MBCSUNICODE,因此不必担心您的构建配置。要将 string 分割成列,只需像处理任何其他 string 一样进行即可。在您想要新列的地方,添加一个换行符 '\n'

lpRect 定义了函数可以绘制的区域。为了获得最佳效果,请尽量使该矩形尽可能小。传递整个客户端区域只会浪费您的处理器时间。

uFormat 参数中,您可以传递以下一个或多个值

DV_HCENTER 水平居中文本块 不能DV_RIGHT 结合使用
DV_RIGHT 将文本块对齐到给定矩形的右侧 不能DV_HCENTER 结合使用
DV_VCENTER 垂直居中文本块 不能DV_BOTTOM 结合使用
DV_BOTTOM 将文本块对齐到给定矩形的底部 不能DV_VCENTER 结合使用
DV_CENTERALL 在给定矩形内水平和垂直居中文本 不能DV_BOTTOMDV_RIGHT 结合使用
DV_TEXTTOP 将文本对齐到顶部 相对于最长行对齐文本
DV_TEXTCENTER 居中文本 相对于最长行对齐文本
DV_TEXTBOTTOM 将文本对齐到底部 相对于最长行对齐文本
DV_TEXTJUSTIFY 使文本顶部和底部对齐 相对于最长行对齐文本
DV_CALCRECT 计算绘制所需的矩形;但不绘制 矩形是相对于您在 lpRect 参数中提供的矩形计算的
DV_DOUBLEBUFFER 强制使用内部双缓冲 默认情况下,不使用双缓冲

HcharSpacingVcharSpacing 允许您定义字符和列之间的距离。传递 0 将导致字符相互接触。为了获得最佳效果,请保留其默认值。

工作原理

代码将进入一个循环,将每个字符绘制到一个小的单色屏幕位图中。该位图中的每个位都将被检查,以确定字符的宽度和高度。注意,任何语言的任何字符都可以工作,前提是您设置了正确的区域设置。每个字符的尺寸都会被存储。当这个循环完成后,字符位置将根据最长行和用户输入的字符间距进行计算。所有剩下的就是为每个字符调用常规的 DrawText() 函数,将它们绘制到新计算的位置。

限制和未来发展

我认为在新版本中我已经修复了所有这些问题。

历史

  1. 版本 1.0 发布 - 2006 年 8 月 25 日
  2. 版本 1.1 发布 - 2006 年 9 月 10 日
    • 移除了所有缓慢的离屏绘制,改用位置存储
    • 添加了 DV_TEXTJUSTIFYDV_DOUBLEBUFFER 标志
    • 修正了斜体字体的问题
    • 修正了背景模式的问题

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.