已阅读5页,还剩32页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章 文本与字体,使用定义好的与设备无关的字体集, Windows就能维护它的设备无关性,提供“所见即所得”的好处,即屏幕所见与设备输出的文本是一样的。,文本操作,先要获得文本句柄,设置字体、字符大小、字符颜色等有关属性,将这些属性选入设备环境,字体,逻辑字体定义的字符集是设备无关的,它可以精确标度,因此得到广泛应用,描述所要显示 的文本的大小、 类型和外形,物理字体是为特殊设备设计的,因而是设备相关的,Win 系统 提供了七种 基本字体,字体 说明 ANSI_FIXED ANSI标准的固定宽度的字体 ANSI_VAR ANSI标准的可变宽度的字体 DEFAULT_GUI 当前GUI的默认字体 OEM_FIXED 由标准原设备制造商(OEM)提供 DEVICE_DEFAULT 当前图形设备的字体 SYSTEM_FIXED Windows的标准固定宽度的字体 SYSTEM Windows提供的可变宽度的字体,常作为默认字体 Win用它作为 系统界面字体,5.1 设置文本的设备环境 5.1.1 字体句柄,(1) 定义字体句柄变量: HFONT hF; /hF为字体的句柄,(2) 调函数GetStockObject获得系统字体句柄 它返回的是系统的默认字体 hF= GetStockObject( ):,(3) 调用函数SelectObject将字体选入设备环境 SelectObject(hdc,hF);,选择系统字体的步骤,若需要定义系统以外的字体,可以调用函数GreateFont自行创建 HFont=CreateFont (int nHeight, /字体高度,0采用系统默认值,使用逻辑单位 int nWidth, /字体宽度,取0则由系统根据高宽比取最佳值 int nEscapement, /每行文字相对于页底的角度,单位为0.1度 int nOrienation, /每个文字相对于页底的角度,单位为0.1度 DWORD nWeight, /字体粗细度,范围为01000 DWORD Dwltalic, /如果要求字体倾斜,则取非零 DWORD dwUnderline, /如果要求下划线,则取非零 DWORD dwStrikeout, /如果要求中划线,则取非零 DWORD dwCharset, /字体所属字符集 DWORD dwOutputPrecision,/输出精度,一般取默认值OUT_DEFAULT_PRECIS DWORD dwClipPrecision, /剪裁精度,常取默认值CLIP_DEFAULT_PRECIS DWORD dwQuality, /输出质量,一般取默认值DEFAULT_QUALITY DWORD dwPitchAndFamily, /字体名 ),可选的系统字符集: ANSI_CHARSET OEM_CHARSET SYMBOL_CHARSET DEFAULT_CHARSET SHIFTJIS_CHARSET,5.1.2 创建自定义字体,crColor为设置的颜色,字体及背景颜色 的设置在开发过 程中非常重要,5.1.3 设置字体和背景颜色,5.2 文本的输出过程,获取字体信息,系统定义的TEXTMETRICS的结构如下: typedef struct tagTEXTMETRIC /tm LONG tmHeight; /字符高度 LONG tmAscent; /字符基线以上高度 LONG tmDescent; /字符基线以下高度 LONG tmInternalLeading; /tmHeight制订的字符高度顶部的控件 LONG tmExternalLeading; /行与行之间的间隔 LONG tmAveCharWidth; /平均字符宽度 LONG tmMaxCharWidth; /最大字符宽度 LONG tmWeight; /字符的粗细度 LONG tmOverhang; /合成字体间附加的宽度 LONG tmDigitizedAspectX; /为输出设备设计的X轴尺寸 LONG tmDigitizedAspectY; /为输出设备设计的Y轴尺寸 BCHAR tmFirstChar; /字体中第一个字符值 BCHAR tmLastChar; /字体中最后一个字符值 BCHAR tmDefaultChar; /代替不在字体中字符的字符 BCHAR tmBreakChar; /作为分割符的字符 BYTE tmItalic; /非0则表示字体为斜体 BYTE tmUnderlined; /非0则表示字体有下划线 BYTE tmStruckOut; /非0则表示字符为删除字体 BYTE tmPitchAndFamily; /字体间距和字体族 BYTE tmCharSet; /字符集 TEXTMETRIC,格式化文本,(1) 确定后续文本坐标,例如,X轴起始坐标为cx0,后续文本起始坐标cx1为: cx1=cx0+size.cx;,(2)确定换行时文本坐标,字符的高度与行间隔均存储在tm指向的TEXTMETRICS结构中,换行时Y轴上文本的起始坐标cy为: cy=tm.tmHeight+tm.tmExternalLeading;,通过计算当前行文本字符的高度与行间隔之和,即可得到换行时文本的起始坐标,文本输出,常用的文本输出函数TextOut原型如下: BOOL TextOut ( HDC hdc, int X, int Y, /X, Y为用户区中字符串的起始坐标 LPCTSTR lpstring, /lpstring为显示的字符串 int nCount /nCount为字符串中的字节数 );,TextOut 以坐标X,Y为起点, 输出字节数为 nCount、 名为lpstring中的字符串,【例5-1】在用户窗口上输出几行字符串,当窗口接收到WM_PAINT消息后,显示的文本每次都被重新刷新。,#include #include #include long WINAPI WndProc( HWND hWnd, UINT iMessage, UINT wParam, LONG lParam ); BOOL InitWindowsClass(HINSTANCE hInstance); BOOL InitWindows(HINSTANCE hInstance,int nCmdShow); HWND hWndMain;,5.3 文本操作实例,/主函数 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) MSG Message; if(!InitWindowsClass(hInstance) return FALSE; if(!InitWindows(hInstance,nCmdShow)return FALSE; while(GetMessage( ,/消息处理函数 long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam) static long nXChar,nCaps,nYChar; HDC hDC; /定义指向设备上下文的句柄 short x; TEXTMETRIC tm; short LnCount=6; PAINTSTRUCT PtStr; /定义指向包含绘图信息的结构体变量 static char *textbuf= “This is the First line“, “This is the second line“, “This is the third line“, “This is the fourth line“, “This is the fifth line“, “This is the sixth line“ ;,输出的文 本内容,switch(iMessage) /处理消息 case WM_CREATE: /处理窗口创建消息 hDC=GetDC(hWnd) ; /获取当前设备表句柄 GetTextMetrics(hDC, ,BOOL InitWindowsClass(HINSTANCE hInstance) /初始化窗口类 WNDCLASS WndClass; ; WndClass.style=CS_HREDRAW|CS_VREDRAW; return RegisterClass( ,BOOL InitWindows(HINSTANCE hInstance,int nCmdShow) /初始化窗口 HWND hWnd; hWnd=CreateWindow(“WinText“, /生成窗口 “文本显示示例程序“, WS_OVERLAPPEDWINDOW, .; NULL); if(!hWnd) return FALSE; hWndMain=hWnd; ShowWindow(hWnd,nCmdShow); /显示窗口 UpdateWindow(hWnd); return TRUE; ,【例5-2】本程序通过在窗口中分五行分别显示五行文本,以说明在窗口的用户区中输出文本的方法。,本例题的源代码如下: #include #include #include #include LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow) HWND hwnd; MSG Msg; WNDCLASS wndclass; char lpszClassName = “文本输出“; char lpszTitle= “EXAMPLE FOR THE TEXT OUTPUT“; wndclass.style = 0; ; wndclass.lpszClassName = lpszClassName;,if( !RegisterClass( ,LRESULT CALLBACK WndProc(HWND hwnd,UINT message, WPARAM wParam,LPARAM lParam) HDC hdc; HFONT hF_black,hF_big; /定义两种字体句柄 PAINTSTRUCT ps; TEXTMETRIC tm; /定义一个TEXTMETRIC结构,用以记录字体信息 char lpsz_1=这是一行红色的、字体为SYSTEM_FONT的文字,红色代表未来。“; char lpsz_2=现在显示的是自定义字体,颜色为绿色,绿色代表生机勃勃。“; char lpsz_3=现在展现在您面前的是蓝色的粗体字,蓝色代表广阔的海洋和天空。“; char lpsz_4=“当前字体为大号、斜体并带有下划线的文字。“; char lpsz_5=“现在您掌握了字体的操作了吗?“; char lpsz_6=“祝您成功!“; int X=0,Y=0; SIZE size; /定义一个SIZE类型的结构,switch(message) case WM_PAINT: hdc=BeginPaint(hwnd, /字体名称,SetTextColor(hdc,RGB(0,255,0); /设置文本颜色为绿色 SelectObject(hdc,hF_black); /将自定义字体选入设备环境 GetTextMetrics(hdc,hF_big=CreateFont /引入新字体 ( 30, /字体高度 0, 0, 0, FW_NORMAL, 1, /定义斜体 1, /定义输出时带下划线 0, ANSI_CHARSET, /所使用的字符集 OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, “大号字“ );,SelectObject(hdc,hF_big);/将自定义字体选入设备环境 SetTextColor(hdc,RGB(155,155,155); /设置文本颜色 Y=Y+tm.tmHeight+20*tm.tmExternalLeading; TextOut(hdc,X,Y,lpsz_4,strlen(lpsz_4);/输出文本 SetTextColor(hdc,RGB(255,0,0);/设置文本颜色为红色 X=0; /设定输出文本的X坐标位置 Y=Y+tm.tmHeight+30*tm.tmExternalLeading; TextOut(hdc,X,Y,lpsz_5,strlen(lpsz_5); /输出文本 /在该行继续输出文本 GetTextExtentPoint32(hdc,lpsz_5,strlen(lpsz_5),case WM_DESTROY: DeleteObject(hF_black); /退出窗口时删除自定义字体 DeleteObject(hF_big); PostQuitMessage(0); break; default: return DefWindowProc(hwnd,message,wParam,lParam); return 0; ,【例5-3】在窗口中显示出26个英文字母,从左向右字母依次位置提高10个像素单位,并且颜色变为红色,然后回到正常位置;当到达最右端后改变方向从右向左依次变成红色并位置提高10个像素单位。在窗口的第二行显示26个字母,字体从正常到斜体,颜色从黑色到天蓝色不断变换。如图所示。,用nChar标志红 色跳起字母在 26个字母的位置,本例题要解决动态显示问题:,首先处理第一行字符:在WM_PAINT消息处理程序中,在得到了设备环境句柄hDC后,调用用户自定义的函数CreateFont(hDC,nHeight,bItalic),第一个参数hDC是设备环境句柄,第2个参数nHeight是字体高度,第3个参数bItalic是斜字体的标志变量。,下面这段程序按照黑色的字体输出从字符串开头到当前位置的字符串: Y=tm.tmExternalLeading+10; /设置输出字符的Y坐标 for(i=0;inChar;i+) SetTextColor(hDC,RGB(0,0,0); /设置字体的颜色为黑色 X=X+tm.tmAveCharWidth*2; /设置输出字符的X坐标 TextOut(hDC,X,Y,/输出从第0个到第nChar-1个字符 ,下面输出当前位置上的字符,当前位置的字符位置提高10个像素单位,字体颜色为红色: SetTextColor(hDC,RGB(255,0,0);/设置字体的颜色为红色 X=X+tm.tmAveCharWidth*2; /设置输出字符的X,Y坐标 Y=tm.tmExternalLeading; /提高10个像素 hF = CreateFont(hDC,40,0); /创建字体 SelectObject(hDC,hF); /选入字体 TextOut(hDC,X,Y, /输出后面的字符 ,下面设置bRight和bLeft的值。 if(nChar = nCharlen) /当输出到最后的一个字符时 bRight = FALSE; /改变红色字移动的方向为向左 bLeft = TRUE; else(nChar = 0) /当输出到第一个字时 bRight = TRUE; /改变红色字移动的方向为向右 bLeft = FALSE; if(bRight = TRUE) nChar+; else nChar-;,如果nChar=等于字符串长度=已到了字符串末尾,将bRight置为True 字符长度=0时,已到了最左端,将bLeft置为True; 当bRight=True时字符位置标志nChar加1,当bLeft=True时,字符位置标志变量减1。,下面输出第2行字符:在WM_PAINT处理程序中,加入下列代码: hF = CreateFont(hDC,40,bItalic); /创建字体,大小为40 SelectObject(hDC,hF); /选入字体 X = tm.tmAveCharWidth*2; /设置输出位置 Y = tm.tmHeight*2; if(bItalic = TRUE) SetTextColor(hDC,RGB(0,0,0); else SetTextColor(hDC,RGB(0,255,255); TextOut(hDC,X,Y,lpsz_1,strlen(lpsz_1); /输出 if(bItalic = TRUE) bItalic=FALSE; else bItalic=TRUE;,调用用户自定义函数CreateFont()创建斜体字,确定输出位置 根据bItalic的状态设置字体的颜色。 当bItalic为真时,输出斜体天蓝色字符;为假时,输出正常黑色字体最后对bItalic取反,在下一次显示与此次不同的另一种效果。,【例5-4】将一首四句的古诗从右到左竖排输出。要求窗口每次接收到WM_PAINT消息时都刷新显示的文本。,#include #include #include long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam); BOOL InitWindowsClass(HINSTANCE hInstance); BOOL InitWindows(HINSTANCE hInstance,int nCmdShow); HWND hWndMain; /主函数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) MSG Message; if(!InitWindowsClass(hInstance) return FALSE; if(!InitWindows(hInstance,nCmdShow) return FALSE; while(GetMessage( ,long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam) 1. static long nXChar,nCaps,nYChar; 2. int pointx,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026浙江杭州浙邯科创发展有限公司招聘1人笔试模拟试题及答案详解
- 2026年巴里坤县招聘城市管理辅助工作人员(35人)笔试参考题库及答案详解
- 2026江西南昌市劳动保障事务代理中心招聘见习岗3人笔试参考题库及答案详解
- 2026年湖南株洲市芦淞区事业单位招聘6名高层次人才笔试备考题库及答案详解
- 2026云南昭通市绥江县科学技术协会招聘城镇公益性岗位2人笔试参考题库及答案详解
- 2026江苏淮安市清江浦区和平镇公益性岗位(第二批)招聘6人笔试备考试题及答案详解
- 2026四川湖山电器股份有限公司招聘音频算法研发科研助理等岗位8人笔试备考试题及答案详解
- 2026浙江大学软件学院、浙江大学宁波国际科创中心编外人员招聘1人笔试模拟试题及答案详解
- 南宁师范大学2026年上半年公开招聘工作人员笔试备考试题及答案详解
- 2026上海人民美术出版社第一工作室招聘4人笔试模拟试题及答案详解
- 2025-2030中国手术防粘连液行业市场现状分析及竞争格局与投资发展研究报告
- Unit 12 单元测试卷(二)-2025-2026学年八年级英语下册(仁爱科普版)
- 2026年农庄租赁合同(1篇)
- 2026年电大土木工程毕业实习报告
- 中建八局对员工考核制度
- 2026年及未来5年市场数据中国金融IT行业市场调查研究及发展战略规划报告
- (正式版)DB43∕T 3321-2025 《早产儿和低出生体重儿袋鼠式护理技术规范》
- 新22J01 工程做法图集
- 纳豆激酶(日本原装进口纳豆激酶)
- GB/T 17166-2019能源审计技术通则
- 额颞叶痴呆症课件
评论
0/150
提交评论