关于绘制文本详细论述

自绘控件时.经常会绘制文本.绘制文本在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 );

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值