版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Visual C+第五章文本与字体1内容提要 设置文本的设备环境 文本的输出过程 文本操作实例25.1 设置文本的设备环境 有关基本概念 Windows的显示任何内容 在一定意义上,都可看成借助GDI绘制的图形实体 文本输出 使用预定义好的特殊图形元素字体集 字体 描述文本文字的大小大小、类型类型和外形外形 Windows 系统提供七种基本字体,并允许用户创建新的字体。Windows提供的七种基本字体 ANSI_FIXED ANSI标准的固定宽度的字体 ANSI_VAR ANSI标准的可变宽度的字体 DEFAULT_GUI当前GUI的缺省字体 OEM_FIXED 由标准原设备制造商(OEM)提
2、供 DEVICE_DEFAULT 当前图形设备的字体 SYSTEM_FIXEDWindows的标准固定宽度的字体 SYSTEM Windows提供的可变宽度的字体常作为缺省字体常作为缺省字体 WinWin用它作为系统界面字体用它作为系统界面字体 文本操作要点: 获得字体句柄 设置字体、字符大小、字符颜色等属性; 将这些属性选入设备环境5.1 设置文本的设备环境 选择系统字体的步骤 (1) 定义字体句柄变量: HFONT hF; /hF为字体的句柄 (2) 调函数GetStockObject获得系统字体句柄, 返回系统缺省字体 hF= GetStockObject( ); (3) 调函数Sele
3、ctObject将字体选入设备环境 SelectObject(hdc,hF);65.1 设置文本的设备环境 创建自定义字体CreateFont()函数2022-6-775.1 设置文本的设备环境HFont=CreateFont HFont=CreateFont ( (intint nHeight, nHeight, /字体高度字体高度,0 0采用系统缺省值,使用逻辑单位采用系统缺省值,使用逻辑单位intint nWidth,nWidth,/字体宽度字体宽度,取,取0 0则取最佳高宽比值则取最佳高宽比值intint nEscapementnEscapement, , /每行文字相对于页底的角度,
4、每行文字相对于页底的角度,单位为单位为0.10.1度度intint nOrientationnOrientation, , /每个文字相对于页底的角度,每个文字相对于页底的角度,单位为单位为0.10.1度度intint nWeight nWeight, , /字体粗细度字体粗细度,取值范围为,取值范围为0 010001000DWORDDWORD DwltalicDwltalic, , /若若字体倾斜字体倾斜,则取非零,则取非零DWORDDWORD dwUnderlinedwUnderline, ,/若若带下划线带下划线,则取非零,则取非零DWORDDWORD dwStrikeoutdwStri
5、keout, ,/若若带删除线带删除线,则取非零,则取非零DWORDDWORD dwCharsetdwCharset, , /字体所属字符集字体所属字符集DWORDDWORD dwOutputPrecisiondwOutputPrecision,/,/输出精度,缺省值输出精度,缺省值OUT_DEFAULT_PRECISOUT_DEFAULT_PRECISDWORDDWORD dwClipPrecisiondwClipPrecision, , /剪裁精度,缺省值剪裁精度,缺省值CLIP_DEFAULT_PRECISCLIP_DEFAULT_PRECISDWORDDWORD dwQuality,
6、dwQuality,/输出质量,缺省值输出质量,缺省值DEFAULT_QUALITYDEFAULT_QUALITYDWORDDWORD dwPitchAndFamilydwPitchAndFamily, , /字体的斜度及字体的系列,缺省值字体的斜度及字体的系列,缺省值DEFAUL_PITCHDEFAUL_PITCHDWORDDWORD lpszFacenamelpszFacename /字体名字体名) ); 字符集 character set ANSI_CHARSET BALTIC_CHARSET CHINESEBIG5_CHARSET DEFAULT_CHARSET EASTEUROPE_
7、CHARSET GB2312_CHARSET GREEK_CHARSET HANGUL_CHARSET MAC_CHARSET OEM_CHARSET RUSSIAN_CHARSET SHIFTJIS_CHARSET SYMBOL_CHARSET TURKISH_CHARSET VIETNAMESE_CHARSET8character encodingcharacter map5.1 设置文本的设备环境 设置字体和背景颜色 设置字体颜色函数SetTextColor(hdc,crColor); 设置背景颜色函数SetBkColor(hdc,crColor); 参数数据类型 HDC hdc COL
8、ORREF crColor 5.2 文本的输出过程 文本的输出步骤 获取字体信息 格式化文本 确定后续文本坐标 确定换行时文本坐标 调用函数输出文本5.2 文本的输出过程 获取字体信息 输出文本之前,必须获取字体的信息,如字符高度等,以确定输出格式和下一行字符的位置。 调用GetTextMetrics()获取字体的信息GetTextMetrics (hdc,&tm); tm为TEXTMETRICS结构体,存放字体的信息TEXTMETRICS结构体结构体:typedef struct tagTEXTMETRIC typedef struct tagTEXTMETRIC /tm/tmLON
9、G tmHeight; LONG tmHeight; /字符高度字符高度LONG tmAscent;LONG tmAscent; /字符基线以上高度字符基线以上高度LONG tmDescent; LONG tmDescent; /字符基线以下高度字符基线以下高度LONG tmInternalLeading;LONG tmInternalLeading;/包含在包含在tmHeight值内的垂直大小,通常被一些大写字母上注音符号占据值内的垂直大小,通常被一些大写字母上注音符号占据。 LONG tmExternalLeading;LONG tmExternalLeading;/行间的间隔行间的间隔L
10、ONG tmAveCharWidth;LONG tmAveCharWidth;/平均字符宽度平均字符宽度LONG tmMaxCharWidth;LONG tmMaxCharWidth;/最大字符宽度最大字符宽度LONG tmWeight; LONG tmWeight; /字符的粗细度字符的粗细度LONG tmOverhang;LONG tmOverhang;/合成字体间附加的宽度合成字体间附加的宽度LONG tmDigitizedAspectX; /LONG tmDigitizedAspectX; /为输出设备设计的为输出设备设计的X X轴尺寸轴尺寸LONG tmDigitizedAspect
11、Y; /LONG tmDigitizedAspectY; /为输出设备设计的为输出设备设计的Y Y轴尺寸轴尺寸BCHAR tmFirstChar;BCHAR tmFirstChar;/字体中第一个字符值字体中第一个字符值BCHAR tmLastChar; BCHAR tmLastChar; /字体中最后一个字符值字体中最后一个字符值BCHAR tmDefaultChar; BCHAR tmDefaultChar; /代替不在字体中字符的字符代替不在字体中字符的字符BCHAR tmBreakChar;BCHAR tmBreakChar;/作为分割符的字符作为分割符的字符BYTE tmItalic
12、; BYTE tmItalic; /非非0 0则为斜体则为斜体BYTE tmUnderlined; BYTE tmUnderlined; /非非0 0则表示有下划线则表示有下划线BYTE tmStruckOut; BYTE tmStruckOut; /非非0 0则表示带删除线则表示带删除线BYTE tmPitchAndFamily; BYTE tmPitchAndFamily; /字体间距和字体族字体间距和字体族BYTE tmCharSet; BYTE tmCharSet; /字符集字符集TEXTMETRICTEXTMETRIC5.2 文本的输出过程 格式化文本 确定后续文本坐标 GetTex
13、tExtentPoint32 获取当前的字符串的宽度,并存于SIZE。BooL GetTextExtentPoint32BooL GetTextExtentPoint32( ( HDC hdc,HDC hdc, LPCTSTR lpszString LPCTSTR lpszString,/,/指定的字符串指定的字符串 int nLength, int nLength, /字符串中的字符数字符串中的字符数 LPSIZE lpSizeLPSIZE lpSize /返回加字符串宽度及高度的返回加字符串宽度及高度的SIZESIZE数据结构数据结构的地的地址址) )例如:例如:X轴起始坐标为轴起始坐标为
14、cx0,后续文本起始坐标,后续文本起始坐标cx1为:为:cx1=cx0+size.cx;typedef struct tagSIZE LONG cx; LONG cy; SIZE;5.2 文本的输出过程 格式化文本 确定换行时文本坐标 在tm指向的TEXTMETRICS结构中,存有: 字符高度 tmHeight 行间隔 tmExternalLeading 。 换行时,新一行文本的y坐标的增量值为: cy=tm.tmHeight+tm.tmExternalLeading;5.2 文本的输出过程 文本输出 常用的文本输出函数TextOut,原型如下:BOOL TextOut( HDC hdc, i
15、nt X, int Y, /字符串的起始坐标 LPCTSTR lpstring, /被显示的字符串 int nCount /字符串的字节数); 获取字符串长度int lstrlen(LPCTSTR lpString); 数字转字符串 char itoa (long value, char *str, int radix ); value 要转换的值(整型) str 结果字符串 radix 转换进制数(236) itoa(50,buf,10); int sprintf(char *buffer, const char *format ,argument); #include stdio.h sp
16、rintf(buf,(%d,%d)n,x,y);5.3 文本操作实例GDIFontBasic 在用户窗口上输出几行字符串,每当窗口接收到WM_PAINT消息后,显示的文本都被刷新 源程序:GDIFontBasic2022-6-717/消息处理函数消息处理函数long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam) static long nXChar, nYChar;static
17、long nXChar, nYChar;HDC hDC; /HDC hDC; /定义指向设备上下文的句柄定义指向设备上下文的句柄short x;short x; TEXTMETRIC tm;TEXTMETRIC tm;short LnCount=6;short LnCount=6;PAINTSTRUCT PtStr; /PAINTSTRUCT PtStr; /定义向包含绘图信息的结构变量定义向包含绘图信息的结构变量static char static char * *textbuf=textbuf= This is the First line,This is the First line,T
18、his is the second line,This is the second line,This is the third line,This is the third line,This is the fourth line,This is the fourth line,This is the fifth line,This is the fifth line,This is the sixth lineThis is the sixth line;输出的输出的文本内容文本内容5.3 文本操作实例GDIFontBasic switch(iMessage) / switch(iMess
19、age) /处理消息处理消息 case WM_CREATE:case WM_CREATE:/处理窗口创建消息处理窗口创建消息hDC=GetDC(hWnd) ; hDC=GetDC(hWnd) ; /获取当前设备表句柄获取当前设备表句柄 GetTextMetrics(hDC,&tm); GetTextMetrics(hDC,&tm); /获取字体信息获取字体信息 nXChar=tm.tmAveCharWidth; nXChar=tm.tmAveCharWidth; /获取字符宽度获取字符宽度 nYChar=tm.tmHeight+tm.tmExternalLeading;nYCh
20、ar=tm.tmHeight+tm.tmExternalLeading; ReleaseDC(hWnd,hDC); ReleaseDC(hWnd,hDC); /释放当前设备句柄释放当前设备句柄 return 0;return 0; case WM_PAINT: case WM_PAINT: /处理重画消息处理重画消息 hDC=BeginPaint(hWnd,&PtStr); hDC=BeginPaint(hWnd,&PtStr); /开始绘画开始绘画 for(x=0;xLnCount;x=x+1) for(x=0;xLnCount;x=x+1) /输出文本输出文本 TextOu
21、t(hDC,nXChar,nYCharTextOut(hDC,nXChar,nYChar* *(1+x),textbufx,(1+x),textbufx,lstrlen(textbufx); lstrlen(textbufx); EndPaint(hWnd,&PtStr);EndPaint(hWnd,&PtStr); return 0;return 0; case WM_DESTROY: case WM_DESTROY: /结束应用程序结束应用程序 PostQuitMessage(0);PostQuitMessage(0); return 0;return 0; default
22、: default:/其他消息处理程序其他消息处理程序 return(DefWindowProc(hWnd,iMessage,wParam,lParam) ;return(DefWindowProc(hWnd,iMessage,wParam,lParam) ; 5.3 文本操作实例GDIFontBasic 本程序在窗口中分五行分别显示五行文本本程序在窗口中分五行分别显示五行文本 源程序:源程序:GDIFontColorGDIFontColor2022-6-7205.3 文本操作实例GDIFontColorGDIFontColorLRESULT CALLBACK WndProc(HWND hwn
23、d,UINT message,LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)WPARAM wParam,LPARAM lParam) HDC hdc;HDC hdc;HFONT hF_black,hF_big;HFONT hF_black,hF_big;/定义两种字体句柄定义两种字体句柄PAINTSTRUCT ps;PAINTSTRUCT ps;TEXTMETRIC tm;TEXTMETRIC tm;/定义一个定义一个TEXTMETRICTEXTMETRIC结构,用以记录字体信息结构,用以
24、记录字体信息char lpsz_1=“char lpsz_1=“这是一行红色的、字体为这是一行红色的、字体为SYSTEM_FONTSYSTEM_FONT的文字,的文字, 红色代表未来。红色代表未来。”;”;char lpsz_2=“char lpsz_2=“现在显示的是自定义字体,颜色为绿色,现在显示的是自定义字体,颜色为绿色, 绿色代表生机勃勃。绿色代表生机勃勃。”;”;char lpsz_3=“char lpsz_3=“现在展现在您面前的是蓝色的粗体字,现在展现在您面前的是蓝色的粗体字, 蓝色代表广阔的海洋和天空。蓝色代表广阔的海洋和天空。;char lpsz_4=“char lpsz_4
25、=“当前字体为大号、斜体并带有下划线的文字。当前字体为大号、斜体并带有下划线的文字。”;”; char lpsz_5=“ char lpsz_5=“现在您掌握了字体的操作了吗现在您掌握了字体的操作了吗?”;?”; char lpsz_6=“ char lpsz_6=“祝您成功祝您成功!”;!”;5.3 文本操作实例GDIFontColorGDIFontColor5.3 文本操作实例GDIFontColorGDIFontColorint X=0,Y=0;int X=0,Y=0;SIZE size;SIZE size; / /定义一个定义一个SIZESIZE类型的结构类型的结构 hF_black=
26、CreateFonthF_black=CreateFont / /创建自定义字体创建自定义字体“粗体字粗体字” ( (20,20, / /字体的高度字体的高度0,0, / /取最佳高宽比的宽度值取最佳高宽比的宽度值0,0, / /文本的倾斜度为文本的倾斜度为0 0,表示水平,表示水平0,0, / /字体的倾斜度为字体的倾斜度为0 0FW_HEAVY,FW_HEAVY, / /字体的粗度,字体的粗度,FW_HEAVYFW_HEAVY为最粗为最粗0,0, / /非斜体字非斜体字0,0, / /无下划线无下划线0,0, / /无删除线无删除线ANSI_CHARSET,ANSI_CHARSET, /
27、/用用ANSI_CHARSETANSI_CHARSET字符集字符集OUT_DEFAULT_PRECIS,OUT_DEFAULT_PRECIS, / /输出精度为缺省精度输出精度为缺省精度CLIP_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, / /剪裁精度为缺省精度剪裁精度为缺省精度DEFAULT_QUALITY,DEFAULT_QUALITY, / /输出质量为缺省值输出质量为缺省值DEFAULT_PITCH|FF_DONTCARE,/DEFAULT_PITCH|FF_DONTCARE,/字间距和字体系列使用缺省值字间距和字体系列使用缺省值“粗体字粗体字” /字体名
28、称字体名称 ); ); hF_big=CreateFonthF_big=CreateFont/创建新字体创建新字体 大号字大号字 ( (30,30,/字体高度字体高度0,0,0,0,0,0,FW_NORMAL,FW_NORMAL,1,1,/定义斜体定义斜体1,1,/定义输出时带下划线定义输出时带下划线0,0,ANSI_CHARSET,ANSI_CHARSET,/所使用的字符集所使用的字符集OUT_DEFAULT_PRECIS,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_QU
29、ALITY,DEFAULT_PITCH|FF_DONTCARE,DEFAULT_PITCH|FF_DONTCARE, 大号字大号字 ););5.3 文本操作实例GDIFontColorGDIFontColor switch(message) switch(message) case WM_PAINT:case WM_PAINT:hdc=BeginPaint(hwnd,&ps);hdc=BeginPaint(hwnd,&ps);SetTextColor(hdc,RGB(255,0,0); /SetTextColor(hdc,RGB(255,0,0); /设文本颜色为设文本颜色为红
30、色红色GetTextMetrics(hdc,&tm); /GetTextMetrics(hdc,&tm); /取缺省字体信息,写入取缺省字体信息,写入tmtmTextOutTextOut(hdc,X,Y,lpsz_1,strlen(lpsz_1); /(hdc,X,Y,lpsz_1,strlen(lpsz_1); /输出文本输出文本1 1Y=Y+tm.tmHeight+100Y=Y+tm.tmHeight+100* *tm.tmExternalLeading;tm.tmExternalLeading;/下一行的坐标下一行的坐标SetTextColor(hdc,RGB(0,Set
31、TextColor(hdc,RGB(0,255255,0); /,0); /设文本颜色为设文本颜色为绿色绿色SelectObjectSelectObject(hdc,hF_black);(hdc,hF_black); / /选自定义字体选自定义字体hF_blackhF_blackGetTextMetrics(hdc,&tm); /GetTextMetrics(hdc,&tm); /取缺省字体信息,写入取缺省字体信息,写入tmtmTextOutTextOut(hdc,X,Y,lpsz_2,strlen(lpsz_2); /(hdc,X,Y,lpsz_2,strlen(lpsz_2
32、); /输出文本输出文本2 2Y=Y+tm.tmHeight+10Y=Y+tm.tmHeight+10* *tm.tmExternalLeading;tm.tmExternalLeading; /下一行的坐标下一行的坐标GetTextExtentPoint32(hdc,lpsz_2,strlen(lpsz_2),&size);GetTextExtentPoint32(hdc,lpsz_2,strlen(lpsz_2),&size);/获取字符串的宽度获取字符串的宽度SetTextColor(hdc,RGB(0,0,SetTextColor(hdc,RGB(0,0,255255)
33、;); /设文本颜色为设文本颜色为蓝色蓝色TextOutTextOut(hdc,X,Y,lpsz_3,strlen(lpsz_3); /(hdc,X,Y,lpsz_3,strlen(lpsz_3); /输出文本输出文本3 35.3 文本操作实例GDIFontColorGDIFontColorX=0;X=0; / /计算下一行起始坐标计算下一行起始坐标Y=Y+tm.tmHeight+20Y=Y+tm.tmHeight+20* *tm.tmExternalLeading;tm.tmExternalLeading;SelectObjectSelectObject(hdc,hF_big); /(hdc
34、,hF_big); /选自定义字体选自定义字体hF_bighF_bigSetTextColor(hdc,RGB(155,155,155);SetTextColor(hdc,RGB(155,155,155);/置文本颜色置文本颜色为为灰色灰色 Y=Y+tm.tmHeight+20Y=Y+tm.tmHeight+20* *tm.tmExternalLeading;tm.tmExternalLeading; /Y/Y坐标加大坐标加大TextOutTextOut(hdc,X,Y,lpsz_4,strlen(lpsz_4);/(hdc,X,Y,lpsz_4,strlen(lpsz_4);/输出文本输出文
35、本4 4SetTextColor(hdc,RGB(255,0,0);/SetTextColor(hdc,RGB(255,0,0);/设文本颜色为设文本颜色为红色红色 X=0;X=0; / /下一行的坐标下一行的坐标Y=Y+tm.tmHeight+30Y=Y+tm.tmHeight+30* *tm.tmExternalLeading;tm.tmExternalLeading;TextOutTextOut(hdc,X,Y,lpsz_5,strlen(lpsz_5); /(hdc,X,Y,lpsz_5,strlen(lpsz_5); /输出文本输出文本5 5 GetTextExtentPoint32
36、(hdc,lpsz_5,strlen(lpsz_5),&size); GetTextExtentPoint32(hdc,lpsz_5,strlen(lpsz_5),&size);/获取字符串的宽度获取字符串的宽度X=X+size.cx;X=X+size.cx;/获取起始坐标获取起始坐标TextOutTextOut(hdc,X,Y,lpsz_6,strlen(lpsz_6);/(hdc,X,Y,lpsz_6,strlen(lpsz_6);/再输出文本再输出文本6 6 EndPaint(hwnd,&ps); EndPaint(hwnd,&ps);break;break;5.3 文本操作实例GDIFontColorGDIFontColor 显示出显示出2626个英文字母,个英文字母, 从左向右从左向右字母依次位置提高字母依次位置提高1010个象素单位,并且颜色变个象素单位,并且颜色变为红色,然后回到正常位置;当到达最右端
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 西安石油大学《俄语实践语法》2024-2025学年第二学期期末试卷
- 社会团体内部考核制度
- 项目内部控制制度范本
- 内部审计人员会计制度
- 链家房地产内部控制制度
- 集体宿舍内部规章制度
- 集团内部财务控制制度
- 副高护理学护理信息技术应用
- 专项应急预案-规定(3篇)
- 劳模精神代表人物事迹
- 高压电工实操考试题库(含答案)
- 危险化学品事故应急处置
- 餐厅安全用电气水培训课件
- 1.手术室患者人文关怀管理规范中国生命关怀协会团体标准TCALC003-2023
- 2025年中国热敏纸成色剂ODB-2行业市场分析及投资价值评估前景预测报告
- 爱弯腰的痘痘课件
- 快速康复肺癌围手术期护理
- 师德师风培训课件
- PDCA优化小儿留置针应用
- 全国城市公共交通规划
- 辅警礼仪培训课件
评论
0/150
提交评论