windows编程技术09GDI编程2―文字、位图与图标

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1第9章GDI编程2—文字、位图与图标与DOS等传统字符界面用点阵模板显示文字不同,GUI中的文字一般是利用轮廓字体中的控制点数据经计算后再绘制出来的。Windows中的文字,采用的是基于二次贝塞尔曲线的TrueType轮廓字体(字体文件为*.TTF)。MFC中的字体类为CFont,字体对象选入DC后,再用于TextOut等函数的文字绘制输出。位图是指由像素阵列组成的数字化点阵图像,是GUI的基本元素。位图可分成与设备相关和无关的两类,分别用于图像的显示和存储,对应的MFC类分别为CBitmap和CImage。图标是一类大小固定的方型小位图,用于代表应用程序或文档子窗口。为了满足不同显示设备和不同使用目的的需要,在一个程序的图标资源中,一般包含多个不同大小和位数的图像。MFC为应用程序提供了默认的图标,可用资源编辑器对其进行修改。9.1输出文本一般使用CDC类的TextOut等函数,采用DC中的当前字体和文本颜色等来输出文本。还可以用SetTextAlign函数来设置文本的对齐方式,用SetTextColor和SetBkColor函数来分别设置文本的前景和背景颜色。9.1.1文本输出函数在CDC类中,封装了多种文本输出函数,它们都是使用当前的字体、文本颜色和背景颜色,在屏幕或打印机上输出文本(绘制文字)。常用的文本输出函数有基本的TextOut、矩形区域的DrawText和可裁减和调字间距的扩展的ExtTextOut。1.TextOutTextOut的函数原型为:virtualBOOLTextOut(intx,inty,LPCTSTRlpszString,intnCount);BOOLTextOut(intx,inty,constCString&str);其中,x与y为显示串的左上角坐标,lpszString或str为要显示的文本串,nCount为串lpszString2中的字符数。例如:pDC-TextOut(10,30,LTesttext);2.DrawTextDrawText的函数原型为:virtualintDrawText(LPCTSTRlpszString,intnCount,LPRECTlpRect,UINTnFormat);intDrawText(constCString&str,LPRECTlpRect,UINTnFormat);其中,lpszString或str为要显示的文本串,nCount为串lpszString中的字符数,lpRect为指定的显示区域,nFormat为显示格式,可取表9-1中值的位或“|”组合。表9-1文本显示格式nFormat的常用取值符号常量含义DT_BOTTOM文本底对齐,必需与DT_SINGLELINE.同时使用DT_CALCRECT计算并调整矩形的宽与高DT_CENTER水平居中显示文本DT_EXPANDTABS扩展Tab字符(默认为8个字符宽)DT_LEFT居左显示文本DT_NOCLIP不剪裁(可提高显示速度)DT_NOPREFIX终止对表示加下划线的前缀字符&的处理DT_RIGHT居右显示文本DT_SINGLELINE单行显示文本,忽略回车和换行符DT_TABSTOP设置Tab的字符位数,该数放在nFormat的高位字节中DT_TOP文本顶对齐,必需与DT_SINGLELINE.同时使用DT_VCENTER垂直居中显示文本DT_WORDBREAK文本行超过矩形区域的宽时换行3.ExtTextOutExtTextOut的函数原型为:virtualBOOLExtTextOut(intx,inty,UINTnOptions,LPCRECTlpRect,LPCTSTRlpszString,UINTnCount,LPINTlpDxWidths);3BOOLExtTextOut(intx,inty,UINTnOptions,LPCRECTlpRect,constCString&str,LPINTlpDxWidths);其中,nOptions可为ETO_CLIPPED(裁剪)/ETO_OPAQUE(不透明),lpRect为裁剪矩形(可为NULL),lpDxWidths指定字符的间距(为NULL时使用默认间距)。9.1.2设置文本对齐可用CDC类的SetTextAlign函数来设置TextOut和ExtTextOut输出文本时的对齐方式:UINTSetTextAlign(UINTnFlags);其中,nFlags可为表9-2中值的位或“|”组合,默认的文本对齐方式为“左顶”即“TA_LEFT|TA_TOP”。表9-2文本对齐标志nFlags的取值符号常量含义符号常量含义TA_BASELINE基线对齐TA_NOUPDATE不更新当前位置TA_BOTTOM底对齐TA_RIGHT居右显示文本TA_CENTER居中显示文本TA_TOP顶对齐(默认值)TA_LEFT居左显示文本(默认值)TA_UPDATE更新当前位置例如(输出见图9-1):RECTrect;GetClientRect(&rect);intw=rect.right,h=rect.bottom;pDC-TextOut(10,10,L这是左上角);//默认为“TA_LEFT|TA_TOP”pDC-SetTextAlign(TA_CENTER);pDC-TextOut(w/2,10,L这是顶部中央);pDC-SetTextAlign(TA_RIGHT);pDC-TextOut(w-10,10,L这是右上角);pDC-SetTextAlign(TA_BOTTOM);pDC-TextOut(10,h-10,L这是左下角);pDC-SetTextAlign(TA_BOTTOM|TA_RIGHT);pDC-TextOut(w-10,h-10,L这是右下角);4图9-1文本对齐例的输出9.1.3设置文本颜色在8.3.5中已经讲过,可使用CDC类的成员函数SetTextColor和SetBkColor来分别设置输出文本的前景色和背景色(默认的文本前景色为黑色、背景色为白):virtualCOLORREFSetTextColor(COLORREFcrColor);virtualCOLORREFSetBkColor(COLORREFcrColor);例如:pDC-SetTextColor(RGB(255,0,0));pDC-SetBkColor(RGB(0,0,128));9.2字体为了能使用不同的字体和大小来输出文本串,必须使用作为GDI对象的CFont类。Windows和常用的字处理软件(如Word)和绘图软件(如CorelDraw)等应用软件会提供多种与设备无关的字体,主要是TrueType类型的轮廓字体。9.2.1CFont类CFont类是CGDIObject的派生类:CObject→CGDIObject→CFont。只有一个默认构造函数CFont();必须用字体创建成员函数CreateFont[Indirect]或CreatePointFont[Indirect]来进行初始化。1.字体创建函数CFont类的字体创建成员函数的原型有:5BOOLCreateFont(intnHeight,intnWidth,intnEscapement,intnOrientation,intnWeight,BYTEbItalic,BYTEbUnderline,BYTEcStrikeOut,BYTEnCharSet,BYTEnOutPrecision,BYTEnClipPrecision,BYTEnQuality,BYTEnPitchAndFamily,LPCTSTRlpszFaceName);BOOLCreateFontIndirect(constLOGFONT*lpLogFont);BOOLCreatePointFont(intnPointSize,LPCTSTRlpszFaceName,CDC*pDC=NULL);BOOLCreatePointFontIndirect(constLOGFONT*lpLogFont,CDC*pDC=NULL);注意:CFont类的这些逻辑字体创建函数,并不是从无到有创建一个全新的GDI字体,而只是从Windows的物理字体库中选择一个与所设置参数最匹配的字体。在这些字体创建函数中,CreateFont的参数有很多,与下面要讨论的逻辑字体结构LOGFONT中字段相对应。而CreatePointFont函数则提供了创建字体的一种简单方法,一般只需提供字体的大小和名称两个参数:nPointSize为字体大小,以0.1点(像素/墨点/磅数)为单位。汉字的字号与nPointSize值及磅数的对应关系见表9-3和图9-2,图书和文献的正文一般为5号宋体字。另外,若pDC非空,则系统会将设备单位点自动转换为pDC中的映射模式所指定的逻辑单位。lpszFaceName为字体名称字符串的指针,常用的中文字体名有:宋体、仿宋_GB2312、楷体_GB2312、黑体、隶书、幼圆等,常用的英文字体名有:TimesNewRoman、ArialNarrow和CourierNew等,参见图9-3。表9-3汉字字号与nPointSize值及磅数的对应关系汉字字号nPointSize值磅数汉字字号nPointSize值磅数初号42042四号14014小初36036小四12012一号26026五号10510.5小一24024小五909二号22022六号757.5小二18018小六656.5三号16016七号555.5小三15015八号5056图9-2汉字的字号与磅数图9-3常用的中英文字体例如:CFontfont;//定义字体对象font.CreatePointFont(105,L宋体);//创建5号宋体字下面是输出如图9-2的不同大小字符串的OnDraw函数(可以创建一个采用传统界面的单文档MFC应用程序项目Font):voidCFontView::OnDraw(CDC*pDC){//……CFontfont,*pOldFont;//定义字体对象和指针intiSize,y=0;//定义字体大小变量和垂直坐标变量7//定义对应于汉字字号的nPointSize值数组intfs[16]={420,360,260,240,220,180,160,150,140,120,105,90,75,65,55,50};wchar_tbuf[40];//定义字符串缓冲区//定义字号与字体名称的字符串对象CStringsFontNum,sFontName=L宋体;for(inti=0;i16;i++){//字号循环iSize=fs[i];//获取当前字号的nPointSize值font.CreatePointFont(iSize,sFontName);//创建字体对象pOldFont=pDC-SelectObject(&font);//选入字体对象sFontNum=GetFontNumber(iSize);//获取当前字号swprintf_s(buf,40,L这是%s%s字(%g磅),sFontName,sFontNum,iSize/10.0);//生成输出的字符串pDC-TextOut(0,y,buf);//输出字符串pDC-SelectObject(pOldFont);//选出字体font.DeleteObject();//删除字体对象y+=fs[i]/6;//更新y值}}其中用到了将字体大小iSize转换为中文字号串sFontNum的自定义函数GetFontNumber:CStringCFontView::GetFontNumber(intsize){switch(size){case420:returnL初号;case360:returnL小初;case260:returnL一号;case240:returnL小一;case220:returnL二号;case180:returnL小二;case160:returnL三号;cas

1 / 57
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功