对DrawText()使用"DT_CALCRECT"模式下的不解,请解答

M32 2012-09-07 01:06:52
最近在弄打印程序,看到最为不解就是DrawText的使用"DT_CALCRECT"模式的问题。
首先看看函数原型
int DrawText( HDC hDC, LPCTSTR lpString, int nCount,LPRECT lpRect,UNIT uFormat);

关于DT_CALCRECT:
这个参数比较重要,可以使DrawText函数计算出输出文本的尺寸。如果输出文本有多行,DrawText函数使用lpRect定义的矩形的宽度,并扩展矩形的底部以容纳输出文本的最后一行。如果输出文本只有一行,则DrawText函数改变矩形的右边界,以容纳下正文行的最后一个字符。出现上述任何一种情况,DrawText函数将返回格式化文本的高度,而不是绘制文本。

例程:

CRect rect
//Get the height and length of the string.
pDC->DrawText(ss,&Rect,DT_CALCRECT|DT_SINGLELINE);
// Draw the text
pDC->DrawText(ss,&Rect,DT_CENTER|DT_TOP|DT_SINGLELINE);


第一个问题是:pDC->DrawText(ss,&tempRect,DT_CALCRECT|DT_SINGLELINE);此句是用来获取字符串的高度和度的,请问他的获取到数据是放到rect吗? 因为我没看到这句当中有接收返回值的变量。

第二个问题是:pDC->DrawText(ss,&Rect,DT_CENTER|DT_TOP|DT_SINGLELINE);此句是在指定的矩形框中绘制文字,他的矩形是由Rect指定吗?

如果上述这两句都是我猜想的话,也就是说都是用Rect变量来做写入/读出的我觉得这例子很容易话人混淆。我不肯所以请懂的来指点一下。

还有,我看到打印程序中,有这样的代码:

tempRect=DrawRect;
tempRect.InflateRect(0,-5,0,0);
pDC->DrawText(ss,&tempRect,DT_CALCRECT|DT_SINGLELINE);

如果是获取ss字符串的高度和长度,如果获取得到的长高信息是写入tempRect的话;那么前的tempRect=DrawRect;tempRect.InflateRect(0,-5,0,0);的执行都是白干的是吗?
但实际,经屏蔽“tempRect.InflateRect(0,-5,0,0);”后在打印预览中确实是受到影响的,他就是这句都是有用的。那么低到这获取字符串信息是存放在那里的?还是只改变tempRect变量里的长和高的值而已?

谢谢!
...全文
810 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kelleo 2013-08-13
  • 打赏
  • 举报
回复
不是很理解,我显示文本的时候,文本下面会多出很多空行,难道DT_CALCRECT 是在原矩形高度的基础上,双倍扩展?
skyline_wolf 2013-05-13
  • 打赏
  • 举报
回复
引用 3 楼 VisualEleven 的回复:
DT_CALCRECT 决定矩形的宽和高。 如果正文有多行,DrawText使用lpRect定义的矩形的宽度,并扩展矩形的底部以容纳正文的最后一行。 如果正文只有一行,则DrawText改变矩形的右边界,以容纳下正文行的最后一个字符。 出现上述任何一种情况,DrawText返回格式化正文的高度,而不是绘制正文。
这个说明我很清楚,但是在实际的运行中我发现返回的lpRect的Size的宽度是文本没有换行的宽度,而且Size的高度是一行的高度,简单地说就是当正文有多行时返回的lpRect并没有换行 请高手指点为何是如此结果?
M32 2012-09-09
  • 打赏
  • 举报
回复
谢谢,完全明白了!
Eleven 2012-09-07
  • 打赏
  • 举报
回复
DT_CALCRECT 决定矩形的宽和高。
如果正文有多行,DrawText使用lpRect定义的矩形的宽度,并扩展矩形的底部以容纳正文的最后一行。
如果正文只有一行,则DrawText改变矩形的右边界,以容纳下正文行的最后一个字符。
出现上述任何一种情况,DrawText返回格式化正文的高度,而不是绘制正文。
Eleven 2012-09-07
  • 打赏
  • 举报
回复
1。DT_CALCRECT :Determines the width and height of the rectangle. If there are multiple lines of text, DrawText uses the width of the rectangle pointed to by the lpRect parameter and extends the base of the rectangle to bound the last line of text. If the largest word is wider than the rectangle, the width is expanded. If the text is less than the width of the rectangle, the width is reduced. If there is only one line of text, DrawText modifies the right side of the rectangle so that it bounds the last character in the line. In either case, DrawText returns the height of the formatted text but does not draw the text.
2。是的
3。参考1的DT_CALCRECT的说明
vnking 2012-09-07
  • 打赏
  • 举报
回复
有点复杂,先顶起再看。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