DrawText如何使多行文字居中

(1)DT_WORDBREAK 只能截断单词。例如如果输入一连串英文字符,那么它会当做一个单词来处理,而不会自动换行。而对于中文字符则可以。如果要对所有字符都可以像Edit控件中那样自动换行,那么可以使用DT_WORDBREAK | DT_EDITCONTROL DT_EDITCONTROL Duplicates the text-displaying characteristics of a multiline edit control. Specifically, the average character width is calculated in the same manner as for an edit control, and the function does not display a partially visible last line.
 (2)DT_CALRECT的使用 对于一段text,要计算他的显示大小,那么可以使用DT_CALRECT标志。其中的rect参数属于IN/OUT类型。输出时,左上角坐标不变,右下角坐标改变。函数返回值是文本的高度。当然,它要与不同格式标志一起使用得到的结果是不一样的。例如,DT_CALRECT | DT_SINGLELINE 时,它只扩展传入rect的width,而在多行显示的时候,即DT_WORDBREAK | DT_WORDBREAK | DT_EDITCONTROL,仅仅扩展height,width不变。 DT_CALCRECT Determines the width and height of the rectangle. If there are multiple lines of text, DrawText will use the width of the rectangle pointed to by lpRect and extend the base of the rectangle to bound the last line of text. If there is only one line of text, DrawText will modify 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.
(3)DT_CENTER 与 DT_VCENTER DT_VCENTER只对单行文字的竖直居中有用。DT_CENTER 对单行和多行文字都有用,但只能水平居中。
(4)多行文字的竖直居中 思路:
根据显示中心,重新计算要求的显示范围 具体方法:
 // ======================================
// = 把str内容显示到客户区的中间,但是每行宽度限定为200,让其自动换行
 CRect clientRect; GetClientRect(clientRect);
 // 获得客户区范围
CRect rect;
rect.left = rect.top = 0;
 rect.right = 200;
 rect.bottom = clientRect.bottom;
// 限定宽度
 CString str = "我是来自非洲的姑娘。心中向往神秘的东方,背起行囊寻找梦想,那是龙的故乡这里的人纯朴善良,淡淡微笑挂脸庞";
CRect temp = rect;
int height = pDC->DrawText(str,temp,DT_CENTER | DT_WORDBREAK | DT_CALCRECT | DT_EDITCONTROL);
// 获得文本高度
 rect.DeflateRect(0,(rect.Height() - height) / 2);
 // 改变rect pDC->DrawText(str,rect, DT_CENTER | DT_EDITCONTROL | DT_WORDBREAK);

 

int DrawText(
HDC hDC,          // handle to DC
LPCTSTR lpString, // text to draw
int nCount,       // text length
LPRECT lpRect,    // formatting dimensions
UINT uFormat      // text-drawing options
);

MSDN里的DrawText的nFormat的DT_WORDBREAK可以实现多行显示,可是试了很多次都不行,如果文本中有用空格,会自动在空格处换行。如果没有空格的话,仍然是单行显示。最后试了下DT_EDITCONTROL和DT_EDITCONTROL组合使用才行,发现可以自动换行了。

各个参数的含意如下:

参数:

    hdc:设备环境句柄。

    lpString:指向将被写入的字符串的指针,如果参数nCount是C1,则字符串必须是以/0结束的。

    如果uFormat包含DT_MODIFYSTRING,则函数可为此字符串增加4个字符,存放字符串的缓冲区必须足够大,能容纳附加的字符。

    nCount:指向字符串中的字符数。如果nCount为C1,则lpString指向的字符串被认为是以/0结束的,DrawText会自动计算字符数。

    lpRect:指向结构RECT的指针,其中包含正文将被置于其中的矩形的信息(按逻辑坐标)。

    uFormat:指定格式化正文的方法。它可以下列值的任意组合,各值描述如下:

    DT_BOTTOM:将正文调整到矩形底部。此值必须和DT_SINGLELINE组合。

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

    DT_CENTER:使正文在矩形中水平居中。

    DT_EDITCONTROL:复制多行编辑控制的正文显示特性,特殊地,为编辑控制的平均字符宽度是以同样的方法计算的,此函数不显示只是部分可见的最后一行。

    DT_END_ELLIPSIS或DT_PATH_ELLIPSIS:可以指定DT_END_ELLIPSIS来替换在字符串末尾的字符,或指定DT_PATH_ELLIPSIS来替换字符串中间的字符。如果字符串里含有反斜扛,DT_PATH_ELLIPSIS尽可能地保留最后一个反斜杠之后的正文。

    DT_EXPANDTABS:扩展制表符,每个制表符的缺省字符数是8。

    DT_EXTERNALLEADING:在行的高度里包含字体的外部标头,通常,外部标头不被包含在正文行的高度里。

    DT_INTERNAL:用系统字体来计算正文度量。

    DT_LEFT:正文左对齐。

    DT_MODIFYSTRING:修改给定的字符串来匹配显示的正文,此标志必须和DT_END_ELLIPSIS或DT_PATH_ELLIPSIS同时使用。

   DT_NOCLIP:无裁剪绘制当DT_NOCLIP使用时DrawText的使用会有所加快。

    DT_NOPREFIX:关闭前缀字符的处理,通常DrawText解释助记前缀字符,&为给其后的字符加下划线,解释&&为显示单个&。指定DT_NOPREFIX,这种处理被关闭。

    DT_RIGHT:正文右对齐。

    DT_RTLREADING:当选择进设备环境的字体是Hebrew或Arabicf时,为双向正文安排从右到左的阅读顺序都是从左到右的。

    DT_SINGLELINE:显示正文的同一行,回车和换行符都不能折行。

    DT_TABSTOP:设置制表,参数uFormat的15"C8位(低位字中的高位字节)指定每个制表符的字符数,每个制表符的缺省字符数是8。

    DT_TOP:正文顶端对齐(仅对单行)。DT_VCENTER:正文水平居中(仅对单行)。

    DT_WORDBREAK:断开字。当一行中的字符将会延伸到由lpRect指定的矩形的边框时,此行自动地在字之间断开。一个回车一换行也能使行折断。

    DT_WORD_ELLIPSIS:截短不符合矩形的正文,并增加椭圆。

    注意:DT_CALCRECT, DT_EXTERNALLEADING, DT_INTERNAL, DT_NOCLIP, DT_NOPREFIX值不能和DT_TABSTOP值一起使用。

    返回值:如果函数调用成功,返回值是正文的高度;如果函数调用失败,返回值是0。

    Windows NT:若想获得更多错误信息,请调用GetLastError函数。

    备注:函数DrawText用设备环境中的字体选择、正文颜色和背景颜色来写正文,除非DT_NOCLIP被使用,DrawText裁剪正文,所以它不会出现在指定矩形的外面,除DT_SINGLELINE格式化,其余的格式都认为正文有多行。

    如果选择的字体对指定的矩形而言太大,DrawText不会试图去换成一种小字体。

    Windows CE:如果为参数uFormat指定DT_CALCRECT值,必须为lpRect指向的RECT结构设置right和bottom成员。Windows CE不支持uFormat为DT_EXTERNALLEADING。

你可能感兴趣的:(DrawText如何使多行文字居中)