【教学课件】第5讲文本与字体.ppt

上传人:小飞机 文档编号:5659090 上传时间:2023-08-06 格式:PPT 页数:36 大小:414.97KB
返回 下载 相关 举报
【教学课件】第5讲文本与字体.ppt_第1页
第1页 / 共36页
【教学课件】第5讲文本与字体.ppt_第2页
第2页 / 共36页
【教学课件】第5讲文本与字体.ppt_第3页
第3页 / 共36页
【教学课件】第5讲文本与字体.ppt_第4页
第4页 / 共36页
【教学课件】第5讲文本与字体.ppt_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《【教学课件】第5讲文本与字体.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第5讲文本与字体.ppt(36页珍藏版)》请在三一办公上搜索。

1、1,第5讲 文本与字体,使用定义好的与设备无关的字体集,Windows就能维护它的设备无关性,提供“所见即所得”的好处,即屏幕所见与设备输出的文本是一样的,2,5.1 设置文本的设备环境,Win 系统提供了七种基本字体,3,(1)定义字体句柄变量:HFONT hF;/hF为字体的句柄,(2)调函数GetStockObject获得系统字体句柄 它返回的是系统的缺省字体 hF=GetStockObject():,(3)调用函数SelectObject将字体选入设备环境 SelectObject(hdc,hF);,选择系统字体的步骤,4,5.1.2 创建自定义字体,若需要定义系统以外的字体,可以调用

2、函数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,/如果要求中划线,则取非零

3、 DWORD dwCharset,/字体所属字符集 DWORD dwOutputPrecision,/输出精度,一般取缺省值OUT_DEFAULT_PRECIS DWORD dwClipPrecision,/剪裁精度,常取缺省值CLIP_DEFAULT_PRECIS DWORD dwQuality,/输出质量,一般取缺省值DEFAULT_QUALITY DWORD dwPitchAndFamily,/字体名),可选的系统字符集:ANSI_CHARSETOEM_CHARSETSYMBOL_CHARSETDEFAULT_CHARSETSHIFTJIS_CHARSET,5,5.1.3 设置字体和背景

4、颜色,crColor为设置的颜色,字体及背景颜色的设置在开发过程中非常重要,6,5.2 文本的输出过程,7,获取字体信息,8,系统定义的TEXTMETRICS的结构如下:typedef struct tagTEXTMETRIC/tmLONG tmHeight;/字符高度LONG tmAscent;/字符基线以上高度LONG tmDescent;/字符基线以下高度LONG tmInternalLeading;/tmHeight制订的字符高度顶部的控件LONG tmExternalLeading;/行与行之间的间隔LONG tmAveCharWidth;/平均字符宽度LONG tmMaxCharW

5、idth;/最大字符宽度LONG tmWeight;/字符的粗细度LONG tmOverhang;/合成字体间附加的宽度LONG tmDigitizedAspectX;/为输出设备设计的X轴尺寸LONG tmDigitizedAspectY;/为输出设备设计的Y轴尺寸BCHAR tmFirstChar;/字体中第一个字符值BCHAR tmLastChar;/字体中最后一个字符值BCHAR tmDefaultChar;/代替不在字体中字符的字符BCHAR tmBreakChar;/作为分割符的字符BYTE tmItalic;/非0则表示字体为斜体BYTE tmUnderlined;/非0则表示字

6、体有下划线BYTE tmStruckOut;/非0则表示字符为删除字体BYTE tmPitchAndFamily;/字体间距和字体族BYTE tmCharSet;/字符集TEXTMETRIC,Return,9,格式化文本,(1)确定后续文本坐标,例如,X轴起始坐标为cx0,后续文本起始坐标cx1为:cx1=cx0+size.cx;,Return,10,(2)确定换行时文本坐标,字符的高度与行间隔均存储在tm指向的TEXTMETRICS结构中,换行时Y轴上文本的起始坐标cy为:cy=tm.tmHeight+tm.tmExternalLeading;,Return,通过计算当前行文本字符的高度与行

7、间隔之和,即可得到换行时文本的起始坐标,11,文本输出,常用的文本输出函数TextOut原型如下:BOOL TextOut(HDC hdc,int X,int Y,/X,Y为用户区中字符串的起始坐标 LPCTSTR lpstring,/lpstring为显示的字符串 int nCount/nCount为字符串中的字节数);,TextOut 以坐标X,Y为起点,输出字节数为 nCount、名为lpstring中的字符串,12,5.3 文本操作实例,【例5-1】在用户窗口上输出几行字符串,当窗口接收到WM_PAINT消息后,显示的文本每次都被重新刷新。,#include#include#inclu

