VC字体文本输出

上传人:hy****d 文档编号:242878019 上传时间:2024-09-10 格式:PPT 页数:36 大小:203.50KB
返回 下载 相关 举报
VC字体文本输出_第1页
第1页 / 共36页
VC字体文本输出_第2页
第2页 / 共36页
VC字体文本输出_第3页
第3页 / 共36页
点击查看更多>>
资源描述
单击以编辑母版标题样式,单击以编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第5章 文本的输出与字体设置,Windows,GDI,进行文本输出。在一定意义上,任何内容都可以看成,图形实体,图形和文本并,没有明显的界限,设置字体、字符颜色等有关属性,将这些属性选入设备环境,1,5.1 设置文本的设备环境,字体,逻辑字体,定义的字符集是,设备无关,的,它可以精确标度,因此得到广泛应用,描述所要显示,的文本的大小、,类型和外形,物理字体,是为特殊设备设计的,因而是,设备相关,的,Win 系统,提供了七种,基本字体,字体 说明,ANSI_FIXED,ANSI,标准的,固定,宽度的字体,ANSI_VAR,ANSI,标准的,可变,宽度的字体,DEFAULT_GUI当前,GUI,的缺省字体,OEM_FIXED 由标准原设备制造商,(OEM),提供,DEVICE_DEFAULT当前图形设备的字体,SYSTEM_FIXEDWindows的标准,固定,宽度的字体,SYSTEM Windows提供的,可变,宽度的字体,常作为缺省字体,Win,用它作为,系统界面字体,2,(1) 定义字体句柄变量:,HFONT hF; /hF为字体的句柄,(2) 调函数GetStockObject获得系统字体句柄,它返回的是系统的缺省字体,hF= GetStockObject( ):,(3) 调用函数SelectObject将字体选入设备环境,SelectObject(hdc,hF);,选择系统字体的步骤,3,5.1.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,/如果要求中划线,则取非零,DWORD dwCharset, /字体所属字符集,DWORD dwOutputPrecision,/输出精度,一般取缺省值OUT_DEFAULT_PRECIS,DWORD dwClipPrecision, /剪裁精度,常取缺省值CLIP_DEFAULT_PRECIS,DWORD dwQuality, /输出质量,一般取缺省值DEFAULT_QUALITY,DWORD dwPitchAndFamily, /,字体间距,LPCTSTR,lpszFace,/ 字体名,),可选的系统字符集:,ANSI_CHARSET,OEM_CHARSET,SYMBOL_CHARSET,DEFAULT_CHARSET,SHIFTJIS_CHARSET,4,5.1.3 设置字体和背景颜色,设置字体颜色:SetTextColor(hdc,crColor);,设置背景颜色,:,SetBkColor(hdc,crColor);,crColor为设置的颜色,字体,及,背景颜色,的设置在开发过,程中非常重要,5,5.2 文本的输出过程,确定后续文本坐标,确定换行时文本坐标,文本输出过程,获取字体信息,格式化文本,调用函数输出文本,6,获取字体信息,输出文本之前要获取字体的信息,如字符高度等,以确定输出格式和下一行字符的位置,GetTextMetrics (hdc,&tm);/,tm为TEXTMETRICS结构,获取当前使,用字体信息,调用该函数时,系统将当前字体的信息拷贝到tm标识的,TEXTMETRICS,结构中,7,系统定义的,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,Return,8,格式化文本,(1) 确定后续文本坐标,换行时确定下一行文本的坐标,需要格式化处理的情况,在文本行中确定后续文本的坐标,确定后续文本的坐标,应先获取当前的字符串的宽度,该工作由,GetTextExtentPoint32,函数,完成,并把它存储于一个,SIZE结构,中。,BooL GetTextExtentPoint32,(,HDC hdc,LPCTSTR lpszString,/指定的字符串,int nLength,/字符串中的字符数,LPSIZE lpSize,/返回字符串宽度及高度的,SIZE数据结构,的地址,),SIZE数据结构,的定义,typedef struct tagSIZE,LONG cx;,LONG cy;, SIZE;,例如,X轴起始坐标为cx0,后续文本起始坐标cx1为:,cx1=cx0+size.cx;,Return,9,(2)确定换行时文本坐标,字符的高度,与,行间隔,均存储在tm指向的,TEXTMETRICS,结构中,换行时Y轴上文本的起始坐标cy为:,cy=tm.tmHeight+tm.tmExternalLeading;,Return,通过计算当前行文本,字符的高度,与,行间隔,之和,即可得到换行时文本的起始坐标,10,文本输出,常用的文本输出函数TextOut原型如下:,BOOL TextOut,(,HDC hdc,int X, int Y, /X, Y为用户区中字符串的起始坐标,LPCTSTR lpstring, /lpstring为显示的字符串,int nCount /nCount为字符串中的字节数,);,TextOut,以坐标X,Y为起点,,输出字节数为 nCount、,名为lpstring中的字符串,11,5.3 文本操作实例,【例4-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;,12,/主函数,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(&Message,0,0,0)/消息循环,TranslateMessage(,DispatchMessage(,return Message.wParam;,13,/消息处理函数,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 *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,;,输出的文,本内容,14,switch(iMessage) /处理消息,case WM_CREATE:/处理窗口创建消息,hDC=GetDC(hWnd) ; /获取当前设备表句柄,GetTextMetrics(hDC, /获取字体信息,nXChar=tm.tmAveCharWidth; /获取字符宽度,nYChar=tm.tmHeight+tm.tmExternalLeading;,ReleaseDC(hWnd,hDC); /释放当前设备句柄,return 0;,case WM_PAINT: /处理重画消息,hDC=BeginPaint(hWnd, /开始绘画,for(x=0;xLnCount;x=x+1) /输出文本,TextOut(hDC,nXChar,nYChar*(1+x),textbufx,lstrlen(textbufx);,EndPaint(hWnd,return 0;,case WM_DESTROY: /结束应用程序,PostQuitMessage(0);,return 0;,default:/其他消息处理程序,return(DefWindowProc(hWnd,iMessage,wParam,lParam) ;,15,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;,16,【例4-2】本程序通过在窗口中分五行分别显示五行文本,以说明在窗口的用户区中输出文本的方法。,17,本例题的源代码如下:,#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;,18,if( !RegisterClass( &wndclass), MessageBeep(0);return FALSE;,hwnd = CreateWindow,( lpszClassName,lpszTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);,ShowWindow( hwnd, nCmdShow);,UpdateWindow(hwnd);,while( GetMessage(&Msg,NULL,0,0),TranslateMessage(,DispatchMessage(,return Msg.wParam;,19,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类型的结构,20,switch(message),case WM_PAINT:,hdc=BeginPaint(hwnd,SetTextColor(hdc,RGB(255,0,0);/设置文本颜色为红色,GetTextMetrics(hdc, /获取缺省字体,写入tm结构中,TextOut(hdc,X,Y,lpsz_1,strlen(lpsz_1);/,用当前字体输出文本,Y=Y+tm.tmHeight+100*tm.tmExternalLeading;,/计算换行时下一行文本的输出坐标,hF_black,=,CreateFont,(,/创建自定义字体,20,/字体的高度,0,/由系统根据高宽比选取字体最佳宽度值,0,/文本的倾斜度为0,表示水平,0,/字体的倾斜度为0,FW_HEAVY,/字体的粗度,FW_HEAVY为最粗,0,/非斜体字,0,/无下划线,0,/无删除线,ANSI_CHARSET,/表示所用的字符集为ANSI_CHARSET,OUT_DEFAULT_PRECIS,/输出精度为缺省精度,CLIP_DEFAULT_PRECIS,/剪裁精度为缺省精度,DEFAULT_QUALITY,/输出质量为缺省值,DEFAULT_PITCH|FF_DONTCARE,/字间距和字体系列使用缺省值,粗体字,);,/字体名称,21,SetTextColor(hdc,RGB(0,255,0);/设置文本颜色为绿色,SelectObject(hdc,hF_black);/将自定义字体选入设备环境,GetTextMetrics(hdc, /获取字体的信息,写入tm结构中,TextOut(hdc,X,Y,lpsz_2,strlen(lpsz_2);/,用当前字体输出文本,/换行继续输出文本,计算新行的起始Y坐标位置,Y=Y+tm.tmHeight+10*tm.tmExternalLeading;,GetTextExtentPoint32(hdc,lpsz_2,strlen(lpsz_2),/获取字符串/的宽度,SetTextColor(hdc,RGB(0,0,255);/设置文本颜色为蓝色,TextOut(hdc,X,Y,lpsz_3,strlen(lpsz_3);/,当前字体输出文本,X=0;/计算下一行文本的输出起始坐标,Y=Y+tm.tmHeight+20*tm.tmExternalLeading;,22,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,大号字,);,23,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),/获取字符串的宽度,X=X+size.cx;/获取起始坐标,TextOut(hdc,X,Y,lpsz_6,strlen(lpsz_6); /输出文本,EndPaint(hwnd,break;,24,case WM_DESTROY:,DeleteObject(hF_black);/退出窗口时删除自定义字体,DeleteObject(hF_big);,PostQuitMessage(0);,break;,default:,return DefWindowProc(hwnd,message,wParam,lParam);,return 0;,25,【4-3】在窗口中显示出26个英文字母,,从左向右,字母依次位置提高10个象素单位,并且颜色变为红色,然后回到正常位置;当到达最右端后改变方向从右向左依次变成红色并位置提高10个象素单位。在窗口的第二行显示26个字母,字体从正常到斜体,颜色从黑色到天蓝色不断变换。如图所示。,用nChar标志红,色跳起字母在,26个字母的位置,用bRight,bLeft标志当前移动方向,初始化bRight=TRUE,bLeft=FALSE,26,本例题要解决,动态显示,问题:,首先处理第一行字符:在WM_PAINT消息处理程序中,在得到了设备环境句柄hDC后,调用用户自定义的函数CreateFont(hDC,nHeight,bItalic),第一个参数hDC是设备环境句柄,第2个参数nHeight是字体高度,第3个参数bItalic是斜字体的标志变量,WM_CREATE,消息处理程序,定时器,调用SetTimer()创建,WM_TIMER,消息处,理程序,调用InvalidateRect()刷新,用户区,发送WM_PAINT消息,实现,动态,显示,27,下面这段程序按照黑色的字体输出从字符串开头到当前位置的字符串:,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,/输出第nChar个字符,Y=tm.tmExternalLeading+10;,for(i=nChar+1;i0;i-),18. ,for(j=0;j7;j+)/输出文本,19., pointx=100+i*nXChar*5;pointy=50+j*(nYChar+nCaps);,20.,TextOut(hDC,pointx,pointy,textbuf4-i+j*2,2); ,21. EndPaint(hWnd, /结束绘图,22.case WM_DESTROY: /结束应用程序,PostQuitMessage(0);return 0;,23.default:return(DefWindowProc(hWnd,iMessage,wParam,lParam);,33,创建自定义字体的例,题,程序,。在窗口中显示“自定义的字体”,字体颜色为红色,背景色为蓝色。其运行结果应如下图所示:,34,LRESULT CALLBACK WndProc( HWND hwnd,UINT message, WPARAM wParam,LPARAM lParam),1. HDC hdc ;/设备句柄,2.PAINTSTRUCT ps ;/画刷结构,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 & FF_DONTCARE,18.,“,黑体,”,);,35,19. hdc=BeginPaint (hwnd, /得到设备环境句柄,20. GetClientRect (hwnd, /得到需要绘制的客户区,21.holdFont=(HFONT)SelectObject(hdc,hnewFont); /选择新的字体,SetTextColor(hdc,RGB(255,0,0); /,设置文本颜色,SetBkColor(hdc,RGB(0,0,255); /,设置背景颜色,24. GetTextExtentPoint32(hdc,pstring,12,25.,Xchar,=(rect.right-rect.left)/2-size.cx/2;,26.,Ychar,=(rect.bottom-rect.top)/2-size.cy/2;,27. TextOut(hdc,Xchar,Ychar,pstring,12);,28.,SelectObject(hdc,holdFont,); /,保存原来的字体格式,29.,DeleteObject(hnewFont,); /,删除新的字体格式,30.,EndPaint,(,hwnd, &,ps,) ; /,结束绘制,return 0 ;,case WM_DESTROY:/,退出消息,PostQuitMessage,(0) ;return 0 ;,return,DefWindowProc(hwnd,message,wParam,lParam,) ;,36,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!