windows编程技术09GDI编程2文字位图与图标.docx

上传人:b****9 文档编号:23322254 上传时间:2023-05-16 格式:DOCX 页数:71 大小:2.21MB
下载 相关 举报
windows编程技术09GDI编程2文字位图与图标.docx_第1页
第1页 / 共71页
windows编程技术09GDI编程2文字位图与图标.docx_第2页
第2页 / 共71页
windows编程技术09GDI编程2文字位图与图标.docx_第3页
第3页 / 共71页
windows编程技术09GDI编程2文字位图与图标.docx_第4页
第4页 / 共71页
windows编程技术09GDI编程2文字位图与图标.docx_第5页
第5页 / 共71页
点击查看更多>>
下载资源
资源描述

windows编程技术09GDI编程2文字位图与图标.docx

《windows编程技术09GDI编程2文字位图与图标.docx》由会员分享,可在线阅读,更多相关《windows编程技术09GDI编程2文字位图与图标.docx(71页珍藏版)》请在冰豆网上搜索。

windows编程技术09GDI编程2文字位图与图标.docx

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

第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.TextOut

TextOut的函数原型为:

virtualBOOLTextOut(intx,inty,LPCTSTRlpszString,intnCount);

BOOLTextOut(intx,inty,constCString&str);

其中,x与y为显示串的左上角坐标,lpszString或str为要显示的文本串,nCount为串lpszString中的字符数。

例如:

pDC->TextOut(10,30,L"Testtext");

2.DrawText

DrawText的函数原型为:

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.ExtTextOut

ExtTextOut的函数原型为:

virtualBOOLExtTextOut(intx,inty,UINTnOptions,LPCRECTlpRect,

LPCTSTRlpszString,UINTnCount,LPINTlpDxWidths);

BOOLExtTextOut(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"这是右下角");

图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类的字体创建成员函数的原型有:

BOOLCreateFont(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为字体名称字符串的指针,常用的中文字体名有:

宋体、仿宋、楷体、黑体、隶书、幼圆等,常用的英文字体名有:

TimesNewRoman、ArialNarrow和CourierNew等,参见图9-3。

表9-3汉字字号与nPointSize值及磅数的对应关系

汉字字号

nPointSize值

磅数

汉字字号

nPointSize值

磅数

初号

420

42

四号

140

14

小初

360

36

小四

120

12

一号

260

26

五号

105

10.5

小一

240

24

小五

90

9

二号

220

22

六号

75

7.5

小二

180

18

小六

65

6.5

三号

160

16

七号

55

5.5

小三

150

15

八号

50

5

图9-2汉字的字号与磅数

图9-3常用的中英文字体

例如:

CFontfont;//定义字体对象

font.CreatePointFont(105,L"宋体");//创建5号宋体字

下面是输出如图9-2的不同大小字符串的OnDraw函数(可以创建一个采用传统界面的单文档MFC应用程序项目Font):

voidCFontView:

:

OnDraw(CDC*pDC)

{

//……

CFontfont,*pOldFont;//定义字体对象和指针

intiSize,y=0;//定义字体大小变量和垂直坐标变量

//定义对应于汉字字号的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;i<16;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"三号";

case150:

returnL"小三";

case140:

returnL"四号";

case120:

returnL"小四";

case105:

returnL"五号";

case90:

returnL"小五";

case75:

returnL"六号";

case65:

returnL"小六";

case55:

returnL"七号";

case50:

returnL"八号";

}

returnL"未知";

}

还需要在视图类的头文件中,添加此函数的原型:

CStringGetFontNumber(intsize);

下面的代码段的输出对应于图9-3:

CFontfont,*pOldFont;

CStringfontNames[]={L"宋体",L"仿宋",L"楷体",

L"黑体",L"隶书",L"幼圆",L"TimesNewRoman",

L"ArialNarrow",L"CourierNew"};

intsize=240,x=0,y=0;

for(inti=0;i<9;i++){

font.CreatePointFont(size,fontNames[i]);

pOldFont=pDC->SelectObject(&font);

pDC->TextOut(x,y,fontNames[i]);

pDC->SelectObject(pOldFont);

font.DeleteObject();

x+=size*1.2;

if((i+1)%3==0){x=0;y+=size/6;}

}

2.逻辑字体结构

字体间接创建函数CreateFontIndirect和CreatePointFontIndirect中所使用的逻辑字体结构LOGFONT的定义为(wingdi.h):

typedefstructtagLOGFONT{//lf

LONGlfHeight;//字体的逻辑高度

LONGlfWidth;//字体平均宽度的逻辑值

LONGlfEscapement;//字符串底线与水平线的夹角(单位为0.1度)

LONGlfOrientation;//每个字符的底线与水平线的夹角(单位为0.1度)

LONGlfWeight;//字体的粗细(磅数=每1000点中所含的像素/墨点数),

BYTElfItalic;//TRUE则字体为斜体字

BYTElfUnderline;//TRUE则字体带下划线

BYTElfStrikeOut;//TRUE则字体带删除线

BYTElfCharSet;//字符集

BYTElfOutPrecision;//输出字体的精度

BYTElfClipPrecision;//输出时字体被裁剪的精度

BYTElfQuality;//输出质量

BYTElfPitchAndFamily;//字符间距与字体家族

WCHARlfFaceName[LF_FACESIZE];//字体名称

}LOGFONTW;

