windows编程技术09GDI编程2文字位图与图标.docx
- 文档编号:23322254
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:71
- 大小:2.21MB
windows编程技术09GDI编程2文字位图与图标.docx
《windows编程技术09GDI编程2文字位图与图标.docx》由会员分享,可在线阅读,更多相关《windows编程技术09GDI编程2文字位图与图标.docx(71页珍藏版)》请在冰豆网上搜索。
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-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- windows 编程 技术 09 GDI 文字 位图 图标