【Demo 0007】绘图对象 画笔

正如前文所述,DC 相当黑板, 黑板有了没笔也画不了图, 现在我们就来看看画笔(GDI 图形对象之一).

GDI 绘图对象包括: 画笔,画刷,位图,调色板,区域, 每一个绘图对象都有着自身特点和功能,今天请的画笔又有什么功能呢?  画笔主要用于绘制直线和曲线,还有着:大小, 颜

色, 线条类型等属性; 

一、创建画笔

     GDI提供了三种方法:

     1.  HPEN CreatePen(int fnPenStyle, nWidth, COLORREF crColor)

          fnPenStyle    - 线条的风格: PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT, PS_DASHDOTDOT, PS_NULL,  PS_INSIDEFRAME

          nWidth         - 线条宽: 为0是表示单个象素宽,当设定一定宽时线条风格会自动以PS_SOLID风格显示

          crColor         - 线条颜色

     2.  HPEN CreatePenIndirect(const LOGPEN* logPen)

          typedef struct tagLOGPEN
         {
                UINT        lopnStyle;
                POINT       lopnWidth;
                COLORREF    lopnColor;
         } LOGPEN, *PLOGPEN, NEAR *NPLOGPEN, FAR *LPLOGPEN;

         此函数对函数1参数进行了封装,意义完成一样;       

     3.  HPEN ExtCreatePen(DWORD dwPenStyle, DWORD dwWidth, const LOGBRUSH* lplb, DWORD dwStyleCount, const DWORD* lpStyle)

          dwPenStyle          --  其线条包括:类型,风格,末端样式,加入等每一组风格只选其一,风格与风格之间通过或“|”关联

                                   线条类型: 

                                         PS_GEOMETRIC    几何画笔
                                         PS_COSMETIC      逻辑画笔

                                    线条风格:

                                         PS_ALTERNATE

                                         PS_SOLD

                                         PS_DASH

                                         PS_DOT

                                         PS_DASHDOT

                                         PS_NULL

                                         PS_USERSTYLE

                                         PS_INSIDEFRAME

                                     末端样式: 

                                          PS_ENDCAP_ROUND

                                         PS_ENDCAP_SQUARE

                                         PS_ENDCAP_FLAT

                                     加入样式:

                                         PS_JOIN_BEVEL

                                         PS_JOIN_MITER

                                        PS_JOIN_ROUND   

          dwWidth              --  线宽,  若dwPenStyle 设有 PS_COSMETIC风格中,此参数只能为1

          lplb                     --  画刷,  若dwPenStyle 设有 PS_COSMETIC风格中, lplb->lbColor 为画笔颜色, lbStyle 必须设为BS_SOILD, 

                                        若dwPenStyle 设有PS_GEOMETRIC风格时,此参数为画刷参数

          dwStyleCount      -- 不作解释 0

          lpStyle                -- 不作解释 NULL

          从名字中可以看出,此函数为函数1的增强函数,它不仅可以实现CreatePen与CreatePenIndirect所有功能,还扩展了它们不支持的功能如:增加了几何画笔, 有了几何画笔可以

         绘制大于宽度1象素的不同线型。几何画笔比CreatePen/CreateIndirect在绘制速度要快。

       

        以下图为线条样式: PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT, PS_DASHDOTDOT, PS_NULL, PS_INSIDEFRAME

        {A67EEAAD-43B4-4F65-AEFF-DF99B31E71E6}

      

二、画笔的使用

     如所有的绘图对象一样,在使用前必须先选入到设备DC中,选入设备DC函数, SelectObject(HDC, HGIDOBJ), 看一下关键代码:


        HPEN hOld = static_cast<HPEN>(SelectObject(hDC, hPen));

        MoveToEx(hDC, rtGrid.left + 10, rtGrid.top + (ii + 1) * nHeight, NULL);
        LineTo(hDC, rtGrid.right - 20, rtGrid.top + (ii + 1) * nHeight);

        SelectObject(hDC, hOld);
        DeleteObject(hPen);

     SelectObject 函数在选入对应的绘图后会返回上一个相同类型的图形对象, 以便恢复原先的绘图对象以及释放被选入的绘图对象并可删除, 对象在使用后要记得删除.

三、画笔相关函数

     SetDCPenColor  -- Sets the current device context pen color.

     使用此函数前需先将备用画笔DC_PEN选入DC中, SelectObject(hDC, GetStockObject(DC_PEN)) ;

演示Demo

原文地址:https://www.cnblogs.com/ztercel/p/2120499.html