GDI-HRGN区域

 

与画笔、画刷和位图一样,区域也是GDI对象,需要调用DeletObject来删除创建的区域

区域类型句柄为HRGN

 矩形区域:

复制代码
    HDC hdc = ::GetDC(m_hWnd);

    HRGN hrgn = CreateRectRgn(10, 10, 100, 100);//创建矩形区域
    /*
    参数1:int   指定区域左上角的 x 坐标(以逻辑单位为单位)
    参数2:int   指定区域左上角的 y 坐标(以逻辑单位为单位)
    参数3:int   指定区域右下角的 x 坐标(以逻辑单元为单位)
    参数4:int   指定逻辑单元中区域右下角的 y 坐标
    返回值:如果函数成功,则返回值是区域的句柄
            如果函数失败,则返回值为 NULL
    
    不用时一定要用DeleteObject函数删除该区域
    这个矩形的下边和右边不包含在区域之内
    */

    int n=SelectClipRgn(hdc, hrgn);//选择一个区域作为指定设备环境的当前剪切区域
    /*
    剪切区域也是区域的一种, 窗口在重绘时只会重绘剪切区域中的内容.
    参数1:HDc hdc      设备环境句柄
    参数2:HRGN hrgn     标识被选择的区域
    返回值:返回值表明了区域的复杂度,可以是下列值之一
            NULLREGION:区域为空;
            SIMPLEREGION:区域为单个矩形;
            COMPLEXREGION:区域为多个矩形;
            ERROR:发生错误(以前的剪切区域不受影响)

    要想删除一个设备环境的剪切区域,指定一个空(NULL)区域句柄
    */

    Graphics graphics(hdc);
    SolidBrush brush(Color(150, 0, 0, 255));
    RectF rect = { 10.0f,10.0f,200.0f,200.0f };
    graphics.FillPie(&brush, rect, 0.0, 360.0);  //填充饼图
复制代码

 

    RECT rect = { 10,10,100,100 };
    HRGN hRgn = CreateEllipticRgnIndirect(&rect);//创建矩形区域

 

创建圆角矩形区域 

复制代码
    
    RECT rect = { 10,10,100,100 };
    HRGN hRgn = CreateRoundRectRgn(50, 50, 100, 100,30,30);//创建圆角矩形区域
    /*
    参数1:int   指定区域左上角的 x 坐标(以逻辑单位为单位)
    参数2:int   指定区域左上角的 y 坐标(以逻辑单位为单位)
    参数3:int   指定区域右下角的 x 坐标(以逻辑单元为单位)
    参数4:int   指定区域右下角的 y 坐标(以逻辑单元为单位)
    参数5:int nWidthEllipse   圆角的宽度
    参数6:int nHeightEllipse  圆角的高度
    返回值:如果函数成功,返回该区域的句柄
            如果函数失败,返回NULL
    */


    HDC hdc = ::GetDC(m_hWnd);
    int n = SelectClipRgn(hdc, hRgn);//选择剪切区域
    RECT rect1 = { 10,10,200,200 };
    HBRUSH hbr;
    hbr = CreateSolidBrush(RGB(255, 0, 0));
    SelectObject(hdc, hbr);
    FillRect(hdc, &rect1, hbr);//填充矩形

    DeleteObject(hbr);
    DeleteObject(hRgn);
    ::ReleaseDC(m_hWnd, hdc);
复制代码

 

创建椭圆区域 

复制代码
    
    HRGN hRgn = CreateEllipticRgn(50, 50, 200, 100);//创建椭圆区域
    /*
    参数1:int   指定区域左上角的 x 坐标(以逻辑单位为单位)
    参数2:int   指定区域左上角的 y 坐标(以逻辑单位为单位)
    参数3:int   指定区域右下角的 x 坐标(以逻辑单元为单位)
    参数4:int   指定区域右下角的 y 坐标(以逻辑单元为单位)
    
    返回值:如果函数成功,返回该区域的句柄
            如果函数失败,返回NULL
    */


    HDC hdc = ::GetDC(m_hWnd);
    int n = SelectClipRgn(hdc, hRgn);//选择剪切区域
    RECT rect1 = { 10,10,200,200 };
    HBRUSH hbr;
    hbr = CreateSolidBrush(RGB(255, 0, 0));
    SelectObject(hdc, hbr);
    FillRect(hdc, &rect1, hbr);//填充矩形

    DeleteObject(hbr);
    DeleteObject(hRgn);
    ::ReleaseDC(m_hWnd, hdc);
