03绘图2文字与图像.docx
- 文档编号:24041077
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:56
- 大小:1.11MB
03绘图2文字与图像.docx
《03绘图2文字与图像.docx》由会员分享,可在线阅读,更多相关《03绘图2文字与图像.docx(56页珍藏版)》请在冰豆网上搜索。
03绘图2文字与图像
3.6输出文本
1.文本输出函数
在CDC类中,封装了多种文本输出函数,它们都是使用当前的字体、文本颜色和背景颜色,在屏幕或打印机上输出文本(绘制文字)。
常用的文本输出函数有TextOut、DrawText和ExtTextOut:
1)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
virtualintDrawText(LPCTSTRlpszString,intnCount,LPRECTlpRect,UINTnFormat);
intDrawText(constCString&str,LPRECTlpRect,UINTnFormat);
其中,lpszString或str为要显示的文本串,nCount为串lpszString中的字符数,lpRect为指定的显示区域,nFormat为显示格式,可取下列的或组合:
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
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时使用缺省间距)
2.文本对齐
可用CDC类的SetTextAlign函数来设置TextOut和ExtTextOut显示文本时的对齐方式:
UINTSetTextAlign(UINTnFlags);
文本对齐标志nFlags的取值
符号常量
含义
TA_BASELINE
基线对齐
TA_BOTTOM
底对齐
TA_CENTER
居中显示文本
TA_LEFT
居左显示文本(缺省值)
TA_NOUPDATE
不更新当前位置
TA_RIGHT
居右显示文本
TA_TOP
顶对齐(缺省值)
TA_UPDATE
更新当前位置
这些标志可以用位或“|”来组合。
例如:
(其中的w和h分别为客户区的宽和高)
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"这是右下角");
3.设置文本颜色
在3.3中已经讲过,可使用CDC类的成员函数SetTextColor和SetBkColor来分别设置输出文本的前景色和背景色(缺省的前景色为黑色,背景色空):
virtualCOLORREFSetTextColor(COLORREFcrColor);
virtualCOLORREFSetBkColor(COLORREFcrColor);
例如:
pDC->SetTextColor(textColor);
pDC->SetBkColor(textBklColor);
3.7字体
为了能选用不同的字体和大小来输出文本串,必须学习和使用作为GDI对象的CFont类。
Windows和常用的字处理软件(如Word)、绘图软件(如CorelDraw)等应用软件会提供多种与设备无关的字体,主要是TrueType轮廓字体。
1.CFont类
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);
其中CreatePointFont提供了创建字体的一种简单方法:
●nPointSize为字体的大小,以0.1点(像素/墨点/磅数)为单位。
汉字的字号与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
●lpszFaceName为字体名称字符串的指针
●若pDC非空,则系统会将设备单位点自动转换为pDC中的映射模式所指定的逻辑单位
如
CFontfont;
font.CreatePointFont(105,L"宋体");
注意:
CFont类的这些逻辑字体创建函数,并不是从无到有创建一个新的GDI字体,而只是从GDI的物理字体库中选择与所设置参数最匹配的字体。
CreateFont函数的参数很多,可以参看下面的LOGFONT结构中的对应字段。
例如:
nOrientation为每个字符的底线与水平线的夹角(单位为0.1度)。
汉字的字号与磅数
输出上面不同尺寸字体的字符串的函数为:
voidCMFCDrawView:
:
OnTextSize()
{
intfs[16]={420,360,260,240,220,180,160,150,140,120,105,90,75,65,55,50};
CDC*pDC=GetDC();
wchar_tbuf[40];
CStringno;
inty=0,size;
for(inti=0;i<16;i++){
size=fs[i];
SetFont(pDC,fontName,size,textColor,0,italic,bold,underline,strikeOut);
no=GetFontNumber(size);
swprintf_s(buf,40,L"这是%s%s字(%g磅)",fontName,no,size/10.0);
pDC->TextOut(0,y,buf);
y+=fs[i]/6;
}
ReleaseDC(pDC);
}
其中用到了将字体大小fontSize转换为中文字号sFontNum的自定义函数:
CStringCDrawView:
:
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"未知";
}
另一个设置字体的函数SetFont将在下面的第3小节介绍。
2)逻辑字体结构
字体创建函数CreateFontIndirect和CreatePointFontIndirect中所使用的逻辑字体结构之定义为(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为粗),可取下列符号常量:
符号常量值
磅数
FW_DONTCARE
0
FW_THIN
100
FW_EXTRALIGHT
200
FW_LIGHT
300
FW_NORMAL
400
FW_MEDIUM
500
FW_SEMIBOLD
600
FW_BOLD
700
FW_EXTRABOLD
800
FW_HEAVY
900
●lfCharSet可取预定义的字符集符号常量,常用的有:
ANSI_CHARSET//=0
CHINESEBIG5_CHARSET//=136
DEFAULT_CHARSET//=1
GB2312_CHARSET//=134
CHINESE//=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
可以用“或|”将间距常量与家族常量组合使用。
3)获取逻辑字体结构
可以先用CDC的成员函数
CFont*GetCurrentFont()const;
得到当前设备上下文的字体对象,然后再用CFont的成员函数GetLogFont来得到字体对象逻辑字体结构
intGetLogFont(LOGFONT*pLogFont);
如:
CFont*pFont=pDC->GetCurrentFont();
LOGFONTlogFont;
pFont->GetLogFont(&logFont);
例如,缺省的系统字体的逻辑字体结构的数据成员取值为
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"
2.字体公用对话框
为了方便用户选择各种字体参数,可使用字体公用对话框:
字体公用对话框
使用字体公用对话框需要用到CFontDialog类。
CFontDialog类的构造函数为
CFontDialog(LPLOGFONTlplfInitial=NULL,DWORDdwFlags=CF_EFFECTS|CF_SCREENFONTS,CDC*pdcPrinter=NULL,CWnd*pParentWnd=NULL);
其中,lplfInitial为上面所讲的逻辑字体结构的指针,dwFlags为对话框的可选参数,CF_EFFECTS表示对话框中有删除线和下划线复选框与选择颜色的下拉式组合框,CF_SCREENFONTS则使得对话框中只列出系统支持的显示字体。
如果设置了CF_EFFECTS标志,还可以用字体公用对话框的公共数据成员m_cf结构的rgbColors域,来初始化(和获取)字体的颜色(不过只能为16种系统颜色之一,否则会显示为黑色)。
例如:
fontDlg.m_cf.rgbColors=textColor;
CFontDialog类的常用成员函数有:
virtualintDoModal();//显示对话框,返回IDOK或IDCANCEL
voidGetCurrentFont(LPLOGFONTlplf);//返回当前逻辑字体结构到lplf
CStringGetFaceName()const;//返回字体名称串
CStringGetStyleName()const;//返回字体风格名称串
intGetSize()const;//返回所选择的字体大小,以0.1点为单位
intGetWeight()const;//返回字体的磅数
COLORREFGetColor()const;//返回所选择的字体颜色
BOOLIsStrikeOut()const;//若选中了删除线,则返回TRUE
BOOLIsUnderline()const;//若选中了下划线,则返回TRUE
BOOLIsBold()const;//若选中了粗体或粗斜体,则返回TRUE
BOOLIsItalic()const;//若选中了斜体或粗斜体,则返回TRUE
3.字体的选择与使用
若只是按名称和大小来创建字体,可直接使用CFont类的成员函数CreatePointFont。
若还要设置字体粗细、下划线、斜体等,则需要自己编写一个函数SetFont来使用,很多参数都可以用缺省值,如
定义类变量LOGFONTlogFont;在构造函数中初始化:
CDrawView:
:
CDrawView(){
......
CFontfont;
font.CreatePointFont(120,L"宋体");
font.GetLogFont(&logFont);
}
SetFont函数的原型:
BOOLSetFont(CDC*pDC,LPCTSTRfaceName,intsize,
COLORREFcol=RGB(0,0,0),intangle=0,BOOLitalic=FALSE,
BOOLbold=FALSE,BOOLunderline=FALSE,BOOLstrikeOut=FALSE);
SetFont函数的函数体:
BOOLCDrawView:
:
SetFont(CDC*pDC,LPCTSTRname,intsize,COLORREFcol,
intangle,BOOLitalic,BOOLbold,BOOLunderline,BOOLstrikeOut){
intheight=-MulDiv(size,pDC->GetDeviceCaps(LOGPIXELSY),720);
CFontfont;
BOOLbOk=font.CreateFont(height,0,angle,angle,bold?
700:
400,italic,
underline,strikeOut,DEFAULT_CHARSET,
OUT_DEFAULT
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 03 绘图 文字 图像
![提示](https://static.bdocx.com/images/bang_tan.gif)