图形编程基础_GDI对象基类

align="right" marginwidth="0" marginheight="0" src="http://sinaggadqg.googlegroups.com/web/NewGoogleBlue.html?gda=QVQF_kMAAAD8hsGaKON9rvrqVWpRQ0yFR9DYEYnS6p1qPgjRTX2SBGG1qiJ7UbTIup-M2XPURDREwKy6qIHiIHsiQYKPAHycuUF_SYovNIKBh6rOeo0tEQ" frameborder="0" width="336" scrolling="no" height="280">

        CGdiObject类为各种Wi ndows 图形设备接口(GD I) 对象,如位图、区域、画刷、画笔、调色板、字体等提供了一些基本类。我们不会直接构造一个CGdiObject对象,而是使用某一个派生类如CPen 或CBrush创建。

    基本绘图对象类主要包括CBitmap类、CBrush类、CFont类、CPen类、CRgn类和CPallete类:

CBitmap:位图是一种位矩阵,每一个显示像素都对应于其中的一个或多个位。用户可以利用位图来表示图像,也可以利用它来建立画刷。

CBrush:画刷定义了一个位图形式的像素,利用它可以对区域内部进行填充。

CFont:字体是一种具有某种风格和尺寸的所有字符的集合,它常常被当作资源存于磁盘中,有一些字体依赖于设备。

CPen:画笔是一种用来画线及绘制有形边框的工具,用户可以指定其颜色及宽度,也可指定线型画实线、点线、虚线等。

CRgn:区域是由多边形、椭圆等组合形成的一种范围,可以利用它来进行填充、裁剪及鼠标点中测试。

CPallete:调色板是一种颜色映射接口,它允许应用程序在不干扰其他应用程序的前提下,充分利用输出设备的颜色描绘能力。

    通常情况下,都使用GDI绘图对象类所创建的对象进行绘制各种图形。一般是先构造所需要得绘图类对象,然后将其选入设备环境(DC),即可利用CDC类的SelectObject成员函数将GDI对象选入设备环境中,也可利用CDC类的SelectStockObject成员函数将Windows中预先定义好的GDI对象(库存GDI对象)选入设备环境中,使用库存GDI对象后无需删除它们。

参见CDC::SelectStockObject的定义:

virtual CGdiObject*  SelectStockObject ( int  nIndex ) ;

    返回值:如果成功,则返回被替换的CGdiObject 对象指针, 实际对象是CPen ,CBrush 或CFon t;否则返回值为NULL。

    参数nIndex:指定需要的库存对象种类, 可以为下列值之一:

    l BLACK_BRUSH 黑色画刷。

    l DKGRAY_BRUSH 深灰色画刷。

    l GRAY_BRUSH 灰色画刷。

    l HOLLOW_BRUSH 空心画刷。

    l LTGRAY_BRUSH 浅灰色画刷。

    l NULL_BRUSH 空画刷。

    l WHITE_BRUSH 白色画刷。

    l BLACK_PEN 黑色画笔。

    l NULL_PEN 空笔。

    l WHITE_PEN 白色画笔。

    l ANSI_FIXED_FONT AN  I固定系统字体。

    l ANSI_VAR_FONT ANSI 变化系统字体。

    l DEVICE_DEFAULT_FONT 依赖设备的字体。

    l OEM_FIXED_FONT 依赖OEM 的固定字体。

    l SYSTEM_FONT系统字体。缺省地, Wi ndows 使用系统字体绘制菜单、对话框控件和其它文本。Windows 3.0 及其后版本, 系统字体具有比例宽度, 早期版本则使用固定宽度的系统字体。

    l STSTEM_FIXED_FONT 在早于Windows 3.0 的版本中使用的固定宽度系统字体。该对象与Wi n d o w s 早期版本兼容。

    lDEFAULT_PALETTE 缺省彩色调色板,含有系统调色板中的2 0种静态颜色。

    说明:选择一个与预先定义的库存笔、画刷或字体对应的CGdiObject 对象。

图形编程基础_GDI对象CPen

CPen类

        CObject-->CGdiObject-->CPen

        CPen 类封装了Windows 图形设备接口(G D I) 画笔。

