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);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
2019-05-14 python-字典