画笔

使用现有画笔:

画笔的默认设备环境是 BLACK_PEN。该画笔会绘制一条实心的宽度为 1 像素的黑色线条。

Windows 提供三种“备用画笔”:BLACK_PEN, WHITE_PEN, NULL_PEN。

 

画笔句柄的类型为 HPEN。可用这个类型定义一个变量(例如 hPen):  HPEN hpen ;

调用 GetStockObject() 可以获取备用画笔的句柄。

例如:hPen = GetStockObject(WHITE_PEN);

如果想使用该画笔的话必须将该画笔句柄选入设备环境:

SelectObject(hdc, hPen) ; 或者 SelectObject(hdc,GetStockObject(WHITE_PEN)) ;

现在绘制所有的线条都将使用 WHITE_PEN, 直到另一种设备选入设备环境或者你释放了设备环境句柄。

 

GetStockObject() 介绍:

                  功能:该函数检索预定义的备用笔、刷子、字体或者调色板的句柄。

                  函数原型是    HGDIOBJ GetStockObject(int fnObject) ;

                  参数:    fnObject 指定对象的类型。

SelectObject() 介绍:

                  功能:该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。

                   函数原型:HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj)
                   参数:
                              hdc:设备上下文环境的句柄。
                              hgdiobj:被选择的对象的句柄,该指定对象必须由如下的函数创建。
                   注释:该函数返回先前指定类型的选择对象,一个应用程序在它使用新对象进行绘制完成之后,
                              应该用原始的缺省的对象替换新对象。
例:  SelectObject(hdc, GetStockObject(WHITE_PEN));
         hPen = SelectObject(hdc, GetStockObject(WHITE_PEN));
         此时,设备环境中的当前句柄自然是 WHITE_PEN,而变量 hPen 将是 BLACK_PEN 画笔的句柄。
 

创建,选择和删除画笔:

创建画笔的一般过程:调用 CreatePen 或者 CreatePenIndirect 函数创建一个“逻辑画笔”。

这些函数会返回一个逻辑画笔的句柄。然后调用 SelectObject() 将画笔选入设备环境。

接着就可以用该新画笔来绘制线条了。一次只能有一支画笔被选入设备环境。

释放设备环境之后(或者将其他画笔选入设备环境之后),需要调用 DelectObject() 删除创建的画笔。

 

逻辑画笔是一个“GDI对象”,一个程序可以创建 6 种 GDI 对象:

逻辑画笔,画刷,位图,区域,字体,调色板。

除了调色板之外,所有这些对象都通过 SelectObject() 选入设备环境。

 

控制 GDI 对象时牢记下面三条规则

  •          最终应当删除你所创建的所有 GDI 对象。
  •          当 GDI 对象被选入一个有效的设备环境时,不要删除它。
  •          不要删除备用对象。

CreatePen() 介绍:

        功能:指定的样式、宽度和颜色创建画笔。

        函数原型:HPEN CreatePen(int iStyle, int cWidth, COLORREF Color);

        参数:

                iStyle:指定画笔样式。

                cWidth:以逻辑单位表示的画笔的宽度。

                Color:画笔的RGB颜色。
         返回值:如函数执行成功,就返回指向新画笔的一个句柄,否则返回零。

         关于 nPenStyle 的值:

                     PS_SOLID:画笔画出的是实线
                     PS_DASH:画笔画出的是虚线(nWidth必须不大于1)
                     PS_DOT:画笔画出的是点线(nWidth必须不大于1)
                     PS_DASHDOT:画笔画出的是点划线(nWidth必须不大于1)
                     PS_DASHDOTDOT:画笔画出的是点-点-划线(nWidth必须不大于1)
                     PS_NULL:画笔不能画图。
                     PS_INSIDEFRAME:由椭圆、矩形、圆角矩形、饼图以及弦等生成的封闭对象框时,画线宽度向内扩展。
                                                        如指定的准确RGB颜色不存在,就进行抖动处理。
 
 
 LOGPEN 结构体介绍:(结构体成员和上面的参数意思一样).
typedef struct tagLOGPEN {
  UINT     lopnStyle;
  POINT    lopnWidth; //Windows 仅使用该结构的 x 字段来设置宽度,y 字段会被忽略。
  COLORREF lopnColor;
} LOGPEN, *PLOGPEN, *NPLOGPEN, *LPLOGPEN;

 

CreatePenIndirect() 介绍:

          功能:根据指定的LOGPEN结构创建,逻辑画笔结构。

          函数原型:HPEN CreatePenIndirect( CONST LOGPEN *logpen);

          logpen: LOGPEN结构体变量。

          例:LOGPEN logpen;   hPen = CreatePenIndirect(&logpen);

          返回值:如执行成功,返回指向新画笔的一个句柄;否则返回零。

   
DelectObject() 介绍:
          功能:该函数删除一个逻辑笔、画笔、字体、位图、区域或者调色板。
                     释放所有与该对象有关的系统资源,在对象被删除之后,指定的句柄也就失效了。
           函数原型:BOOL DeleteObject(HGDIOBJ hgdiObject);  
           hgdiObject:逻辑笔、画笔、字体、位图、区域或者调色板的句柄。
           返回值:成功,返回非零值;如果指定的句柄无效或者它已被选入设备上下文环境,则返回值为零。
           注释:当一个绘画对象(如笔或画笔)当前被选入一个设备上下文环境时不要删除该对象。
                     当一个调色板画笔被删除时,与该画笔相关的位图并不被删除,该图必须单独地删除。
 
GetObject() 介绍:
          功能:函数得到指定图形对象的信息,根据图形对象,函数把
                    填满的结构或表项(用于逻辑调色板)数目放入一个指定的缓冲区。
         函数原型:int GetObject(HANDLE  handle, int  cbBuffer, LPVOID  lpvObject);
          参数:
                 handle:指向感兴趣的图形对象的句柄,它可以是这样的一个句柄:
                                逻辑位图、刷子、字体、调色板、笔。
                 cbBuffer:指定将要写到缓冲区的信息的字节数目。
                 lpvObject:指向一个缓冲区的指针,该缓冲区将要检索指定图形对象的信息。
           返回值:如果函数调用成功,且 lpvObject 为一个有效指针,则返回值为贮存到缓冲区的字节数目;
                         如果函数调用成功,且 lpvObject 为Null,则返回值为需要容纳的贮存到缓冲区的信息字节数目;
                         如果函数调用失败,则返回值为0。
 
GetCurrentObject() 介绍:
           功能:该函数得到一个从特定类型中选定目标的设备对象句柄。
           函数原型:HGDIOBJ GetCurrentObject(HDC  hdc,UINT uType);
          参数:
                  hdc:设备上下文环境句柄。
                  uType:指定要查询的对象类型,该参数可取如下一值:
                             OBJ_PEN:笔;OBJ_BRUSH:返回当前选择的画笔;OBJ_PAL:返回当前选择的调色板;
                             OBJ_FONT:返回当前选择的字体;OBJ_BMAP:返回当前选择的位图。
           返回值:如果成功,返回指定对象的句柄;如果失败,则返回NULL。

 

posted @ 2018-07-14 10:14  M-Anonymous  阅读(290)  评论(0)    收藏  举报