1. 构造CPen对象,有3个构造函数:

        CPen( );

        CPen( int nPenStyle, int nWidth, COLORREF crColor );
        throw( CResourceException );

        CPen( int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nStyleCount = 0, const DWORD* lpStyle = NULL );
        throw( CResourceException );

    参数nPenStyle:指定画笔的风格。在构造函数的第一个版本中, 此参数可以取下列值之一:

    l PS_SOLID 创建一支实线画笔。

    l PS_DASH 创建一支虚线画笔。只有当画笔宽度为1 或更小(以设备单位计算) 时才有效。

    l PS_DOT 创建一支点线画笔。只有当画笔宽度为1 或更小(以设备单位计算) 时才有效。

    l PS_DASHDOT 创建一支虚线和点交替的画笔。只有当画笔宽度为1或更小(以设备单位计算)时才有效。

    l PS_DASHDOTDOT 创建一支虚线和两点交替的画笔。只有当画笔宽度为1 或更小( 以设备单位计算) 时才有效。

    l PS_NULL 创建一支空画笔。

    l PS_INSIDEFRAME 创建一支画笔,该画笔在Wi n d o w s G D I 输出函数所产生的封闭形状的框架内画线,此输出函数指定一个限定矩形( 例如, Ellipse ,Rectangle , R o u n d R e c t,Pie 和Chord 成员函数),当此风格用于没有指定限定矩形的Wi ndowsGDI 输出函数( 例如LineTo成员函数)时,此画笔的绘制区域不受框架的限制。第二种版本的CPen 构造器指明了类型、风格、尾帽和连接等属性组合。来自每个类别的值应使用位操作符(1 ) 组合起来, 笔的风格可以是下列之一:

    l PS_GEOMETRIC 创建一支几何画笔。

    l PS_COSMETIC 创建一支装饰画笔。

        CPen 构造函数的第二个版本为nPen Style 添加了下列一些画笔风格:

    l PS_ALTERNATE 创建一支交替设置像素的画笔(此风格只用于装饰画笔) 。

    l PS_USERSTYLE 创建一支使用用户提供的风格数组的画笔。

    尾帽可以是下列值之一:

    l PS_ENDCAP_ROUND 尾帽是圆的。

    l PS_ENDCAP_SQUARE 尾帽是方的。

    l PS_ENDCAP_FLAT 尾帽是平面的。

    连接可以是下列值之一:

    l PS_JOIN_BEVEL 连接是斜截式的。

    l PS_JOIN_MITER 当连接在::SetMiterLimit 函数所设置的当前限制之内时, 连接是斜接式的。如果连接超出这个限制则成为斜截式的。

    l PS_JOIN_ROUND 连接是圆的。

        参数nWidth:指定画笔的宽度。

    l 对于构造函数的第一个版本来说, 如果这个值是0 , 则不管是什么映射方式, 以设备单位计算的宽度总是一个像素。

    l 对于构造函数的第二个版本来说, 如果nPenStyle 是PS_GEOMETRIC ,则宽度以逻辑单位给出。如果nPenStyle 是PS_COSMETIC , 则宽度必须设置为1 。

        参数crColor:包含了画笔的RGB 值。

        参数pLogBrush:指向一个LOGBRUSH 结构。如果nPenStyle 是PS_COSMETIC,则此LOGBRUSH 结构的lbColor 成员指定画笔的颜色,此LOGBRUSH 结构的lbStyle 成员必须设置为BS_SOLID 。如果nPenStyle 为PS_GEOMETRIC,则此结构的所有成员都必须用于指定画笔画刷属性。

        参数nStyleCount:指定lpStyle 数组的长度( 以双字为单位) 。如果nPenStyle 不是PS_USERSTYLE , 这个值必须是零。

        参数lpStyle:指向一个双字值的数组。第一个值指定一个用户定义的风格中第一段虚线的长度, 第二个值指定第一段空白的长度, 如此等等。如果nPenStyle不是PS_USERSTYLE , 则这个指针必须为NULL。PS_USERSTYLE , 这个值必须是零。指向一个双字值的数组。第一个值指定一个用户定义的风格中第一段虚线的长度, 第二个值指定第一段空白的长度, 如此等等。如果nPenStyle不是PS_USERSTYLE , 则这个指针必须为NULL。

    说明:如果你使用的是没有参数的构造函数, 你就必须用CreatePen, CreatePenIndirect或CreateStockObject 成员函数来初始化所生成的CPen 对象。如果你使用的是带参数的构造函数, 则不再需要进一步的初始化。如果有错误发生, 则带参数的构造函数可能会抛出一个异常, 但是不带参数的构造函数则总是会成功。