复制代码

 

RECT rect = { 50,50,200,100 };
    HRGN hRgn = CreateEllipticRgnIndirect(&rect);//创建椭圆区域

 

创建多边形区域 

复制代码
    
    RECT rect = { 50,50,200,100 };
    POINT p[22] = { 140,49,262,14,346,92,287,186,153,165/* */,129,140,76,39,153,47,63,45,20 };
    HRGN hRgn = CreatePolygonRgn(p,5, WINDING);//创建多边形区域
    /*
    创建一个由一系列点围成的区域。windows在需要时自动将最后点与第一点相连以封闭多边形
    参数1:LPPOINT lpPoints  指向 POINT 结构的数组的指针,这些结构以逻辑单元定义多边形的顶点。 假定多边形已闭合。 每个顶点只能指定一次
            【点的顺序:顺时针】
    参数2:int nCount  多边形的点数
    参数3:int nMode    填充模式
            ALTERNATE  封闭区域内部画随便一条射线,只有这条射线能穿过了奇数条边界线时才填充封闭区域
            WINDING=1    方法一样,如为奇数,填充该区域;如为偶数则要根据边框线的方向来判断:如果穿过的边框线在不同方向的边框线数目相等,则不填充,如不等,则填充
    
    
    返回值:如果函数成功,返回该区域的句柄
            如果函数失败,返回NULL
    */


    HDC hdc = ::GetDC(m_hWnd);
    int n = SelectClipRgn(hdc, hRgn);//选择剪切区域


    RECT rect1 = { 10,10,400,400 };
    HBRUSH hbr;
    hbr = CreateSolidBrush(RGB(255, 0, 0));
    SelectObject(hdc, hbr);
    FillRect(hdc, &rect1, hbr);//填充矩形

    DeleteObject(hbr);
    DeleteObject(hRgn);
    ::ReleaseDC(m_hWnd, hdc);
复制代码

 

创建多个多边形区域

复制代码
    POINT p[14] = { 64,51,138,22,133,87,94,60,193,49,219,120,134,175,93,124,110,95,200,109,321,131,287,203,191,241,173,134 };
    int pn[3] = { 3,6,5 };
    HRGN hRgn = CreatePolyPolygonRgn(p,pn, 3, WINDING);//创建多个多边形区域
    /*
    创建由一系列多边形组成的区域。 多边形可以重叠
    参数1:const POINT *pptl  指向 POINT 结构的数组的指针,该数组以逻辑单元定义多边形的顶点。 
            多边形是连续指定的。 每个多边形都假定为闭合,每个顶点仅指定一次
    参数2:const INT   *pc   指定每个多边形的点数
    参数3:int cPoly         指定多边形的总数
    参数4:int iMode      描述多边形填充模式。可为ALTERNATE 或 WINDING常数
    
    返回值:如果函数成功,返回该区域的句柄
            如果函数失败,返回NULL
    */


    HDC hdc = ::GetDC(m_hWnd);
    int n = SelectClipRgn(hdc, hRgn);//选择剪切区域


    RECT rect1 = { 10,10,400,400 };
    HBRUSH hbr;
    hbr = CreateSolidBrush(RGB(255, 0, 0));
    SelectObject(hdc, hbr);
    FillRect(hdc, &rect1, hbr);//填充矩形

    DeleteObject(hbr);
    DeleteObject(hRgn);
    ::ReleaseDC(m_hWnd, hdc);
复制代码

 

 

 

 

 

 

 

 

 

 

 

posted @   天子骄龙  阅读(104)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
历史上的今天:
2019-05-14 python-字典
点击右上角即可分享
微信分享提示

目录导航