八宝书库 > 文学其他电子书 > C语言实例教程(PDF格式) >

第72部分

C语言实例教程(PDF格式)-第72部分

小说: C语言实例教程(PDF格式) 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




                           绘制字符串  



       TabbedTextOut       以指定的位置绘制字符串,并按指定的 

                           制表符位置扩展字符串的制表符  



       DrawText            在指定的矩形区域内绘制格式化文本  



       GetTextExtent       使用当前字体中属性设备上下文中计算 

                           一行文本的宽度和高度  



       GetOutputTextExtent  在输出设备上下文中计算一字符串的宽 

                           度和高度  



       GetTabbedTextExtent  在属性设备上下文中计算一字符串的宽 

                           度和高度  



       GetOutputTabbedTextExtent  在输出设备上下文中计算一字符串的宽 

                           度和高度  



       GrayString          在指定位置绘制变灰的文本  



       GetTextAlign        获得文本对齐标志  



       SetTextAlign        设置文本对齐标志  



       GetTextFace         将当前字体的字体名拷贝到缓冲区  



       GetTextMetrics      从属性设备上下文中获得当前字体的度 

                           量值  



       GetOutputTextMetrics  从输出设备上下文中获得当前字体的度 

                           量值  



       SetTextJustification  在字符串的分隔字符处添加空白  



       GetTextCharacterExtra  获得字符间空白的当前设置  



       SetTextCharacterExtra  设置字符间空白的当前设置  



       GetFontData         从可缩放字体文件中获取字体信息。所 

                           获取的信息通过指定字体文件中的偏移 

                           量和返回信息的长度来确定  


…………………………………………………………Page 565……………………………………………………………

      GetKerningPairs  在选定的设备上下文中获得当前选定字 

                       体的字距调整字符对  



      GetOutlineTextMetrics  获得TrueType字体的字体度量信息  



      GetGlyphOutline  返回当前字体的字符的轮廓曲线或位图  



      GetCharABCWidths  从当前字体中以逻辑单位返回给定范围 

                       的连续字符的宽度  



      GetCharWidth     从当前字体中返回给定范围的连续字符 

                       的相对宽度  



      GetOutputCharWidth  从输出设备上下文中的当前字体返回连 

                       续字符组中若干单个字符的宽度  



                                              续表9。5 



      成员函数          描述  



      SetMapperFlags  改变字体映射程序中从逻辑字符到物理字体 

                    的映射过程中所使用的算法  



      GetAspectRatioFilter  获得当前纵横比过滤器的设定  



在一些应用程序 (如字处理应用程序)中,我们一般需要由用户来指定 

所使用的字体。这时常使用的方法是弹出一个字体对话框,用户通过 

该字体对话框来设置应用程序所使用的字体。MFC类CFontDialog封装 

了标准的Windows字体对话框。在最简单的情况下,我们只需要声明 

一个类的实例对象CFontDialog,然后通过该对象调用类CFongDialog 

的成员函数DoModal,如果该成员函数返回IDOK,则通过成员函数 

GetCurrentFont将用户所选择的字体信息填入一个LOGFONT结构中, 

在下面的过程中即可通过该结构创建CFont对象。在很多情况下,我 

们需要为字体对话框设置一些初始值,一种很简单的方式在其构造函 

数中传递一个指向LOGFONT结构对象的指针。我们可以在创建 

CFontDialog对象之后,调用DoModal成员之前改变其类型为 

CHOOSEFONT的成员结构m_cf的各成员的值来为字体对话框进行初始设 

置。  



9。4。4 创建特殊的字体效果  



在一般的应用程序中,我们可以使用SetBkMode和SetBkColor来设置 

绘制文本所使用的颜色和模式,但是,这两个函数所设置的效果是很 

有限的。有时候我们可能希望得到一些特殊的文本输出效果。这时我 


…………………………………………………………Page 566……………………………………………………………

们就应该考虑其它特殊的实现方式。使用路径是其中的一种方法。下 

面我们讲述一些使用路径得到的特殊的字体效果。  



     (1) 空心字  