2. 初始化CPen对象

        BOOL CreatePen( int nPenStyle, int nWidth, COLORREF crColor );

        BOOL CreatePen( int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nStyleCount = 0, const DWORD* lpStyle = NULL );

    返回值:如果成功则返回非零值或逻辑画笔的句柄; 否则返回0 。

    参数nPenStyle:指定画笔的风格。其可能取值的列表,请参见CPen 构造函数中的nPenStyle参数。

    参数nWidth:指定画笔的宽度。

    l 对于CreatePen 的第一个版本来说, 如果这个值为0 , 则不管是什么映射模式, 以设备单位表示的宽度总是一个像素。

    l 对于CreatePen 的第二个版本,如果nPenStyle 是PS_GEOMETRIC ,则宽度以逻辑单位给出。如果nPenStyle 是PS_COSMETIC , 则宽度必须设置为1 。

    参数crColor:包含画笔的一个R G B 颜色。

    参数pLogBrush:指向一个LOGBRUSH 结构。如果nPenStyle 是PS_COSMETIC ,则此LOGBRUSH 结构的lbColor 成员指定画笔的颜色,此LOGBRUSH 结构的lbStyle 成员必须设置为BS_SOLED。如果nPenStyle 为PS_GEOMETRIC , 则此结构的所有成员都必须用于指定画笔画刷属性。

    参数nStyleCount:指定lpStyle 数组的长度( 以双字为单位) 。如果nPenStyle 不是PS_USERSTYLE , 这个值必须是零。

    参数lpStyle:指向一个双字值的数组。第一个值指定一个用户定义的风格中第一段虚线的长度, 第二个值指定第一段空白的长度, 如此等等。如果nPenStyle不是PS_USERSTYLE , 则这个指针必须为NULL。

    说明:CreatePen 的第一个版本用指定的风格、宽度和颜色来初始化一支画笔。此画笔以后可选作为任何设备环境的当前画笔。宽度大于1 个像素的画笔总是具有PS_NULL,PS_SOLED 或PS_INSIDEFRAME风格。如果画笔具有PS_INSIDEFRAME 风格和某一不匹配逻辑调色板中颜色的颜色, 则此画笔用一个混合色来进行绘制。PS_SOLID 画笔风格不能用一个混合色来创建一支画笔。当画笔的宽度小于或等于1 时, PS_INSIDEFRAME 风格等同于PS_SOLID 风格。CreatePen 的第二个版本初始化一支具有指定的风格、宽度和刷子属性的逻辑装饰画笔或几何画笔。一支装饰画笔的宽度总是1 ; 几何画笔的宽度总是由世界单位指定。当应用程序创建了一支逻辑画笔之后,它可通过调用CDC::SelectObject 函数来将此画笔选入一个设备环境中。当一支画笔被选入一个设备环境之后, 它就可以用于画直线或曲线。

    l 如果nPenStyle 为PS_COSMETIC 和PS_USERSTYLE, 则l p S t y l e 数组中的项指定风格单位中虚线和空白的长度。一个风格单位由使用此画笔画线的设备定义。

    l 如果nPenStyle 为PS_GEOMETRIC 和PS_USERSTYLE , 则lpStyle 数组中的项指定虚线和空白的长度( 用逻辑单位表示) 。

    l 如果nPenStyle 为PS_ALTERNATE , 则忽略风格单位而交替设置像素。当一个应用程序不再需要一支给定的画笔时,它将调用CGdiObject : : DeleteObject成员函数或销毁CPen 对象,以使资源不再使用。当一支画笔被选入一个设备环境后, 应用程序就不能删除这支画笔了。

 

        BOOL CreatePenIndirect( LPLOGPEN lpLogPen );

    返回值:如果成功则返回非零值; 否则返回0 。

    参数lpLogPen:指向Windows LOGPEN 结构, 此结构包含了此画笔的信息。

    说明:此函数初始化一支画笔, 此画笔具有lp L ogPen 所指向的结构中给定的风格、宽度和颜色。宽度大于1 个像素的画笔总是具有PS_NULL,PS_SOLID 或PS_INSIDEFRAME风格。如果画笔具有PS_INSIDEFRAME 风格和某种不匹配逻辑调色板中颜色的颜色, 则画笔用一支混合色来绘制。如果画笔宽度小于或等于1 , 则PS_INSIDEFRAME 风格等同于PS_SOLID 风格。

 

3. 利用CPen对象绘图

    //如在View类的OnDraw函数中加入使用画笔的代码:

    //创建画笔方法1;

    for(int i=0 ;i<7 ;i++)
    {
        CPen NewPen1(PS_SOLID+i,1,RGB(255,0,0));//(COLORREF)0x000000FF
        CPen *pOldPen=pDC->SelectObject(&NewPen1);
        pDC->MoveTo(10,20*i+10);
        pDC->LineTo(700,20*i+10);
        pDC->SelectObject(pOldPen);
    }

    //创建画笔方法2;
    /*
    for(int j=0 ;j<7 ;j++)
    {
        CPen NewPen2;
        NewPen2.CreatePen(PS_SOLID,j,(COLORREF)0x00FF0000);//
        CPen *pOldPen1=pDC->SelectObject(&NewPen2);
        pDC->MoveTo(10,160+20*j);
        pDC->LineTo(700,160+j*20);
        pDC->SelectObject(pOldPen1);
    }
    */
    //创建画笔方法3;
    /*
    CPen NewPen3 ;
    //设置LOGPEN结构;
    LOGPEN lp ;
    lp.lopnColor=(COLORREF)0x0000FF00 ;
    lp.lopnStyle=PS_SOLID ;
    lp.lopnWidth.x=4 ;
    //创建画笔;
    NewPen3.CreatePenIndirect(&lp) ;
    CPen* pOldPen2=pDC->SelectObject(&NewPen3) ;
    pDC->MoveTo(10,330) ;
    pDC->LineTo(700,330) ;
    //恢复画笔对象;
    pDC->SelectObject(pOldPen2) ;
    */


 

图形编程基础_GDI对象CBrush

CBrush类

    CObject-->CGdiObject-->CBrush

    类CBrush 封装了Windows 图形设备接口(GDI)中的画刷。使用CBrush对象之前要构造它,然后传给需要画刷的CDC 成员函数。画刷可以是实线的、阴影线的或图案的。

1. 构造CBrush对象

        CBrush( );

        CBrush( COLORREF crColor );
        throw( CResourceException );

        CBrush( int nIndex, COLORREF crColor );
        throw( CResourceException );

        CBrush( CBitmap* pBitmap );
        throw( CResourceException );

    参数crColor:指定画刷的前景色( RGB 方式)。如果画刷是阴影线型的, 则指定阴影线的颜色。

    参数nIndex:指定画刷阴影线采用的风格, 取值如下:

    l HS_BDIAGONAL     45 度的向下影线( 从左到右)

    l HS_CROSS   水平和垂直方向以网格线作出阴影

    l HS_DIAGCROSS    45 度的网格线阴影

    l HS_FDIAGONAL   45 度的向上阴影线( 从左到右)

    l HS_HORIZONTAL 水平的阴影线

    l HS_VERTICAL 垂直的阴影线

    参数pBitmap:指向CBitmap 对象的指针, 该对象指定了画刷要绘制的位图。

    说明:类CBrush 一共有四个覆盖的构造函数。不带参数的那个构造函数构造一个未初始化的CBrush 对象, 在使用该对象之前需要另外初始化。如果使用了不带参数的那个构造函数,则必须用CreateSolidBrush 、CreateHatchBrush 、CreateBrushIndirect、CreatePatternBrush 或CreateDIBPatternBrush 来初始化返回的CBrush 对象。如果使用了带参数的构造函数,则不再需要初始化CBrush 对象。带参数的构造函数在出错时会产生一个异常, 而不带参数的构造函数总是成功返回。只带有一个参数COLORREF 的构造函数用指定的颜色构造一个实线型的画刷。颜色是一个RGB 值, 可以用WINDOWS.H 中的宏RGB 构造出来。

    带两个参数的构造函数构造一个阴影线型的画刷, 参数nIndex 指定了阴影线模式的指数(index )。参数crColor 指定了画刷的颜色。

    带有一个CBitmap 型参数的构造函数构造一个模式化的画刷。参数指定一个位图。该位图应该是已经用CBitmap::CreateBitmap 、CBitmap::CreateBitmapIndirect 、CBitmap : : LoadBitmap 或CBitmap::CreateCompatiableBitmap 建立或加载的位图。填充模式下的位图的最小尺寸为8 像素× 8 像素。