8、delong WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam);BOOL InitWindowsClass(HINSTANCE hInstance);BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);,13,/主函数int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)MSG Message;if(!InitWindowsClass(hI

9、nstance)return FALSE;if(!InitWindows(hInstance,nCmdShow)return FALSE;while(GetMessage(,14,/消息处理函数long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)static long nXChar,nYChar;HDC hDC;/定义指向设备上下文的句柄short x;TEXTMETRIC tm;short LnCount=6;PAINTSTRUCT PtStr;/定义指向包含绘图信息的结构体变量static char*tex

10、tbuf=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;,输出的文本内容,15,switch(iMessage)/处理消息 case WM_CREATE:/处理窗口创建消息hDC=GetDC(hWnd);/获取当前设备表句柄 GetTextMetrics(hDC,16,BOOL InitWindowsClass(HINSTANCE hInstance)/初始化窗口

11、类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;ShowWindow(hWnd,nCmdShow);/显示窗口UpdateWindow(hWnd);return TRUE;,17

12、,【例5-2】本程序通过在窗口中分五行分别显示五行文本,以说明在窗口的用户区中输出文本的方法。,18,本例题的源代码如下:#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 l

13、pszTitle=EXAMPLE FOR THE TEXT OUTPUT;wndclass.style=0;wndclass.lpszClassName=lpszClassName;,19,if(!RegisterClass(,20,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=这

14、是一行红色的、字体为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类型的结构,21,switch(message)case WM_PAINT:hdc=BeginPaint(hwnd,/字体名称,22,SetTextC

15、olor(hdc,RGB(0,255,0);/设置文本颜色为绿色SelectObject(hdc,hF_black);/将自定义字体选入设备环境GetTextMetrics(hdc,23,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,大号字);,24,SelectObject(hdc,hF_big);/

16、将自定义字体选入设备环境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);/设置文本颜色为红色Y=Y+tm.tmHeight+30*tm.tmExternalLeading;TextOut(hdc,X,Y,lpsz_5,strlen(lpsz_5);/输出文本/在该行继续输出文本GetTextExtentPoint32(hdc,lpsz_5

17、,strlen(lpsz_5),25,case WM_DESTROY:DeleteObject(hF_black);/退出窗口时删除自定义字体 DeleteObject(hF_big);PostQuitMessage(0);break;default:return DefWindowProc(hwnd,message,wParam,lParam);return 0;,26,【5-3】在窗口中显示出26个英文字母,从左向右字母依次位置提高10个象素单位,并且颜色变为红色,然后回到正常位置;当到达最右端后改变方向从右向左依次变成红色并位置提高10个象素单位。在窗口的第二行显示26个字母,字体从正常

18、到斜体,颜色从黑色到天蓝色不断变换。如图所示。,用nChar标志红色跳起字母在26个字母的位置,27,本例题要解决动态显示问题:,首先处理第一行字符:在WM_PAINT消息处理程序中,在得到了设备环境句柄hDC后,调用用户自定义的函数CreateFont(hDC,nHeight,bItalic),第一个参数hDC是设备环境句柄,第2个参数nHeight是字体高度,第3个参数bItalic是斜字体的标志变量,28,下面这段程序按照黑色的字体输出从字符串开头到当前位置的字符串:Y=tm.tmExternalLeading+10;/设置输出字符的Y坐标 for(i=0;inChar;i+)SetTe

19、xtColor(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(hD

20、C,hF);/选入字体TextOut(hDC,X,Y,/输出后面的字符,29,下面设置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=Tru

21、e时字符位置标志nChar加1,当bLeft=True时,字符位置标志变量减1。,30,下面输出第2行字符:在WM_PAINT处理程序中,加入下列代码:hF=CreateFont(hDC,40,bItalic);/创建字体.大小为40SelectObject(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(l

22、psz_1);/输出if(bItalic=TRUE)bItalic=FALSE;else bItalic=TRUE;,调用用户自定义函数CreateFont()创建斜体字,确定输出位置根据bItalic的状态设置字体的颜色。当bItalic为真时,输出斜体天蓝色字符;为假时,输出正常黑色字体最后对bItalic取反,在下一次显示与此次不同的另一种效果。,31,【例5-4】将一首四句的古诗从右到左竖排输出。要求窗口每次接收到WM_PAINT消息时都刷新显示的文本。,32,#include#include#includelong WINAPI WndProc(HWND hWnd,UINT iMes

23、sage,UINT wParam,LONG lParam);BOOL InitWindowsClass(HINSTANCE hInstance);BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);/主函数int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)MSG Message;if(!InitWindowsClass(hInstance)return FALSE;if(!InitWindows(hInstanc

24、e,nCmdShow)return FALSE;while(GetMessage(,33,long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)1.static long nXChar,nCaps,nYChar;2.int pointx,pointy,int i,j;3.HDC hDC;/定义指向设备环境的句柄4.TEXTMETRIC tm;/存放字体各种属性的结构体变量5.PAINTSTRUCT PtStr;/指向包含绘图信息的结构体变量6.static char*textbuf4=故人西辞黄鹤楼,烟花三月下扬

25、州,孤帆远影碧空尽,唯见长江天际流;7.switch(iMessage)/处理消息8.case WM_CREATE:/处理窗口创建消息9.hDC=GetDC(hWnd);/获取当前设备表句柄10.GetTextMetrics(hDC,34,【例5-5】创建自定义字体的例题程序。在窗口中显示“自定义的字体”,字体颜色为红色,背景色为蓝色。其运行结果应如下图所示:,35,LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)1.HDC hdc;/设备句柄 2.PAINTSTRUCT ps;/画刷结构

26、3.int Xchar,Ychar;4.SIZE size;5.LPCTSTR*pstring=“自定义的字体”;6.RECTrect;/无效矩形区 7.HFONT holdFont,hnewFont;8.switch(message)/消息处理函数9.case WM_CREATE:return 0;/窗口创建10.case WM_PAINT:/绘制消息11.hnewFont=CreateFont/创建一种新的逻辑字体(64,0,0,0,500,0,0,0,GB2312_CHARSET,14.OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,17.DEFAULT_PITCH,36,19.hdc=BeginPaint(hwnd,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号