DrawText多行文本垂直居中

要使用DrawText后的文本居中,可以使用DT_CENTER,要垂直居中,直接|DT_VCENTER,或者再加上|DT_SINGLELINE,但是这样只对单行文本有效,多行带换行的文本怎么实现DrawText文本处在最中间的位置呢?网上找到一些相关资料可以实现这样的功能

方法很简单,但是要自己实现,原理如下:

1、使用DrawText并设置uFlag参数为DT_CALCRECT,根据MSDN说明:

Return Value

The height of the text if the function is successful.

 

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 thelpRect 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.

决定矩形的宽和高。
如果正文有多行,DrawText使用lpRect定义的矩形的宽度,并扩展矩形的底部以容纳正文的最后一行。
如果正文只有一行,则DrawText改变矩形的右边界,以容纳下正文行的最后一个字符。
出现上述任何一种情况,DrawText返回格式化正文的高度,而不是绘制正文。

因此,使用DrawText并设置uFlag参数为DT_CALCRECT,函数返回的是正文的高度,通过这个返回值可以计算出需要垂直居中的位置。

 

2、知道了正文的高度,然后我们定义显示矩形区域高为h,正文高度为h1,那么底下空白区域高度则为h-h1,如左图所示。

现在我们要将文的区域垂直居中,只需将计算出来的空白区域高度平均分半,并将其作为正文的高度,那么刚好就是垂直居中的位置了

具体代码如下(VC 2008,WINCE6.0模拟器下测试成功):

 dcMem.SetBkMode(TRANSPARENT); //透明
 dcMem.SelectObject(font2);//换字体
 dcMem.SetTextColor(RGB(255,255,255));//白色
 CString strText=L"测试垂直居中的文字测试垂直居中的文字测试垂直居中的文字测试垂直居中的文字测试垂直居中的文字";
 CRect boundary(0,0,300,200) ;//设置文本要显示矩形区域
 CRect rect(0,0,boundary.Width() ,boundary.Height());//设置文字显示临时区域
 //使用DT_CALCRECT,DT_CENTER,DT_EDITCONTROL,DT_WORDBREAK参数计算需要的文本高度
 int height = dcMem.DrawText(strText, rect, DT_CALCRECT|DT_CENTER|DT_EDITCONTROL|DT_WORDBREAK);
 rect = boundary;//计算完成后将原来的区域赋回rect
 if(boundary.Height() > height)//判断高度是否超出范围,以免出现负数情况
 rect.top += (boundary.Height() - height)/2;//计算空白高度的一半,这里要用+=
 dcMem.DrawText(strText, rect,DT_CENTER|DT_EDITCONTROL|DT_WORDBREAK); //输出垂直居中+左右居中+自动换行的文本结果

参考资料:http://www.codeguru.com/forum/showthread.php?t=253508

http://baike.baidu.com/view/1023733.htm

欢迎讨论。

 

 

你可能感兴趣的:(VC++)