第5章 图形与文本输出
5.2.4 格式化文本
Windows系统不参与窗口客户区的管理,这就意味着在客户区内输出文本,应用程序必须管理换行,后继字符的位置等输出格式。由于文本字符串的间隔不仅取决于由用户指定的字体,而且取决于目标设备的分辨率,因此在绘制任何文本之前,需要计算文本坐标。CDC类提供了如下表所示的文本测量函数。
表5-4 文本测量函数
函 数 GetTextExtent GetTextMetrics 说 明 当选用当前嵌入DC中的字体绘图时,获得给定字符串将占据的空间宽度和高度 为当前选入DC的字体获取类型为TEXTMETRIC的数据,此数据结构中包含基本的字体测量信息
字体测量函数的使用的场合通常有: 1. 确定后继文本坐标
在很多场合单行文本需要分离成多次输出,即多次调用TextOut()。例如在蓝色文本的后边显示红色文本,或者是在同一行文本上使用字体。这时需要计算下一个字符串的位置,使用GetTextExtent()函数可以获得所选字体中的字符串的宽度和高度,函数的格式如下:
CSize GetTextExtent(LPCTSTR lpszString, int nCount)
其中:lpszString是字符串的指针,nCount是所包括的字符数。返回值CSize是包含两个成员的结构:cx是字符串的宽度,cy是字符串的高度。
下面给出了一个使用GetTextExtent()函数的实例。运行效果如图5-6所示,实现代码如程序清单5-9所示。其中GetLength()函数是CString类的成员函数,返回字符串的长度。
图5-6 设置字体效果
程序清单5-9:在视图中输出一行使用两种颜色的文本 void CExam5View::OnDraw(CDC* pDC) { CExam5Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here int x,y; x=150;
11
VC++6简明教程
y=100; CString strHello=\ CString strVc=\ //输出第一个蓝色字符串 pDC->SetTextColor (RGB(0,0,255)); pDC->TextOut (x,y,strHello); //取得第一个字符串的像素长度
CSize strSize=pDC->GetTextExtent (strHello,strHello.GetLength ()); //设定第二个字符串的输出位置X坐标 x+=strSize.cx;
// 输出第二个绿色字符串 pDC->SetTextColor (RGB(0,255,0)); pDC->TextOut (x,y,strVc); }
2. 确定换行时文本坐标
GetTextMetric()函数用来计算涉及确定两行文本之间的间隔。当然你可以使用GetTextExtent()函数的返回值中的字符串的高度来决定两行文本之间的间隔,但这种方式并不精确。文本中行之间的间隔包括两部分:字符单元高度和外部行距大小。这两部分内容都包含在TEXTMETRIC数据结构中。调用GetTextMetric()函数可以获得当前字体的TEXTMETRIC结构的内容,并计算文本行间隔方式如下:
TEXTMETRIC tm;
pDC->GetTextMetrics(&tm);
int LineHeight=tm.tmHeight+tm.tmExternalLeading ; 数据类型TEXTMETRIC的定义和图示如下:
typedef struct tagTEXTMETRIC {/* tm */
int tmHeight; int tmAscent; int tmDescent;
int tmInternalLeading; int tmExternalLeading; int tmAveCharWidth; int tmMaxCharWidth; int tmWeight; BYTE tmItalic;
BYTE tmUnderlined;
BYTE tmStruckOut; 图5-7 字体结构图 BYTE tmFirstChar; BYTE tmLastChar; BYTE tmDefaultChar; BYTE tmBreakChar;
BYTE tmPitchAndFamily; BYTE tmCharSet; int tmOverhang;
12
第5章 图形与文本输出
int tmDigitizedAspectX; int tmDigitizedAspectY; } TEXTMETRIC;
5.2.5 文本输出函数
CDC提供了以下几个函数用于文本输出:
表5-5 文本输出函数
函 数 TextOut TabbedTextOut DrawText ExtTextOut 说 明 在屏幕的固定位置用当前设定的颜色、字体、对齐方式输出文本 与TextOut的功能相似,唯一差别是可以为支持制表符而定义一组制表站位置 在一个区域中显示并格式化文本 与TextOut的功能相似,但可以使用该函数删去超出矩形的正文,用正文背景填充矩形,调整字符间隔
TextOut()是最常用的文本输出函数,它的格式:
BOOL CDC::TextOut( int x, int y, const CString& str );
其中:x,y 是输出位置的坐标,str 是要输出的文本串。在输出文本之前,应先设置输出文本串的颜色、字体及对齐方式。
使用DrawText()函数可以在一个指定的区域中输出文本,并且可以在这个区域内进行水平和垂直方向的对齐方式的设置,还可以在一个词中间断开以适应矩形边界。它的格式如下:
int CDC::DrawText ( const CString& str, LPRECT lpRect, UINT nFormat );
函数正确执行后返回文本行的高度,str是输出的文本,lpRect是指定矩形输出区域,nFormat是格式常量。下面给出了一个使用 DrawText()的实例。
程序清单5-10:在视图中使用DrawText在一个矩形区域中水平垂直居中,输出蓝色文本的OnDraw()函数
void CExam5View::OnDraw(CDC* pDC) { CExam5Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here pDC->SetTextColor (RGB(0,0,255)); CRect Rect; Rect.SetRect(100,100,300,300); pDC->Rectangle(Rect); pDC->DrawText (\is a sample of DrawText !\Rect, DT_CENTER| DT_VCENTER|DT_SINGLELINE); }
执行效果如图5-8所示:
13
VC++6简明教程
图5-8 使用DrawText函数
5.2.6 文本输出编程实例
【例5-2】阅读单文档MFC(EXE)程序Exam5_2中处理文本显示的OnDraw()函数。程序执行效果如图5-9所示,请分析,输出的每一行文本串作了哪些文本属性设置、格式设置和字体设置。
图5-9 文本处理实例
程序清单5-11:在视图中处理文本的OnDraw()函数 void CExam5_2View::OnDraw(CDC* pDC) { CExam5_2Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here int y; int x; CString outstr[4];
14
第5章 图形与文本输出
outstr[0]=\第一个紫红色的使用系统字体的文本串\outstr[1]=\第二个黄色黑体文本串\outstr[2]=\第三个蓝色文本串\
outstr[3]=\最后一个大号字,加下划线的斜体文本串\x=0;y=0;
//输出第一行
pDC->SetTextColor (RGB(255,0,255)); pDC->TextOut (x,y,outstr[0]); //输出第二行
TEXTMETRIC tm;
pDC->GetTextMetrics (&tm);
y=y+tm.tmHeight+100*tm.tmExternalLeading ; CFont NewFont1;
NewFont1.CreateFont (30,10,0,0, FW_HEAVY, false,false,false, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, \黑体\CFont *pOldFont;
pOldFont=pDC->SelectObject (&NewFont1); pDC->SetTextColor(RGB(255,255,0)); pDC->TextOut(x,y,outstr[1]); //输出第三个文本串
pDC->GetTextMetrics (&tm); pDC->SetTextColor (RGB(0,0,255));
CSize strSize=pDC->GetTextExtent (outstr[1],outstr[1].GetLength ()); x+=strSize.cx;
pDC->TextOut (x,y,outstr[2]); // 输出第四个文本串
pDC->GetTextMetrics (&tm); x=0;
y=y+tm.tmHeight+20*tm.tmExternalLeading ; CFont NewFont2;
NewFont2.CreateFont (30,0,0,0, FW_NORMAL, true,true,false, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
15
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库VC++6.0入门第五章 图形和文本输出(3)在线全文阅读。
相关推荐: