友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
喜书网 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

C语言实例教程(PDF格式)-第89章

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




lfEscapement成员的值设置为400,这样,文本将以向上倾斜40度 

(lfEscapement的值的单位为1/10度)的角度进行输出。接着,我们将 

该字体对象通过CDC的成员函数SelectObject选入设备上下文中作为 

设备上下文的当前字体。CDC类的成员函数GetTextExtent可以在输出 

一个字符串之前得到该输出字符串的大小,以便于我们可以恰当的安 

排字符串的输出位置。需要注意的是,通过该成员函数得到的度量值 

不会受到我们在lfEscapement中设置的值的影响。在程序示例中,我 

们通过成员函数GetTextExtent得到字符串〃lfEscapement=  400〃在输 

出时的长度和宽度,然后根据所得的结果计算得出以40度角输出文本 

串的合适的起始位置,最后调用CDC类的成员函数TextOut以当前字体 

输出字符串〃lfEscapement= 400〃。  



  l 注意:  



  l 不管当前的lfEscapement值如何,函数TextOut总是以输出字符串 

   的第一个字符的起始位置的坐标作为其前两个参数。  



  l 在Windows 95中,lfEscapement和lfOrientation总是具有相同的 

   值,而在Windows NT中,两者在某些情况下可以不相同。  


…………………………………………………………Page 561……………………………………………………………

  l 设置lfFaceName时应该使用库函数strcpy,不要犯这样的错误:  



  l lfFaceName=〃宋体〃;  



       此外,如果为lfFaceName设置了新值,同时也应该将 

       lfCharSet的值设置为相匹配的字符集。如果字符集与字体名 

       不相匹配,将会导致设置不起作用。  



要使文本向下倾斜输出,我们只需简单的将lfEscapement设置为负 

值。如下面的代码所示:  



// 将字体输出方向更改为向下倾斜 40 度  



lf。lfEscapement=…400;  



dc。SelectObject(pOldFont);  



font2。DeleteObject();  



font2。CreateFontIndirect(&lf);  



dc。SelectObject(&font2);  



// 计算字符串合适的输出位置  



dc。TextOut(290…int(sz。cx*cos(DegToRnd(40))); 10; 〃lfEscapement=…400〃);  



上面的代码摘自应用程序FontDemo 。  



  l 注意:  



  l 在调用font2的CreateFontIndirect成员函数创建新的字体对象之 

    前,应该先调用其成员函数DeleteObject删除该字体对象,而当 

    一个GDI图形对象正为设备上下文所使用时,我们不能删除该图形 

   对象,因此在前面的代码 中,我们在删除在font2原有的字体对象 

    之前先将设备上下文的字体对象进行复原。  



接着在消息处理函数CMyWnd::OnPaint中,我们又将lfEscapement成 

员的值设置为0,输出字符串〃lfEscapement=0〃以示对比。  



在随后的代码中,我们演示了lfWeight成员的不同值对字体的笔划粗 

细的影响。我们先将lfWeight值设置为0,以50象素的宋体字绘制了 

一个 “细”字,然后再将lfWeight值设置为1000,以同样大小和同种 

字体绘制了一个 “粗”字。通过如图9。7的输出结果,我们看到字体 

笔划的粗细发生的明显的变化。  


…………………………………………………………Page 562……………………………………………………………

在OnPaint函数返回之前,不要忘记恢复设备上下文的原有字体对 

象,指向该对象的CFont指针在前面被保存到了名为pOldFont的指针 

变量中。我们仍然使用SelectObject将其选入当前设备上下文。  



上面我们来看示例程序FontDemo的另一个主要的功能板块,即枚举当 

前系统中所安装的所有字符并将它添加到一个列表框中。  



首先我们在窗口CMyWnd的WM_CREATE消息的处理函数OnCreate中调用 

CListBox对象lst  (该对象被定义为类CMyWnd的成员变量)的Create成 

员函数。在Create成员函数中,我们指定了列表框的样式包括了 

LBS_USETABSTOPS,该样式允许在列表项中使用制表符,这些制表符 

在显示时会被扩展到指定的位置。  



接着,我们将列表框所使用的字体设置为9磅大小的宋体字。这里我 

们调用的是CFont对象的CreatePointFont成员函数来创建字体。当需 

要创建的指定磅值大小的某种字体时,使用CreatePointFont成员函 

数要方便得多,因此该函数仅需要三个参数,并且,第三个参数在很 

多情况下可以省略。这样,我们就可以避开填写复杂的LOGFONT结 

构。  



在改变列表框字体的同时,我们将列表框中的当前制表位设置为200 

个对话框单位,对话框单位是一种在控件和对话框使用的度量单位。 

每4个水平对话框单位等于以系统字体显示的字符的平均宽度,我们 

还将这个宽度称作对话框基本单位。对话框基本单位的具体量值可以 

通过API函数GetDialogBaseUnits得到,该函数返回值的低位字代表 

对话框水平基本单位,高位字代表对话框垂直基本单位。  



紧接着我们调用了API函数EnumFontFamilies来枚举系统中的所有可 

用字体,该函数使用4个参数,第一个参数为枚举所使用设备上下文 

句柄,我们使用API函数GetDC来得到代表当前窗口的客户区;为了枚 

举系统中的所有字体,我们将第二个参数设置为NULL;第三个参数为 

枚举字体回调函数,这里为EnumFontFamProc,我们将在下面定义该 

回调函数;第四个参数为指向列表框的指针,这个参数将被传递给回 

调函数,由于我们需要将可用的字体添加到列表框中,因此我们可以 

很自然的将指向该列表框指针当前应用程序提供的参数传递给枚举字 

体回调函数。  



枚举字体回调函数的原型在程序中被声明为  



int WINAPI EnumFontFamProc(const LOGFONTA *lplf;   



const TEXTMETRICA *lptm; unsigned long FontType; LPARAM lParam);  


…………………………………………………………Page 563……………………………………………………………

  l 注意:  



  l 在随Visual C++ 5。0提供的Platform SDK (即Win32 SDK)中所给 

    出的EnumFontFamProc的原型为  



  l int CALLBACK EnumFontFamProc( ENUMLOGFONT FAR *lpelf; // pointer to logical

    font data  



  l NEWTEXTMETRIC FAR *lpntm; // pointer to physical…font data  



  l int FontType; // type of font  



  l LPARAM lParam // address of application…defined data  



  l );  



        然而在本程序中使用上面所给的原型将会在编译时导致类型 

        不匹配。正确的回调函数的原型应该如代码清单中所给的那 

        样。  



            



                                                



                   图9。 7 示例程序FontDemo的运行结果  



在本程序中,传递给回调函数的第一个参数lplf为该字体对应的 

LOGFONTA结构,最后一个参数为指向列表框的CListBox指针。第二个 

参数和第三个参数在本程序中没有使用。在本程序中,枚举字体回调 

函数的结构很简单,它只是将字体的字体名和相应的字符集格式化之 

后添加到列表框中。为了使枚举继续进行,回调函数应该返回真值, 

如果回调函数返回了FALSE,则枚举的过程将被终止。  



示例程序FontDemo的运行结果如图9。7所示。  


…………………………………………………………Page 564……………………………………………………………

在类CDC中定义的字体和文本函数如表所示。  



                表9。 5 在类CDC中定义的字体和文本函数  



       成员函数                描述  



       TextOut             在指定位置以当前选定字体绘制字符串  



       ExtTextOut          在指定的矩形区域内使用当前选定字体 

                           绘制字符串  



       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  从输出设备上下文中
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!