绘制垂直文本






3.37/5 (15投票s)
2006年8月28日
4分钟阅读

84889

2108
GDI DrawText 的扩展
引言
您是否曾想绘制垂直文本,但输出比例失调?这里就是答案。一个简单的纯 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()
相同,只是最后两个不同。
传递给 lpString
的 string
必须以 NULL
结尾。该函数完全兼容 MBCS
和 UNICODE
,因此不必担心您的构建配置。要将 string
分割成列,只需像处理任何其他 string
一样进行即可。在您想要新列的地方,添加一个换行符 '\n'
。
lpRect
定义了函数可以绘制的区域。为了获得最佳效果,请尽量使该矩形尽可能小。传递整个客户端区域只会浪费您的处理器时间。
在 uFormat
参数中,您可以传递以下一个或多个值
DV_HCENTER | 水平居中文本块 | 不能与 DV_RIGHT 结合使用 |
DV_RIGHT | 将文本块对齐到给定矩形的右侧 | 不能与 DV_HCENTER 结合使用 |
DV_VCENTER | 垂直居中文本块 | 不能与 DV_BOTTOM 结合使用 |
DV_BOTTOM | 将文本块对齐到给定矩形的底部 | 不能与 DV_VCENTER 结合使用 |
DV_CENTERALL | 在给定矩形内水平和垂直居中文本 | 不能与 DV_BOTTOM 或 DV_RIGHT 结合使用 |
DV_TEXTTOP | 将文本对齐到顶部 | 相对于最长行对齐文本 |
DV_TEXTCENTER | 居中文本 | 相对于最长行对齐文本 |
DV_TEXTBOTTOM | 将文本对齐到底部 | 相对于最长行对齐文本 |
DV_TEXTJUSTIFY | 使文本顶部和底部对齐 | 相对于最长行对齐文本 |
DV_CALCRECT | 计算绘制所需的矩形;但不绘制 | 矩形是相对于您在 lpRect 参数中提供的矩形计算的 |
DV_DOUBLEBUFFER | 强制使用内部双缓冲 | 默认情况下,不使用双缓冲 |
HcharSpacing
和 VcharSpacing
允许您定义字符和列之间的距离。传递 0
将导致字符相互接触。为了获得最佳效果,请保留其默认值。
工作原理
代码将进入一个循环,将每个字符绘制到一个小的单色屏幕位图中。该位图中的每个位都将被检查,以确定字符的宽度和高度。注意,任何语言的任何字符都可以工作,前提是您设置了正确的区域设置。每个字符的尺寸都会被存储。当这个循环完成后,字符位置将根据最长行和用户输入的字符间距进行计算。所有剩下的就是为每个字符调用常规的 DrawText()
函数,将它们绘制到新计算的位置。
限制和未来发展
我认为在新版本中我已经修复了所有这些问题。
历史
- 版本 1.0 发布 - 2006 年 8 月 25 日
- 版本 1.1 发布 - 2006 年 9 月 10 日
- 移除了所有缓慢的离屏绘制,改用位置存储
- 添加了
DV_TEXTJUSTIFY
和DV_DOUBLEBUFFER
标志 - 修正了斜体字体的问题
- 修正了背景模式的问题
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。