自绘控件时.经常会绘制文本.绘制文本在GDI中已经有了很好的支持.
最常用的是两个函数:
◆ TextOut
virtual BOOL TextOut(int x ,int y ,LPCSTR lpszString ,int nCount );
BOOL TextOut(int x ,int y ,const CString& str);
这个函数功能很简单,就是绘制一个文本串.x,y就是起始点.
默认是左对齐文本输出格式.换句话说就是:如果文本很长(超过了显示区域),那么后面的都将会截断.
可以使用SetTextAlign来指定文本的对齐方式.
重点介绍下面这个函数;
◆ DrawText:
virtual int DrawText(LPCTSTR lpszString, int nCount, LPRECT lpRect, UINT nFormat);
int DrawText(const CString& str, LPRECT lpRect, UNIT nFormat);
这个函数主要提供的功能是在某个区域内绘制文本.
首先这个函数除了TextOut所能绘制的文本样式中,增加了CRect,主要做的操作就是限定文本绘制区域.换句话说,如果文本的长度超过绘制区域,那么它将截断.
除此之外它还增加一个nFormat,这个标志用来告诉系统,应该以什么方式来绘制(左对齐?单行?多行?...)
我这里重点讨论的问题就是,如何将某一文本完整的绘制在某个区域内(当然这个区域一定要能包含这串文本).这里说的不是很清楚.我们还是来看例子吧.
现在我想输出如下所示的文本:
程序所要做的事情有以下几点:
● 如何设置文本多行(这个比较简单)
● 如何计算文本的宽度和高度
我们可以利用DT_LEFT|DT_WORDBREAK来使得文本左对齐,并且多行显示.
现在,我们绘制的区域大小宽度是固定的.我们假设就是文本的1/3.
现在我们关键是第二个问题,如何计算文本的宽度和高度.我们可以有两中方式:
1. 使用GetTextMetrics 来获取单个字符宽度和单个字符的宽度.
2. 使用GetTextExtent 来获取整行文本的长度和高度.
需要指出的是,前者在获取的时候只能是平均值,这个值适合在英文状态下的文本输出.对中文,可能就不会准确.
后者的话,相对来说对中文的支持更好些.我们就通过它来获取文本的高度和宽度属性吧.
整个绘制过程如下所示:
CPaintDC dc(this); // 用于绘制的设备上下文
CString str1= _T("如果向对话框添加最小化按钮,则需要下面的代码来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,这将由框架自动完成。");
CString str2 = _T("OnPaint");
CFont font;
font.CreateFont( 15,0,0,0,0,0,0,0,0,0,0,0,0,_T("宋体") );
CFont* pOldFont = dc.SelectObject( &font );
dc.SetBkMode( TRANSPARENT );
CSize sz = dc.GetTextExtent( str1 );
dc.DrawText( str1,CRect( 0,100,sz.cx /3,sz.cy * 3 + 100 ),DT_LEFT|DT_WORDBREAK );
dc.SelectObject( pOldFont );