2. 初始化CBrush对象

        BOOL CreateSolidBrush( COLORREF crColor );

    返回值:调用成功时返回非零值, 否则为0 。

    参数crColor:指定画刷颜色的一个COLORREF 结构。该颜色指定了一个RGB 颜色值, 可以用头文件WINDOWS.H 中的宏RGB 生成。

    说明:本函数用指定的颜色初始化画刷。随后该画刷就可用于任何设备上下文的当前画刷。当应用使用完CreateSolidBrush 创建的画刷之后, 应该从设备上下文中移出该画刷。

 

        BOOL CreateHatchBrush( int nIndex, COLORREF crColor );

    返回值:调用成功时返回非零值, 否则为0 。

    参数nIndex:指定画刷的阴影线风格。可取的值如下:

    l HS_BDIAGONAL    45 度的向下影线( 从左到右)

    l HS_CROSS       水平和垂直方向以网格线作出阴影

    l HS_DIAGCROSS     45 度的网格线阴影

    l HS_FDIAGONAL    45 度的向上阴影线( 从左到右)

    l HS_HORIZONTAL 水平的阴影线

    l HS_VERTICAL 垂直的阴影线

    参数crColor:指定画刷的前景色(RGB 形式的值),就是阴影的颜色。要了解更详细的信息, 请参阅联机文档“ Win32 SDK ” 中关于COLORREF的描述。

    说明:本函数用指定的阴影模式和颜色初始化画刷。随后该画刷就可以被选为任何设备上下文的当前画刷了。

 

        BOOL CreatePatternBrush( CBitmap* pBitmap );

    返回值:调用成功时返回非零值, 否则为0 。

    参数pBitmap:指定一个位图。

    说明:本函数用位图指定的模式初始化画刷。此画刷随后就可用于任何支持光栅操作的设备上下文。由bBitmap 指定的位图一般用以下的函数初始化: CBitmap:: CreateBitmap 、CBitmap::CreateBitmapIndirect 、CBitmap::LoadBitmap 或Cbitmap:: CreateCompatibleBitmap 。用作填充模式的位图应该是8 像素× 8 像素的。如果位图太大,Wi ndows将用该位图的左上角的8 行8 列的像素来创建填充模式。删除模式画刷时不会影响相关的位图。这意味着可以用一个位图来创建任意个模式画刷。

    采用黑白位图( 1 位面、每像素1 位) 创建的画刷使用当前的文本颜色和背景色。位值置为0 的像素点将用当前的文本颜色绘制, 位值置为1的像素点将用当前的背景色绘制。

 

        BOOL CreateBrushIndirect( const LOGBRUSH* lpLogBrush );

    返回值:调用成功时返回非零值, 否则为0 。

    参数lpLogBrush:指向LOGBRUSH 结构的指针, 结构中记录了画刷的相关信息。

    说明:本函数用结构LOGBRUSH 中指定的风格、颜色和模式初始化画刷。以后,该画刷可以被选为任何设备上下文的当前画刷。

    采用黑白位图( 1 位面、每像素1 位) 创建的画刷使用当前的文本颜色和背景色。位值置为0 的像素点将用当前的文本颜色绘制。位值置为1的像素点将用当前的背景色绘制。

 

        BOOL CreateDIBPatternBrush( HGLOBAL hPackedDIB, UINT nUsage );

        BOOL CreateDIBPatternBrush( const void* lpPackedDIB, UINT nUsage );

    返回值:调用成功时返回非零值, 否则为0 。

    参数hPackedDIB:指定一个全局内存对象, 其中包含了一个压缩的独立于设备的位图( DIB )

    参数nUsage:指明BITMAPINFO 数据结构( 压缩的DIB 中的一部分)的bmiColors[]成员是否包含明确的RGB 值或指向当前逻辑调色板的索引值。参数必须取以下值之一:

    l DIB_PAL_COLORS 颜色表由一个1 6 位的索引数组组成。

    l D I B _ R G B _ C O L O R S 颜色表中包含字母式的R G B 颜色值。