在开始一个路径前,我们先调用CDC类的成员函数BeginPath,然后调 

用一系列的输出函数,在完成绘制之后,我们可以调用CDC类的成员 

函数EndPath。在完成一个路径之后,我们可以调用StrokePath来绘 

制该路径。为了简单起见,我们仅给出应用程序的OnPaint成员函数 

如下:  



// 应用程序主窗口的重绘函数  



void CMyWnd::OnPaint()  



{  



// 获得窗口的客户区设备上下文句柄  



CPaintDC dc(this);  



// 更改当前字体  



LOGFONT lf;  



dc。GetCurrentFont()…》GetLogFont(&lf);  



CFont font;  



CFont *pOldFont; // 保存设备上下文最初使用的字体对象  



lf。lfCharSet=134;  



lf。lfHeight=…150;  



lf。lfWidth=0;  



strcpy(lf。lfFaceName; 〃隶书〃);  



font。CreateFontIndirect(&lf);  



pOldFont=dc。SelectObject(&font);  



dc。SetBkMode(TRANSPARENT);  



// 更改当前画笔  



CPen pen(PS_SOLID; 1; RGB(255; 0; 0));  


…………………………………………………………Page 567……………………………………………………………

CPen *pOldPen;  



pOldPen=dc。SelectObject(&pen);  



// 开始一个路径  



dc。BeginPath();  



dc。TextOut(10; 10; 〃空心字〃);  



dc。EndPath();  



// 绘制路径  



dc。StrokePath();  



// 恢复设备上下文的原有设置  



dc。SelectObject(pOldFont);  



dc。SelectObject(pOldPen);  



}  



上面的程序的运行结果如图9。8所示。  



                                                             



                                图9。 8 绘制空心字  



函数FillPath可以使用当前刷子填充路径的内部。按下面的代码修改 

前面的OnPaint成员函数:  



// 应用程序主窗口的重绘函数  



void CMyWnd::OnPaint()  



{  



// 获得窗口的客户区设备上下文句柄  



CPaintDC dc(this);  



// 更改当前字体  


…………………………………………………………Page 568……………………………………………………………

LOGFONT lf;  



dc。GetCurrentFont()…》GetLogFont(&lf);  



CFont font; *pOldFont;  



lf。lfCharSet=134;  



lf。lfHeight=…150;  



lf。lfWidth=0;  



strcpy(lf。lfFaceName; 〃隶书〃);  



font。CreateFontIndirect(&lf);  



pOldFont=dc。SelectObject(&font);  



dc。SetBkMode(TRANSPARENT);  



// 更改当前画笔  



CPen pen(PS_SOLID; 1; RGB(255; 0; 0)); *pOldPen;  



pOldPen=dc。SelectObject(&pen);  



// 更改当前刷子  



CBrush br(HS_DIAGCROSS; RGB(0; 255; 255)); *pOldBrush;  



pOldBrush=dc。SelectObject(&br);  



// 开始一个路径  



dc。BeginPath();  



dc。TextOut(10; 10; 〃空心字〃);  



dc。EndPath();  



// 绘制路径  



dc。StrokeAndFillPath();  



    


…………………………………………………………Page 569……………………………………………………………

                                                      



                      图9。 9 使用刷子填充空心字的内部  



// 恢复设备上下文的原有设置  



dc。SelectObject(pOldFont);  



dc。SelectObject(pOldPen);  



dc。SelectObject(pOldBrush);  



}  



上面的程序的运行结果如图9。9所示。  



    (2) 渐变字  



在完成一个路径之后,如前所述,我们可以调用CDC类的成员函数 

FillPath、StrokePath或StrokeAndFillPath来绘制和填充路径。这 

只是最初级的技巧。更进一步,我们可以使用成员函数 

SelectClipPath将路径选入当前剪辑区域,这样,所有的绘制操作都 

将只作用于这个剪辑区域。  



使用此技巧可以绘制具有渐变颜色效果的字体。如下面的OnPaint成 

员函数所示:  



// 应用程序主窗口的重绘函数  



void CMyWnd::OnPaint()  



