您好,欢迎访问三七文档
1第5章文本与字体使用定义好的与设备无关的字体集,Windows就能维护它的设备无关性,提供“所见即所得”的好处,即屏幕所见与设备输出的文本是一样的Windows经常使用GDI进行文本输出。在一定意义上,任何内容都可以看成图形实体图形和文本并没有明显的界限文本操作先要获得文本句柄设置字体、字符大小、字符颜色等有关属性将这些属性选入设备环境25.1设置文本的设备环境字体逻辑字体定义的字符集是设备无关的,它可以精确标度,因此得到广泛应用描述所要显示的文本的大小、类型和外形物理字体是为特殊设备设计的,因而是设备相关的Win系统提供了七种基本字体字体说明ANSI_FIXEDANSI标准的固定宽度的字体ANSI_VARANSI标准的可变宽度的字体DEFAULT_GUI当前GUI的缺省字体OEM_FIXED由标准原设备制造商(OEM)提供DEVICE_DEFAULT当前图形设备的字体SYSTEM_FIXEDWindows的标准固定宽度的字体SYSTEMWindows提供的可变宽度的字体常作为缺省字体Win用它作为系统界面字体3(1)定义字体句柄变量:HFONThF;//hF为字体的句柄(2)调函数GetStockObject获得系统字体句柄,它返回的是系统的缺省字体hF=GetStockObject():(3)调用函数SelectObject将字体选入设备环境SelectObject(hdc,hF);选择系统字体的步骤45.1.2创建自定义字体若需要定义系统以外的字体,可以调用函数GreateFont自行创建HFont=CreateFont(intnHeight,//字体高度,0采用系统缺省值,使用逻辑单位intnWidth,//字体宽度,取0则由系统根据高宽比取最佳值intnEscapement,//每行文字相对于页底的角度,单位为0.1度intnOrienation,//每个文字相对于页底的角度,单位为0.1度DWORDnWeight,//字体粗细度,取值范围为0~1000DWORDDwltalic,//如果要求字体倾斜,则取非零DWORDdwUnderline,//如果要求下划线,则取非零DWORDdwStrikeout,//如果要求中划线,则取非零5DWORDdwCharset,//字体所属字符集DWORDdwOutputPrecision,//输出精度,一般取缺省值OUT_DEFAULT_PRECISDWORDdwClipPrecision,//剪裁精度,一般取缺省值CLIP_DEFAULT_PRECISDWORDdwQuality,//输出质量,一般取缺省值DEFAULT_QUALITYDWORDdwPitchAndFamily,//字体的斜度及字体的系列lpszFacename//字体名)可选的系统字符集:ANSI_CHARSETOEM_CHARSETSYMBOL_CHARSETDEFAULT_CHARSETSHIFTJIS_CHARSET一般取缺省值DEFAULT_PITCH65.1.3设置字体和背景颜色设置字体颜色:SetTextColor(hdc,crColor);设置背景颜色:SetBkColor(hdc,crColor);crColor为设置的颜色字体及背景颜色的设置在开发过程中非常重要75.2文本的输出过程确定后续文本坐标确定换行时文本坐标文本输出过程获取字体信息格式化文本调用函数输出文本8获取字体信息输出文本之前要获取字体的信息,如字符高度等,以确定输出格式和下一行字符的位置GetTextMetrics(hdc,&tm);//tm为TEXTMETRICS结构获取当前使用字体信息调用该函数时,系统将当前字体的信息拷贝到tm标识的TEXTMETRICS结构中9系统定义的TEXTMETRICS的结构如下:typedefstructtagTEXTMETRIC{//tmLONGtmHeight;//字符高度LONGtmAscent;//字符基线以上高度LONGtmDescent;//字符基线以下高度LONGtmInternalLeading;//tmHeight制订的字符高度顶部的控件LONGtmExternalLeading;//行与行之间的间隔LONGtmAveCharWidth;//平均字符宽度LONGtmMaxCharWidth;//最大字符宽度LONGtmWeight;//字符的粗细度LONGtmOverhang;//合成字体间附加的宽度LONGtmDigitizedAspectX;//为输出设备设计的X轴尺寸LONGtmDigitizedAspectY;//为输出设备设计的Y轴尺寸BCHARtmFirstChar;//字体中第一个字符值BCHARtmLastChar;//字体中最后一个字符值BCHARtmDefaultChar;//代替不在字体中字符的字符BCHARtmBreakChar;//作为分割符的字符BYTEtmItalic;//非0则表示字体为斜体BYTEtmUnderlined;//非0则表示字体有下划线BYTEtmStruckOut;//非0则表示字符为删除字体BYTEtmPitchAndFamily;//字体间距和字体族BYTEtmCharSet;//字符集}TEXTMETRIC10格式化文本(1)确定后续文本坐标换行时确定下一行文本的坐标需要格式化处理的情况在文本行中确定后续文本的坐标确定后续文本的坐标,应先获取当前的字符串的宽度,该工作由GetTextExtentPoint32函数完成,并把它存储于一个SIZE结构中。BooLGetTextExtentPoint32(HDChdc,LPCTSTRlpszString,//指定的字符串intnLength,//字符串中的字符数LPSIZElpSize//返回加字符串宽度及高度的SIZE数据结构的地址)SIZE数据结构的定义typedefstructtagSIZE{LONGcx;LONGcy;}SIZE;例如,X轴起始坐标为cx0,后续文本起始坐标cx1为:cx1=cx0+size.cx;11(2)确定换行时文本坐标字符的高度与行间隔均存储在tm指向的TEXTMETRICS结构中,换行时Y轴上文本的起始坐标cy为:cy=tm.tmHeight+tm.tmExternalLeading;通过计算当前行文本字符的高度与行间隔之和,即可得到换行时文本的起始坐标12文本输出常用的文本输出函数TextOut原型如下:BOOLTextOut(HDChdc,intX,intY,//X,Y为用户区中字符串的起始坐标LPCTSTRlpstring,//lpstring为显示的字符串intnCount//nCount为字符串中的字节数);TextOut以坐标X,Y为起点,输出字节数为nCount、名为lpstring中的字符串135.3文本操作实例【例5-1】在用户窗口上输出几行字符串,当窗口接收到WM_PAINT消息后,显示的文本每次都被重新刷新。#includewindows.h#includestdlib.h#includestring.hlongWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam);BOOLInitWindowsClass(HINSTANCEhInstance);BOOLInitWindows(HINSTANCEhInstance,intnCmdShow);HWNDhWndMain;14//主函数intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow){MSGMessage;if(!InitWindowsClass(hInstance))returnFALSE;if(!InitWindows(hInstance,nCmdShow))returnFALSE;while(GetMessage(&Message,0,0,0))//消息循环{TranslateMessage(&Message);DispatchMessage(&Message);}returnMessage.wParam;}15//消息处理函数longWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam){staticlongnXChar,nCaps,nYChar;HDChDC;//定义指向设备上下文的句柄shortx;TEXTMETRICtm;shortLnCount=6;PAINTSTRUCTPtStr;//定义指向包含绘图信息的结构体变量staticchar*textbuf[]={ThisistheFirstline,Thisisthesecondline,Thisisthethirdline,Thisisthefourthline,Thisisthefifthline,Thisisthesixthline};输出的文本内容16switch(iMessage)//处理消息{caseWM_CREATE://处理窗口创建消息hDC=GetDC(hWnd);//获取当前设备表句柄GetTextMetrics(hDC,&tm);//获取字体信息nXChar=tm.tmAveCharWidth;//获取字符宽度nYChar=tm.tmHeight+tm.tmExternalLeading;nCaps=(tm.tmPitchAndFamily&1?3:2)*nXChar/2;ReleaseDC(hWnd,hDC);//释放当前设备句柄return0;caseWM_PAINT://处理重画消息hDC=BeginPaint(hWnd,&PtStr);//开始绘画for(x=0;xLnCount;x=x+1)//输出文本TextOut(hDC,nXChar,nYChar*(1+x),textbuf[x],lstrlen(textbuf[x]));EndPaint(hWnd,&PtStr);return0;caseWM_DESTROY://结束应用程序PostQuitMessage(0);return0;default://其他消息处理程序return(DefWindowProc(hWnd,iMessage,wParam,lParam));}}17BOOLInitWindowsClass(HINSTANCEhInstance)//初始化窗口类{WNDCLASSWndClass;…………;WndClass.style=CS_HREDRAW|CS_VREDRAW;returnRegisterClass(&WndClass);}BOOLInitWindows(HINSTANCEhInstance,intnCmdShow)//初始化窗口{HWNDhWnd;hWnd=CreateWindow(WinText,//生成窗口文本显示示例程序,WS_OVERLAPPEDWINDOW,…….;NULL);if(!hWnd)returnFALSE;hWndMain=hWnd;ShowWindow(hWnd,nCmdShow);//显示窗口UpdateWindow(hWnd);returnTRUE;}18【例5-2】本程序通过在窗口中分五行分别显示五行文本,以说明在窗口的用户区中格式及输出文本的方法。19本例题的源代码如下:#includewindows.h#includestring.h#includestdlib.h#includestdio.hLRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInst,LPSTRlpszCmdLine,intnCmdShow){HWNDhwnd;MS
本文标题:文本与字体
链接地址:https://www.777doc.com/doc-3216588 .html