最近在弄打印程序,看到最为不解就是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变量里的长和高的值而已?
谢谢!