{  



// 获得窗口的客户区设备上下文句柄  



CPaintDC dc(this);  



// 更改当前字体  



LOGFONT lf;  



dc。GetCurrentFont()…》GetLogFont(&lf);  


…………………………………………………………Page 570……………………………………………………………

CFont font; *pOldFont;  



lf。lfCharSet=134;  



lf。lfHeight=…150;  



lf。lfWidth=0;  



strcpy(lf。lfFaceName; 〃隶书〃);  



font。CreateFontIndirect(&lf);  



pOldFont=dc。SelectObject(&font);  



dc。SetBkMode(TRANSPARENT);  



// 更改当前画笔为空  



CPen pen(PS_NULL; 1; RGB(255; 0; 0)); *pOldPen;  



pOldPen=dc。SelectObject(&pen);  



// 更改当前刷子  



CBrush br(0); *pOldBrush;  



pOldBrush=dc。SelectObject(&br);  



// 开始一个路径  



dc。BeginPath();  



dc。TextOut(10; 10; 〃渐变字〃);  



dc。EndPath();  



// 绘制渐变效果  



dc。SelectClipPath(RGN_COPY);  



for (int i=255; i》0; i……)  



{  



int iRadius=(600*i)/255;  



dc。SelectObject(pOldBrush);  



br。DeleteObject();  



br。CreateSolidBrush(RGB(255; i; 0));  


…………………………………………………………Page 571……………………………………………………………

dc。SelectObject(&br);  



dc。Ellipse(…iRadius; …iRadius/3; iRadius; iRadius/3);  



}  



// 恢复设备上下文的原有设置  



dc。SelectObject(pOldFont);  



dc。SelectObject(pOldPen);  



dc。SelectObject(pOldBrush);  



}  



在上面的示例中,我们以RGN_COPY方式将路径选作当前剪辑区域,然 

后,在该剪辑区域上进行一系列的绘制操作,这些绘制操作以不同的 

颜色绘制了一系列的同心椭圆,这些同心椭圆有视觉上给用户以渐变 

的感觉。上面的程序的运行结果如图。  



                                                    



                          图9。 10 绘制渐变字  



    (3) 使用不同的光栅模式创建特殊效果  



光栅模式决定了画笔的颜色和屏幕上原有的点的颜色值在进行绘制时 

的组合方式。可以使用类CDC的成员函数SetROP2来设置设备上下文所 

使用的光栅绘制模式。该操作仅对光栅设备起作用。通过指定不同的 

光栅模式,我们可以制造一些特殊的效果,比如说反色字等。  



下面的OnPaint处理函数演示了16种不同的光栅模式,需要注意的 

是,即使是同一种光栅模式,在当前画笔的颜色不同时所产生的结果 

也可能有很大差异。  



// 应用程序主窗口的重绘函数  



void CMyWnd::OnPaint()  



{  


…………………………………………………………Page 572……………………………………………………………

// 获得窗口的客户区设备上下文句柄  



CPaintDC dc(this);  



// 更改当前字体  



LOGFONT lf;  



dc。GetCurrentFont()…》GetLogFont(&lf);  



CFont font1; font2; *pOldFont;  



lf。lfCharSet=134;  



lf。lfWidth=0;  



lf。lfHeight=…12;  



strcpy(lf。lfFaceName; 〃宋体〃);  



font2。CreateFontIndirect(&lf);  



lf。lfHeight=…50;  



lf。lfWeight=1000;  



strcpy(lf。lfFaceName; 〃黑体〃);  



font1。CreateFontIndirect(&lf);  



pOldFont=dc。SelectObject(&font1);  



dc。SetBkMode(TRANSPARENT);  



// 更改当前画笔为空  



CPen pen1(PS_NULL; 1; RGB(0; 0; 0)); pen2(PS_SOLID; 1; RGB(0; 0; 0)); *pOldPen;  



pOldPen=dc。SelectObject(&pen1);  



// 更改当前刷子  



CBrush br(RGB(0; 0; 255)); *pOldBrush;  



pOldBrush=dc。SelectObject(&br);  



// 绘制背景  



for (int i=0; i

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的