typedefLOGFONTWLOGFONT;

下面是该结构中的各个参数的含义及取值:

●lfHeight

⏹>0时,高度被转化为设备单位,大小相对于字体的网格高度。

⏹=0时,使用合理的默认高度。

⏹<0时,高度被转化为设备单位,大小相对于字体的字符高度。

例如,对MM_TEXT映射模式,若字体的点尺寸为nPointSize,则可取

lfHeight=-MulDiv(nPointSize,pDC->GetDeviceCaps(LOGPIXELSY),720);

其中,MulDiv将前两个32位整数相乘得一个64位整数,然后再除以第3个32位整数,而函数GetDeviceCaps可用来获得各种显示设备的信息,LOGPIXELSY指垂直方向上每逻辑英寸所含的像素数。

●lfWidth字体平均宽度的逻辑值,为0时,会自动选择一个与高度最匹配的值。

●lfWeight的单位为千分比,取值范围为0(全白)~1000(全黑),0为默认粗细、400为正常、700为粗体,可取表9-4中列出的符号常量。

表9-4字体粗细lfWeight的取值

符号常量

磅数

符号常量

磅数

FW_DONTCARE

0

FW_MEDIUM

500

FW_THIN

100

FW_SEMIBOLD

600

FW_EXTRALIGHT

200

FW_BOLD

700

FW_LIGHT

300

FW_EXTRABOLD

800

FW_NORMAL

400

FW_HEAVY

900

●lfCharSet可取预定义的字符集符号常量,常用的有:

ANSI_CHARSET//=0

CHINESEBIG5_CHARSET//=136

DEFAULT_CHARSET//=1

GB2312_CHARSET//=134(默认)

OEM_CHARSET//=255

SYMBOL_CHARSET//=2

●lfOutPrecision决定输出的字体与所设定的各种参数的匹配方式,可取下列符号常量值:

OUT_DEFAULT_PRECIS//=0默认精度

OUT_DEVICE_PRECIS//=5选择同名字体中的设备字体匹配

OUT_OUTLINE_PRECIS//=8选择轮廓字体匹配

OUT_RASTER_PRECIS//=6选择同名字体中的光栅字体匹配

OUT_STRING_PRECIS//=1只在获取时返回:

光栅字体

OUT_STROKE_PRECIS//=3Win95:

选矢量字体;Win95/NT:

只在获取时返回:

TrueType、轮廓或矢量字体

OUT_TT_ONLY_PRECIS//=7只选择TrueTyope字体匹配,若没有则采用默认

OUT_TT_PRECIS//=4选择同名字体中的TrueTyope字体匹配

●lfClipPrecision决定如何裁剪超出剪裁区的字体,可取下列符号常量值:

CLIP_DEFAULT_PRECIS//=0默认精度

CLIP_STROKE_PRECIS//=2只在获取时返回:

光栅、矢量或TrueType字体

●lfQuality可取下列符号常量值:

CLIP_DEFAULT_PRECIS//=0默认质量

DRAFT_QUALITY//=1草稿质量

PROOF_QUALITY//=2校样质量

●lfPitchAndFamily中的字符间距(pitch)占字节的低2位,可取下列符号常量值:

DEFAULT_PITCH//=0默认间距

FIXED_PITCH//=1固定间距

VARIABLE_PITCH//=2可变间距

字体家族(family)占字节的4~7位,可取下列符号常量值:

FF_DECORATIVE//=5<<4装饰性新奇字体,如OldEnglish

FF_DONTCARE//=0<<4不关心或不知道

FF_MODERN//=3<<4等宽字体,有或无衬线,如Pica、Elite和CourierNew®

FF_ROMAN//=1<<4罗马字体,变宽、有衬线,如MS®Serif

FF_SCRIPT//=4<<4手迹字体,看上去向是手写体,如Script和Cursive

FF_SWISS//=2<<4瑞士字体,变宽、无衬线,如MS®SansSerif

可以用位或“|”将间距常量与家族常量组合使用。

默认的系统字体的逻辑字体结构的数据成员取值为:

lfHeight16

lfWidth7

lfEscapement0

lfOrientation0

lfWeight700=FW_BOLD//粗字体

lfItalic0=FALSE

lfUnderline0=FALSE

lfStrikeOut0=FALSE

lfCharSet134=CHINESE

lfOutPrecision1=OUT_STRING_PRECIS//光栅字体

lfClipPrecision2=CLIP_STROKE_PRECIS//光栅、矢量或TrueType字体

lfQuality2=PROOF_QUALITY//校样质量

lfPitchAndFamily0x22=VARIABLE_PITCH|FF_SWISS//可变间距、变宽/无衬线字体

lfFaceName“System”//一般中文对应于“宋体”、西文对应于“TimesNewRoman”

3.获取逻辑字体结构

可先用CDC的成员函数GetCurrentFont得到当前DC中的字体对象,然后再用CFont的成员函数GetLogFont来获取字体对象的逻辑字体结构:

CFont*GetCurrentFont()const;

intGetLogFont(LOGFONT*pLogFont);

例如:

CFont*pFont=pDC-

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1