网站首页 > 技术教程 正文
在前面的章节中我们已经介绍了GDI对象:画笔、画刷。本小节将介绍另外一个GDI对象:区域。
区域在剪裁中也扮演着重要角色。InvalidRect函数使显示的矩形区域无效,并产生一 个WM_PAINT消息。例如,可以使用InvalidateRect函数来擦除客户区的内容,并产生一 个WM_PAINT消息:
InvalidateRect (hwnd, NULL, TRUE);
■无效区域和有效区域
可以通过调用GetUpdateRect函数获取无效矩形的坐标,并且使用ValidateRect函数使客户区的矩形有效。当接收到一个WM_PAINT消息时,PAINTSTRUCT结构中的无效矩形的 坐标是可以利用的。这个结构是通过BeginPaint函数填充的。这个无效矩形也定义了一个 “剪裁区域”。不能在剪裁区域之外绘图。
●GetUpdateRect函数
GetUpdateRect函数用于获取指定窗口的更新区域的矩形坐标。GetUpdateRect函数的函数原型如下:
BOOL GetUpdateRect(
HWND hWnd, //指定窗口的句柄,表示要获取更新区域的窗口
LPRECT lpRect, //指向RECT结构的指针,用于接收获取到的更新区域的矩形坐标
BOOL bErase //一个布尔值,指定在绘制更新区域之前是否擦除背景
);
函数返回一个布尔值,表示是否成功获取到更新区域的矩形坐标。如果成功获取到,返回TRUE;否则,返回FALSE。
以下是使用GetUpdateRect函数的示例代码:
HWND hWnd = GetDesktopWindow(); // 获取桌面窗口的句柄
RECT rect;
// 获取更新区域的矩形坐标,不擦除背景
BOOL result = GetUpdateRect(hWnd, &rect, FALSE);
if (result)
{
// 成功获取到更新区域的矩形坐标
// 可以在矩形区域内进行绘制操作
}
上述代码中,通过调用GetDesktopWindow函数获取桌面窗口的句柄hWnd。然后,定义了一个RECT结构rect,用于接收更新区域的矩形坐标。接下来,通过调用GetUpdateRect函数获取桌面窗口的更新区域的矩形坐标,参数bErase设置为FALSE,表示不擦除背景。如果成功获取到更新区域的矩形坐标,可以在矩形区域内进行绘制操作。
GetUpdateRect函数通常在处理窗口的绘制操作时使用,用于获取需要进行更新绘制的区域。
●ValidateRect函数
ValidateRect函数用于使指定窗口的一个矩形区域无效,从而导致系统重新绘制该区域。
ValidateRect函数的函数原型如下:
BOOL ValidateRect(
HWND hWnd,//指定窗口的句柄,表示要使其矩形区域无效的窗口
const RECT *lpRect //指向RECT结构的指针,指定要使无效的矩形区域的坐标
);
函数返回一个布尔值,表示是否成功使矩形区域无效。如果成功,返回TRUE;否则,返回FALSE。
以下是使用ValidateRect函数的示例代码:
HWND hWnd = GetDesktopWindow(); // 获取桌面窗口的句柄
RECT rect;
// 设置要使无效的矩形区域坐标
rect.left = 100;
rect.top = 100;
rect.right = 200;
rect.bottom = 200;
BOOL result = ValidateRect(hWnd, &rect); // 使指定矩形区域无效
if (result)
{
// 成功使矩形区域无效
// 系统会重新绘制该区域
}
上述代码中,通过调用GetDesktopWindow函数获取桌面窗口的句柄hWnd。然后,定义了一个RECT结构rect,用于指定要使无效的矩形区域的坐标。接下来,通过调用ValidateRect函数使桌面窗口的指定矩形区域无效。如果成功使矩形区域无效,系统会重新绘制该区域。
ValidateRect函数通常在窗口的绘制操作中使用,用于标记特定的区域需要重新绘制。
Windows有两个类似InvalidateRect和ValidateRect的函数,用于处理区域而不是矩形:
●InvalddateRgn函数
InvalidateRgn函数用于使指定窗口的一个区域无效,从而导致系统重新绘制该区域。
InvalidateRgn函数的函数原型如下:
BOOL InvalidateRgn(
HWND hWnd, //指定窗口的句柄,表示要使其区域无效的窗口
HRGN hRgn, //指向区域的句柄,用于指定要使无效的区域
BOOL bErase //布尔值,用于确定在窗口重新绘制之前是否擦除无效区域的背景
);
函数返回一个布尔值,表示是否成功使区域无效。如果成功,返回TRUE;否则,返回FALSE。
以下是使用InvalidateRgn函数的示例代码:
HWND hWnd = GetDesktopWindow(); // 获取桌面窗口的句柄
HRGN hRgn = CreateRectRgn(100, 100, 200, 200); // 创建一个矩形区域
BOOL result = InvalidateRgn(hWnd, hRgn, FALSE); // 使指定区域无效
if (result)
{
// 成功使区域无效
// 系统会重新绘制该区域
}
DeleteObject(hRgn); // 删除区域对象
在上述代码中,通过调用GetDesktopWindow函数获取桌面窗口的句柄hWnd。然后,使用CreateRectRgn函数创建一个具有指定坐标的矩形区域的句柄hRgn。接下来,通过调用InvalidateRgn函数使桌面窗口的指定区域无效。如果成功使区域无效,系统会重新绘制该区域。最后,使用DeleteObject函数删除区域对象。
InvalidateRgn函数通常在窗口的绘制操作中使用,用于请求窗口在其内容发生变化或需要更新时重新绘制。
●ValidateRgn函数
ValidateRgn函数用于验证指定窗口的一个区域,标记该区域为有效,使系统不再重新绘制该区域。ValidateRgn函数的函数原型如下:
BOOL ValidateRgn(
HWND hWnd, //指定窗口的句柄,表示要验证的窗口
HRGN hRgn //指向区域的句柄,用于指定要验证的区域
);
函数返回一个布尔值,表示是否成功验证区域。如果成功,返回TRUE;否则,返回FALSE。
以下是使用ValidateRgn函数的示例代码:
HWND hWnd = GetDesktopWindow(); // 获取桌面窗口的句柄
HRGN hRgn = CreateRectRgn(100, 100, 200, 200); // 创建一个矩形区域
BOOL result = ValidateRgn(hWnd, hRgn); // 验证指定区域
if (result)
{
// 成功验证区域
// 该区域将被标记为有效,系统不再重新绘制该区域
}
DeleteObject(hRgn); // 删除区域对象
在上述代码中,通过调用GetDesktopWindow函数获取桌面窗口的句柄hWnd。然后,使用CreateRectRgn函数创建一个具有指定坐标的矩形区域的句柄hRgn。接下来,通过调用ValidateRgn函数验证指定的区域。如果成功验证区域,该区域将被标记为有效,系统不再重新绘制该区域。最后,使用DeleteObject函数删除区域对象。
ValidateRgn函数通常在窗口的绘制操作中使用,用于标记特定的区域为有效,告诉系统不再重新绘制该区域。
■选入裁剪区域
当接收一条由无效区域产生的WM_PAINT消息时,剪裁区域在形状上不一定是矩形。
可以通过将一个区域选入到设备环境来创建你自己的剪裁区域,将区域选入设备环境。可以使用SelectObject (hdc, hRgn);或SelectClipRgn (hdc, hRgn);
●SelectClipRgn函数
SelectClipRgn函数用于设置设备上下文(DC)的剪辑区域,限制绘图操作只在指定的区域内有效。SelectClipRgn函数的函数原型如下:
int SelectClipRgn(
HDC hdc, //要设置剪辑区域的设备上下文句柄
HRGN hrgn //设置的剪辑区域句柄
);
函数返回一个整数值,表示设置剪辑区域的结果。如果函数调用成功,则返回值为COMPLEXREGION、SIMPLEREGION或NULLREGION,分别表示剪辑区域的类型。如果函数调用失败,则返回ERROR。
以下是使用SelectClipRgn函数的示例代码:
HWND hWnd = GetDesktopWindow(); // 获取桌面窗口的句柄
HDC hdc = GetDC(hWnd); // 获取桌面窗口的设备上下文
HRGN hRgn = CreateRectRgn(100, 100, 200, 200); // 创建一个矩形剪辑区域
int result = SelectClipRgn(hdc, hRgn); // 设置剪辑区域
if (result != ERROR)
{
// 设置剪辑区域成功
// 绘图操作将受到剪辑区域的限制
}
DeleteObject(hRgn); // 删除剪辑区域对象
ReleaseDC(hWnd, hdc); // 释放设备上下文
在上述代码中,通过调用GetDesktopWindow函数获取桌面窗口的句柄hWnd。然后,通过调用GetDC函数获取桌面窗口的设备上下文hdc。接下来,使用CreateRectRgn函数创建一个具有指定坐标的矩形剪辑区域的句柄hRgn。然后,通过调用SelectClipRgn函数将剪辑区域设置到设备上下文中。如果成功设置剪辑区域,则绘图操作将受到剪辑区域的限制。最后,使用DeleteObject函数删除剪辑区域对象,并通过ReleaseDC函数释放设备上下文。
SelectClipRgn函数通常在绘图操作中使用,用于限制绘图操作的有效区域。
■创建区域
●创建矩形区域
CreateRectRgn 函数用于创建一个矩形区域(Region)对象。矩形区域定义为左上角坐标 (nLeftRect, nTopRect) 和右下角坐标 (nRightRect, nBottomRect) 所围成的矩形。
函数原型如下:
HRGN CreateRectRgn(
int nLeftRect, // 矩形左上角的 x 坐标
int nTopRect, // 矩形左上角的 y 坐标
int nRightRect, // 矩形右下角的 x 坐标
int nBottomRect // 矩形右下角的 y 坐标
);
返回值:
如果函数成功,返回一个表示矩形区域的句柄(HRGN)。
如果函数失败,返回值为 NULL。
●创建椭圆区域
CreateEllipticRgn 函数用于创建一个由给定椭圆外接矩形定义的椭圆区域对象。
HRGN CreateEllipticRgn(
int nLeftRect, // 椭圆外接矩形左上角的 x 坐标
int nTopRect, // 椭圆外接矩形左上角的 y 坐标
int nRightRect, // 椭圆外接矩形右下角的 x 坐标
int nBottomRect // 椭圆外接矩形右下角的 y 坐标
);
返回值:
如果函数成功,返回一个表示椭圆区域的句柄(HRGN)。
如果函数失败,返回值为 NULL。
●创建多边形区域
CreatePolygonRgn 函数用于创建一个由给定顶点坐标定义的多边形区域对象。
HRGN CreatePolygonRgn(
const POINT *lpPoints, // 指向一个 POINT 结构数组,包含多边形的顶点坐标
int nCount, // 多边形顶点的数量
int fnPolyFillMode // 多边形的填充模式,可以是 ALTERNATE 或 WINDING
);
返回值:
如果函数成功,返回一个表示多边形区域的句柄(HRGN)。
如果函数失败,返回值为 NULL。
■操作裁剪区域
GDI为剪裁区域做了一个副本,因此当把区域对象选入到设备环境后,可以删除它。 Windows还包括几个操纵这个剪裁区域的函数,例如ExcludeClipRect函数用来从剪裁区域 中去除一个矩形;IntersectClipRect函数用来建立一个新的剪裁区域,这个新的剪裁区域是 先前的剪裁区域和某个矩形的交集。OffsetClipRgn函数用来把一个剪裁区域移动到客户区的另外一部分。
●CombineRgn函数
CombineRgn 函数用于根据给定的组合模式,将两个区域进行组合操作,将结果存储在目标区域中。hDestRgn在初始时可以是一个很小的矩形区域。将两个源区域组合起来,并产生目标句柄,hDestRgn先前的区域将被销毁。
int CombineRgn(
HRGN hrgnDest, // 目标区域句柄,表示结果将存储在其中
HRGN hrgnSrc1, // 第一个源区域句柄
HRGN hrgnSrc2, // 第二个源区域句柄
int fnCombineMode // 区域的组合模式,可以是 RGN_AND、RGN_OR、RGN_XOR、RGN_DIFF、RGN_COPY
);
fnCombineMode:区域的组合模式,可以是以下常量之一:
RGN_AND:计算 hrgnSrc1 和 hrgnSrc2 的交集。
RGN_OR:计算 hrgnSrc1 和 hrgnSrc2 的并集。
RGN_XOR:计算 hrgnSrc1 和 hrgnSrc2 的异或。
RGN_DIFF:计算 hrgnSrc1 减去 hrgnSrc2 的差集。
RGN_COPY:将 hrgnSrc1 的副本复制到 hrgnDest。
返回值:
如果函数成功,返回值表示操作的结果:
COMPLEXREGION:结果是一个复杂区域。
SIMPLEREGION:结果是一个简单区域。
NULLREGION:结果是一个空区域。
如果函数失败,返回值为错误代码。
●ExcludeClipRect函数
ExcludeClipRect函数是Windows API中的一个函数,用于在设备上下文(DC)中排除指定的矩形区域,将该区域从剪辑区域中移除。ExcludeClipRect函数的函数原型如下:
int ExcludeClipRect(
HDC hdc, //要操作的设备上下文句柄
int left, //要排除的矩形区域的左上角和右下角的坐标
int top, //
int right, //
int bottom //
);
函数返回一个整数值,表示排除操作的结果。如果函数调用成功,则返回值为SIMPLEREGION、COMPLEXREGION或NULLREGION,分别表示剪辑区域的类型。如果函数调用失败,则返回ERROR。
以下是使用ExcludeClipRect函数的示例代码:
HWND hWnd = GetDesktopWindow(); // 获取桌面窗口的句柄
HDC hdc = GetDC(hWnd); // 获取桌面窗口的设备上下文
int left = 100;
int top = 100;
int right = 200;
int bottom = 200;
int result = ExcludeClipRect(hdc, left, top, right, bottom); // 排除矩形区域
if (result != ERROR)
{
// 排除矩形区域成功
// 绘图操作将不会在该区域内绘制
}
ReleaseDC(hWnd, hdc); // 释放设备上下文
在上述代码中,通过调用GetDesktopWindow函数获取桌面窗口的句柄hWnd。然后,通过调用GetDC函数获取桌面窗口的设备上下文hdc。接下来,定义了要排除的矩形区域的坐标。然后,通过调用ExcludeClipRect函数将该矩形区域从设备上下文的剪辑区域中移除。如果成功排除矩形区域,则绘图操作将不会在该区域内绘制。最后,通过ReleaseDC函数释放设备上下文。
ExcludeClipRect函数通常在绘图操作中使用,用于将指定的矩形区域从剪辑区域中排除,使得该区域不受剪辑的影响。
●IntersectClipRect函数
IntersectClipRect函数用于在设备上下文(DC)中与指定的矩形区域求交集,将剪辑区域限制为该交集区域。IntersectClipRect函数的函数原型如下:
int IntersectClipRect(
HDC hdc, //要操作的设备上下文句柄
int left, //要排除的矩形区域的左上角和右下角的坐标
int top,
int right,
int bottom
);
函数返回一个整数值,表示求交集操作的结果。如果函数调用成功,则返回值为SIMPLEREGION、COMPLEXREGION或NULLREGION,分别表示剪辑区域的类型。如果函数调用失败,则返回ERROR。
以下是使用IntersectClipRect函数的示例代码:
HWND hWnd = GetDesktopWindow(); // 获取桌面窗口的句柄
HDC hdc = GetDC(hWnd); // 获取桌面窗口的设备上下文
int left = 100;
int top = 100;
int right = 200;
int bottom = 200;
int result = IntersectClipRect(hdc, left, top, right, bottom); // 与矩形区域求交集
if (result != ERROR)
{
// 与矩形区域求交集成功
// 剪辑区域将被限制为交集区域
}
ReleaseDC(hWnd, hdc); // 释放设备上下文
在上述代码中,通过调用GetDesktopWindow函数获取桌面窗口的句柄hWnd。然后,通过调用GetDC函数获取桌面窗口的设备上下文hdc。接下来,定义了要与剪辑区域求交集的矩形区域的坐标。然后,通过调用IntersectClipRect函数将设备上下文的剪辑区域限制为与该矩形区域的交集。如果成功求交集,则剪辑区域将被限制为交集区域。最后,通过ReleaseDC函数释放设备上下文。
IntersectClipRect函数通常在绘图操作中使用,用于将设备上下文的剪辑区域限制为与指定矩形区域的交集。
●OffsetClipRgn函数
OffsetClipRgn函数用于将设备上下文(DC)的剪辑区域沿指定的偏移量进行平移。
OffsetClipRgn函数的函数原型如下:
int OffsetClipRgn(
HDC hdc, //表示要操作的设备上下文句柄
int x, //表示横向偏移量
int y //表示纵向偏移量
);
函数返回一个整数值,表示平移操作的结果。如果函数调用成功,则返回值为非零值。如果函数调用失败,则返回值为零。
以下是使用OffsetClipRgn函数的示例代码:
HWND hWnd = GetDesktopWindow(); // 获取桌面窗口的句柄
HDC hdc = GetDC(hWnd); // 获取桌面窗口的设备上下文
HRGN hRgn = CreateRectRgn(100, 100, 200, 200); // 创建一个矩形剪辑区域
int x = 50;
int y = 50;
int result = OffsetClipRgn(hdc, x, y); // 平移剪辑区域
if (result != ERROR)
{
// 平移剪辑区域成功
}
DeleteObject(hRgn); // 删除剪辑区域对象
ReleaseDC(hWnd, hdc); // 释放设备上下文
在上述代码中,通过调用GetDesktopWindow函数获取桌面窗口的句柄hWnd。然后,通过调用GetDC函数获取桌面窗口的设备上下文hdc。接下来,使用CreateRectRgn函数创建一个具有指定坐标的矩形剪辑区域的句柄hRgn。然后,定义了要进行的平移偏移量x和y。通过调用OffsetClipRgn函数将剪辑区域沿指定偏移量进行平移。如果成功平移剪辑区域,则剪辑区域被移动到新的位置。最后,使用DeleteObject函数删除剪辑区域对象,并通过ReleaseDC函数释放设备上下文。
OffsetClipRgn函数通常在绘图操作中使用,用于将设备上下文的剪辑区域沿指定偏移量进行平移。
■区域绘图函数
FillRgn(hdc,hRgn,hBrush) | //与FillRect类似 |
FrameRgn(hdc,hRgn,hBrush,xFrame,yFrame) | //xFrame,yFrame表示区域周围的边框的逻辑宽度和高度 |
InvertRgn(hdc,hRgn); | //与InvertRect类似 |
PaintRgn(hdc,hRgn); | //用当前设备环境的画刷来填充区域 |
【注意】 区域作为GDI对象,不用的时候需要删除:
DeleteObject(hRgn); //删除GDI对象。
本文摘自编程达人系列教材《Windows API每日一练》Windows程序设计基础篇。
- 上一篇: 电脑蓝屏错误代码详解以及蓝屏原因
- 下一篇: ESP-C3入门3. NVS非易失性存储使用
猜你喜欢
- 2024-10-25 Auto CAD 常用系统变量 cad2020系统变量
- 2024-10-25 做开发十年,我总结出了这些开发经验
- 2024-10-25 Windows高级工程师:GDI/GDI+绘图;基础入门大全
- 2024-10-25 菜比手把手教你破解游戏多开(轻喷)
- 2024-10-25 JVM 完整深入解析 jvm解析阶段
- 2024-10-25 Linux打开的文件过多Too many open file
- 2024-10-25 一文看完Oracle数据库之PGA概念、组成、自动管理、参数及视图
- 2024-10-25 JavaScript 中内存泄漏的原因以及对策
- 2024-10-25 史上最全Oracle文件损坏处理办法(附实验步骤)
- 2024-10-25 C++消息循环GetMessage/TranslateMessage/DispatchMessage
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- sd分区 (65)
- raid5数据恢复 (81)
- 地址转换 (73)
- 手机存储卡根目录 (55)
- tcp端口 (74)
- project server (59)
- 双击ctrl (55)
- 鼠标 单击变双击 (67)
- debugview (59)
- 字符动画 (65)
- flushdns (57)
- ps复制快捷键 (57)
- 清除系统垃圾代码 (58)
- web服务器的架设 (67)
- 16进制转换 (69)
- xclient (55)
- ps源文件 (67)
- filezilla server (59)
- 句柄无效 (56)
- word页眉页脚设置 (59)
- ansys实例 (56)
- 6 1 3固件 (59)
- sqlserver2000挂起 (59)
- vm虚拟主机 (55)
- config (61)
本文暂时没有评论,来添加一个吧(●'◡'●)