下面这个值只在第二个函数中有效:

    l DIB_PAL_INDICES 未提供颜色表。位图中包含了指向画刷选中的设备上下文的逻辑调色板的索引。

    参数lpPackedDIB:指向一个包括了BITMAPINFO 结构的压缩的DIB 。BITMAP INFO结构后紧跟着的是定义位图像素的字节数组。

    说明:本函数用DIB 指定的模式初始化画刷。画刷随后就可以被任何支持光栅操作的设备上下文选中。

        CreateDIBPatternBrush 函数的两个版本在处理DIB 时有些不同:

    l 在前一个函数中, 取得DIB 的句柄需要调用Wi ndows 函数::G lobalAlloc 来分配内存, 然后用DIB 填充这块内存。

    l 在后一个函数中, 不再需要调用函数::G lobalAlloc 为压缩的DIB 分配内存。

    一个压缩的DIB 由一个BITMAPINFO 结构和紧跟着的一个字节数组( 该数组定义了位图的像素) 构成。用作填充模式的位图应该是8 像素× 8像素的。如果位图太大, Wi n d o w s 将用该位图的左上角的8 行8 列的像素来创建填充模式。

    当应用选择一个两种颜色的DIB 模式到一个黑白的设备上下文中时,Wi ndows 将忽略DIB 中指定的颜色, 而用该设备上下文中当前文本的颜色和背景色显示模式画刷。DIB 中对应于第一种颜色的像素( 在DIB颜色表偏移为0 处) 将采用文本的颜色显示。DIB 中对应于第二种颜色的像素( 在DIB 颜色表偏移为1 处) 将采用背景色显示。

 

        BOOL CreateSysColorBrush( int nIndex );

    返回值:调用成功时返回非零值, 否则为0 。

    参数nIndex:指定阴影线画刷的风格。可能的取值如下:

    l HS_BDIAGONAL     45 度的向下影线( 从左到右)

    l HS_CROSS        水平和垂直方向以网格线作出阴影

    l HS_DIAGCROSS    4 5 度的网格线阴影

    l HS_FDIAGONAL    4 5 度的向上阴影线( 从左到右)

    l HS_HORIZONTAL 水平的阴影线

    l HS_VERTICAL     垂直的阴影线

    说明:本函数初始化画刷的颜色。随后该画刷就可用于任何设备上下文的当前画刷。

    当应用使用完CreateSysColorBrush 创建的画刷之后, 应该从设备上下文中移出该画刷。

 

3. 使用画刷CBrush:

    //如在View类的OnDraw函数中加入使用画刷的代码:

    //创建画刷方法1;
    LOGBRUSH lb;
    lb.lbStyle =BS_HATCHED;
    lb.lbColor=(COLORREF)0x00FF0000;
    lb.lbHatch=HS_CROSS;
    CBrush NewBrush1;
    NewBrush1.CreateBrushIndirect(&lb);
    CBrush* pOldBrush1=pDC->SelectObject(&NewBrush1);
    pDC->Rectangle(50,50,200,300);
    pDC->SelectObject(pOldBrush1);

    //创建画刷方法2;
    CBrush NewBrush2((COLORREF)0x0000FF00);
    CBrush* pOldBrush2=pDC->SelectObject(&NewBrush2);
    pDC->Rectangle(250,50,400,300);
    pDC->SelectObject(pOldBrush2);

    //创建画刷方法3;
    CBrush NewBrush3(HS_BDIAGONAL,(COLORREF)0x000000FF);
    CBrush* pOldBrush3=pDC->SelectObject(&NewBrush3);
    pDC->Rectangle(450,50,600,300);
    pDC->SelectObject(pOldBrush3);

 

 

