【Demo 0010】绘图对象区域

区域作为Windows绘图对象之一,它用于描述一个区域块的形状如:  矩形,带圆角的矩形,圆形以及不规则的多边形等等几乎可以描述所有图形的形状;  GDI除了为其提供了创建不同的区域形状外,还提供了填充,绘制,反色填充和根据区域形状描绘指定大小的边框以及区域间连接,大小比较,判定点或矩形是否在区域内,还有读取包含区域的最大矩形。

一、创建区域

  根据区域形状的不同GDI提供了不同的创建函数

   1.  矩形

        HRGN CreateRectRgn(int nLeft, int nTop, int nRight, int nBotom)

        HRGN CreateRectRgnIndirect(const RECT* rtSrc)

        nLeft       -- 矩形区左上角x坐标

        nTop       -- 矩形区左上角y坐标

        nRight     -- 矩形区右下角x坐标

        nBottom  -- 矩形区右下角的y坐标

        rtSrc        --  矩形区

        根据指定矩区坐标创建矩形区域

   2.  带圆角矩形

        HRGN CreateRoundRectRgn(int nLeft, int nTop, int nRight, int nBotom, int nWidth, int nHeight)

        nLeft        -- 矩形区左上角x坐标

        nTop        -- 矩形区左上角y坐标

        nRight      -- 矩形区右下角x坐标

        nBottom   -- 矩形区右下角的y坐标

        nWidth     -- 圆角的宽度

        nHeight    -- 圆角的高度

        根据指供的矩形区并以特定的宽高为圆角创建圆角矩形

   3.  圆形

        HRGN CreateEllipticRgn(int nLeft, int nTop, int nRight, int nBotom)

        nLeft       -- 矩形区左上角x坐标

        nTop       -- 矩形区左上角y坐标

        nRight     -- 矩形区右下角x坐标

        nBottom  -- 矩形区右下角的y坐标

        nWidth    -- 圆角的宽度

        nHeight    -- 圆角的高度

        根据指供的矩形区并以特定的宽高为圆角创建圆角矩形

   4.  多边形

        HRGN CreatePolygonRgn(CONST POINT* lppt, int nPoints, int nFillMode)

        lppt         -- 多边形各个顶点(各顶点最终必须实现最终闭合)

        nPoints    -- 顶点的个数

        nFillMode  -- 填充模式,主要是多边形在绘制时存在边与边交叉,交叉后会形封闭区,引填充模式针对此封闭工的填充, GDI为此提供两个填充方式:

                          WINDING     -- 无论交叉与否都不填充

                          ALTERNATE –- 不交叉与WINDING 一样, 交叉填充分奇数边和偶数边组合填充

        根据指定的多边形顶角创建多边形区域

  5.   复杂多边形

        HRGN CreatePolyPolygonRgn(const POINT* lppt, CONST INT* nPolyCounts, int nCount, int nFillMode) 

        lppt               -- 所有多边形各个顶点集合

        nPolyCounts   -- 每个多边形由几个顶点组合成的

        nCount          -- 多边形个数

        nFillMode        -- 填充模式(同4)

        根据指定的多边形数创建一个组合多边形组合区域

   注:  区域在使用完后,必须通过DeleteObject函数释放.

                

二、填充区域

  区域在创建后在不填充时是不可见了,因而GDI为区域提供了一些函数来填充, 特点声明, 填充后的区域与图形有所不同,图形由边和图形体构成,而区域不存在边.

  1.  BOOL FillRgn(HDC hDC, HRGN hRgn, HBURSH hBrush)

       用指定画刷填充区域

  2.  BOOL FrameRgn(HDC hDC, HRGB hRgn, HBRUSH hBrush, int nWidth, int nHeight)

       用指定的画刷从左到右从上到下分别填充区域中对应的宽和高

  3.  BOOL PaintRgn(Hdc hDC, HRGN hRgn)

       用当前设备中画刷填充区域

  4.  BOOL InvertRgn(HDC hDC, HRGN hRgn)

       用当前设备中画刷色取反后再填充区域

三、区域判断

  1.  BOOL EqualRegion(HRGN hRgn1, HRGN hRgn2)

       判断二区域是否相等

  2.  BOOL PtInRegion(HRGN hRgn, CONST POINT* ptPoint)

       判断特定点是否在指定的区域中

  3.  BOOL RectInRegion(HRGN hRgn, CONST RECT* rtRect)

      判断特定矩形区是否在指定的区域中

 

四、区域拼接与偏移

  1.  int CombineRgn(HRGN hRgnDest, HRGN hRgnSrc1, HRGN hRgnSrc2, int nCombineMode)

       hRgnDest     -- 拼接后的区域

       hRgnSrc1     -- 原区域

       hRgnSrc2     -- 原区域

       nCombineMode -- 区域与区域拼接的方式,主要模式:

                                 RGN_AND   -- 取两区域交集

                                 RGN_COPY -- 拷贝第一原区域

                                 RGN_DIFF  -- 去除与原区2相交的部分

                                 RGN_OR     --  两区域合集

                                 RGN_XOR   -- 去除相交的区域

       对两个交叉的区域进行拼接

  2.  int OffsetRgn(HRGN hRgn, int nXOffset, int nYOffset)

       hRgn          -- 区域

       nXOffset    -- 水平偏移量

       nYOffset    -- 垂直偏移量

       将指定区域水平或垂直移动特定的单元

     image

五、其它相关函数

     1. BOOL SetRectRgn(HRGN hRgn, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);

     2.  int GetRgnBox(HRGN hRgn, LPRECT lpRc);

演示源码

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