图形编程基础_GDI对象CFont

CFont类

    CObject-->CGdiObject-->CFont

        CFont 类封装了一个Windows 图形设备接口(GDI) 字体并提供管理字体的成员函数。为使用一个CFont 对象,可构造一个CFont 对象并用CreatFont  ,CreateFontIndirect ,CreatePointFont 或CreatePointFontIndirect  将一个Windows 字体附加给它, 然后用对象的成员函数操纵字体。CreatePointFont 和CreatePointFontIndirect 常比使用CreateFontIndirect更容易, 因为它们自动将字体高度从点大小变为逻辑单位。

1. 构造CFont对象

        CFont( );

    构造一个CFont 对象, 在结果对象被使用之前必须先用CreateFo t ,CreateFontIndirect , CreatePointFont 或CreatePointFontIndirect 初始化。

 

2. 初始化CFont对象

        BOOL CreateFont( int nHeight, int nWidth, int nEscapement, int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline, BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision, BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily, LPCTSTR lpszFacename );

    返回值:如果成功, 则返回非零值, 否则为0 。

    参数nHeight:以逻辑单位方式指定字体的高度, 字体高度可为以下值之一:

    l 大于0 , 此时高度被转化为设备单位, 与可用字体的网格高度相比较。

    l 等于0 , 此时使用合理的缺省大小。

    l 小于0 , 此时高度被转化为设备单位, 而绝对值与可用字体的字符高度相比较。

        nHeight 绝对值在转化后不可超过16 , 384 设备单位。在所有的高度对比中, 如果字体超过所要求的值, 则字体映像器中大字体不会超过所需大小, 小字体也不会超过。

    参数nWidth:指定字体中字符平均宽度( 用逻辑单位)。如果为0 , 设备方向比率与可用字体的数字方向比率相比较, 找一个最近的匹配, 它由值的差的绝对值决定。

    参数n E s c a p e m e n t:指定偏离垂线与x 轴在显示面上的夹角( 用0.1 度单位)。偏离垂线时从一行中开始一个字符到最后一个字符的线, 此角从x 轴逆时针方向度量。

    参数n O r i e n t a t i o n:指定字符基线和x 轴之间的夹角( 用0.1 度单位)。此度数在座标轴中由x 轴逆时针方向度量时坐标系中y 轴向下, 顺时针方向从x 轴旋转时, y 轴向上。

    参数n W e i g h t:指定字体磅数( 用每1 0 0 0 点中墨点像素数计)。尽管n W e i g h t 可为0 到1 0 0 0 中的任意整数值, 常用值和常数如下:

    常数                            值

        FW_DONTCARE                                    0

        FW_THIN                                                1 0 0

        FW_EXTRALIGHT                                 2 0 0

        FW_ULTRALIGHT                                2 0 0

        FW_LIGHT                                             3 0 0

        FW_NORMAL                                         4 0 0

        FW_REGULAR                                       4 0 0

        FW_MEDIUM                                         5 0 0

        FW_SEMIBOLD                                    6 0 0

        FW_DEMIBOLD                                     6 0 0

        FW_BOLD                                               7 0 0

        FW_EXTRABOLD                                 8 0 0

        FW_ULTRABOLD                                 8 0 0

        FW_BLACK                                           9 0 0

        FW_HEAVY                                             9 0 0

    以上各值是大约数, 实际外观依赖字体大小, 有的字体仅有FW _N O R M A L , F W _R E G U L A R , F W _BOLD 磅数。如果FW _D O N T C A R E 被指定, 则使用缺省磅数。

    参数bItalic:指定字体是否为斜体。

    参数b U n d e r l i n e:指定字体是否带下划线。

    参数b S t r i k e O u t:指定是否是字体字符突出。如果设置为非零, 则突出。

    参数n C h a r S e t:指定字体的字符集, 以下是预定义的常数和值:

    常数                            值

        ANSI_CHARSET                                     0

        DEFAULT_CHARSET                             1

        SYMBOL_CHARSET                             2

        SHIFTJIS_CHARSET                             1 2 8

        OEM_CHARSET                                     2 5 5

        OEM 字符集依赖于系统。

    具有其它字符集的字体可能存在于系统之中。一个使用未知字符集字体的应用不能翻译或解释一个以此字符集着色的字符串, 相反, 应将字符串直接输入到设备驱动。字体映射器不使用DEFAULT_CHARSET 值, 一个应用可以使用此值让字体名和大小完全描述逻辑字体。如果指定的名字不存在, 为避免不可预料的结果, 应用应谨慎地使用DEFAULT_CHARSET 。

    参数n OutPrecision:指定所需的输出精度。输出精度定义输出与需要的字体高度、宽度,字符方向、走格、间距之间的接近程度, 可以为以下值之一:

        OUT_CHARACTER_PRECIS

        OUT_STRING_PRECIS

        OUT_DEFAULT_PRECIS

        OUT_STROKE _ PRECIS

        OUT_DEVICE_PRECIS

        OUT_TT_PRECIS

        OUT_RASTER_PRECIS

    应用在系统包含多个给定名字的字体时, 可用OUT_DEVICE_PRECIS,OUT_RASTER_PRECIS 和OUT_TT_PRECIS值控制一个字体映射器如何选择一种字体。例如, 如果一个系统包含一个名叫S y m b o l 的字体, 以光栅和T r u e T y p e 形式存在, 指定OUT_TT_PRECIS 使字体映射器选择TrueType 类型( 指定OUT_TT_PRECIS 强制字体映射器选择TrueType 字体( 当指定字体名与一个设备或光栅字体相匹配),即使没有同名的TrueType 字体。

    参数nClipPrecision:指定所需的剪贴精度。剪贴精度定义了如何剪贴部分超过剪贴范围的字符, 可为以下值之一:

        CLIP_CHARACTER_PRECISCLIP_MASK

        CLIP_DEFAULT_PRECISCLIP_STROKE_PRECIS

        CLIP_ENCAPSULATECLIP_TT_ALWAYS

        CLIP_LH_ANGLES

    要使用插入的只读字体, 应用必须指定CLIP_ENCAPSULATE 。要建立设备旋转、TrueType 和矢量字库, 应用可以用OR 操作符将CLIP_LH_ANGLES 值与其它nClipPrecision 值组合。如果CLIP_LH_ANGLES位被设置, 所有字体的旋转都依赖于坐标系的定位是左手方向还是右手方向( 要了解有关坐标轴定位的更多信息, 请参阅nOrientation 参数的描述)。如果CLIP_LH _ANGLES 未被设置,设置字体常逆时针方向旋转, 但其它字体的旋转依赖于坐标系的旋转定位。

    参数nQuality:指示字体的输出质量, 定义了GDI 必须使逻辑字体特性和物理字体特性相匹配的程度。可为以下值之一:

    l DEFAULT_QUALITY 字体的外观无关紧要。

    l DRAFT_QUALITY 当PROOF_QUALITY 使用时,字体的外观不太重要。对GDI 光栅字体来说,允许缩放。黑体、斜体、下划线、突出字体和综合处理在需要时可用。

    l PROOF_QUALITY 字体的字符质量比精确的逻辑字体特性的匹配更重要。对G DI 光栅字体, 缩放无效, 大小最接近的字体被选用。黑体、斜体、下划线、突出和综合处理在需要时可用。

    参数nPitchAndFamily:指定字体的间距和家族。两个低位指定字体的间距, 可为以下值之一:

        DEFAULT_PITCH

        VARIABLE_PITCH

        FIXED_PIT H

    应用可以将T M P F_TRUETYPE 加到nPitchAndFamily 参数中来选择一个TrueType 字体。高四位指定字体家族, 可为以下值之一:

    l FF_DECORATIVE 新奇字体, 如以前英格兰的字体。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值