在前面的4.3节中我们讲述了绘制矩形的API函数Rectangle和RoundRect。本节我们将介绍另外一组使用RECT矩形结构和区域的绘图函数。
本节必须掌握的知识点:
矩形
第28练:绘制随机矩形
矩形与区域的裁剪
第29练:区域裁剪
4.6.1 矩形
■FillRect函数
FillRect函数用于在指定的设备上下文(Device Context)中,用指定的画刷(Brush)填充一个矩形区域。FillRect函数的函数原型如下:
int FillRect(
HDC hDC, //指向目标设备上下文的句柄
const RECT *lprc, //指向RECT结构的指针,指定要填充的矩形区域
HBRUSH hbr //指向画刷的句柄,用于指定填充矩形的颜色和样式
);
函数返回一个非零值表示成功,返回零表示失败。
●以下是使用FillRect函数的示例代码:
HDC hdc = GetDC(hwnd); // 获取窗口的设备上下文
RECT rect;
HBRUSH hBrush;
SetRect(&rect, 100, 100, 200, 200); // 设置矩形的坐标
hBrush = CreateSolidBrush(RGB(255, 0, 0)); // 创建红色实心画刷
FillRect(hdc, &rect, hBrush); // 使用画刷填充矩形区域
DeleteObject(hBrush); // 删除画刷对象
ReleaseDC(hwnd, hdc); // 释放设备上下文
FillRect函数对于在设备上下文中绘制填充矩形非常有用,可以用于创建背景色、填充区域、绘制图形等操作。
■FrameRect函数
FrameRect函数用于绘制指定矩形区域的边框。函数原型如下:
BOOL FrameRect(
HDC hdc, //设备环境句柄
const RECT *lprc, //指向RECT结构的指针,用于指定要绘制边框的矩形区域
HBRUSH hbr //画刷句柄(Brush Handle),用于指定绘制边框的颜色或图案
);
FrameRect函数返回一个BOOL值,表示绘制成功与否。如果绘制成功,返回值为非零;如果失败,返回值为零。
FrameRect函数使用指定的画刷(可以是单色画刷或带图案的画刷)来绘制矩形的边框。边框的粗细和样式可以通过选择不同的画刷对象来实现。
需要注意的是,FrameRect函数绘制的边框不包括矩形区域本身,只会绘制边框线条。如果需要同时填充矩形区域的内部,请使用其他函数,如FillRect函数。
例如,下面的代码片段演示了如何使用FrameRect函数绘制一个红色的边框:
RECT rect = { 100, 100, 200, 200 }; // 定义要绘制边框的矩形区域
HBRUSH hbr = CreateSolidBrush(RGB(255, 0, 0)); // 创建一个红色画刷
FrameRect(hdc, &rect, hbr); // 绘制红色边框
DeleteObject(hbr); // 删除
■InvertRect函数
InvertRect函数用于在指定的设备上下文(Device Context)中反转(翻转)一个矩形区域的颜色。InvertRect函数的函数原型如下:
BOOL InvertRect(
HDC hDC, //指向目标设备上下文的句柄
const RECT *lprc //指向RECT结构的指针,指定要反转颜色的矩形区域
);
函数返回一个布尔值,表示是否成功反转矩形区域的颜色。
以下是使用InvertRect函数的示例代码:
HDC hdc = GetDC(hwnd); // 获取窗口的设备上下文
RECT rect;
SetRect(&rect, 100, 100, 200, 200); // 设置矩形的坐标
InvertRect(hdc, &rect); // 反转矩形区域的颜色
ReleaseDC(hwnd, hdc); // 释放设备上下文
上述代码中,通过调用GetDC函数获取窗口的设备上下文,并定义一个RECT结构rect。然后,使用SetRect函数设置矩形的坐标。接下来,通过调用InvertRect函数将矩形区域的颜色进行反转,即将原来的颜色取反。最后,通过调用ReleaseDC函数释放设备上下文。
InvertRect函数对于在设备上下文中反转矩形区域的颜色非常有用,可以用于创建反色效果、闪烁效果等视觉效果。
■SetRect函数
SetRect函数是Windows API中的一个函数,用于设置一个RECT结构的坐标。SetRect函数的函数原型如下:
void SetRect(
LPRECT lprc, //指向RECT结构的指针,用于接收设置后的坐标信息
int left, //指定矩形的左上角和右下角的坐标
int top,
int right,
int bottom
);
以下是使用SetRect函数的示例代码:
RECT rect;
SetRect(&rect, 100, 100, 200, 200); // 设置矩形的坐标
SetRect函数用于设置RECT结构的坐标,方便地定义一个矩形区域的位置和大小。
■OffsetRect函数
OffsetRect函数用于将一个RECT结构的坐标进行偏移或移动。OffsetRect函数的函数原型如下:
BOOL OffsetRect(
LPRECT lprc, //指向RECT结构的指针,指定要进行偏移或移动的矩形
int dx, // dx和dy分别表示在x轴和y轴上的偏移量
int dy
);
函数返回一个布尔值,表示是否成功进行矩形的偏移或移动。
以下是使用OffsetRect函数的示例代码:
RECT rect;
int dx = 10;
int dy = 20;
SetRect(&rect, 100, 100, 200, 200); // 设置矩形的坐标
OffsetRect(&rect, dx, dy); // 对矩形进行偏移或移动
// 偏移后的矩形坐标
int newLeft = rect.left;
int newTop = rect.top;
int newRight = rect.right;
int newBottom = rect.bottom;
上述代码中,定义了一个RECT结构rect,并定义了偏移量dx和dy。然后,通过调用SetRect函数将矩形的坐标设置为左上角(100, 100)、右下角(200, 200)。接下来,通过调用OffsetRect函数对矩形进行偏移或移动,将矩形的坐标在x轴上向右偏移10个单位,在y轴上向下偏移20个单位。最后,可以通过读取偏移后的矩形坐标,即rect的左上角和右下角的坐标,来获取偏移后的矩形位置。
OffsetRect函数对于在RECT结构中对矩形进行偏移或移动非常有用,可以用于调整矩形的位置、进行布局等操作。
■InflateRect函数
InflateRect函数用于在原有的RECT结构基础上扩大或缩小矩形的尺寸。InflateRect函数的函数原型如下:
BOOL InflateRect(
LPRECT lprc, //指向RECT结构的指针,指定要进行尺寸调整的矩形
int dx, // dx和dy分别表示在x轴和y轴方向上的扩展或收缩量
int dy
);
函数返回一个布尔值,表示是否成功进行矩形的尺寸调整。
以下是使用InflateRect函数的示例代码:
RECT rect;
int dx = 10;
int dy = 20;
SetRect(&rect, 100, 100, 200, 200); // 设置矩形的坐标
InflateRect(&rect, dx, dy); // 扩大或缩小矩形的尺寸
// 调整后的矩形坐标
int newLeft = rect.left;
int newTop = rect.top;
int newRight = rect.right;
int newBottom = rect.bottom;
上述代码中,定义了一个RECT结构rect,并定义了扩展或缩小量dx和dy。然后,通过调用SetRect函数将矩形的坐标设置为左上角(100, 100)、右下角(200, 200)。接下来,通过调用InflateRect函数对矩形的尺寸进行调整,将矩形的宽度在x轴上增加10个单位,在y轴上增加20个单位。最后,可以通过读取调整后的矩形坐标,即rect的左上角和右下角的坐标,来获取调整后的矩形尺寸。
InflateRect函数对于在RECT结构中调整矩形的尺寸非常有用,可以用于动态改变矩形的大小、进行裁剪等操作。
■SetRectEmpty函数
SetRectEmpty函数是Windows API中的一个函数,用于将一个RECT结构设置为空矩形。
SetRectEmpty函数的函数原型如下:
BOOL SetRectEmpty(
LPRECT lprc //指向RECT结构的指针,指定要设置为空矩形的RECT
);
函数返回一个布尔值,表示是否成功将RECT设置为空矩形。
以下是使用SetRectEmpty函数的示例代码:
RECT rect;
SetRectEmpty(&rect); // 设置rect为空矩形
上述代码中,定义了一个RECT结构rect。然后,通过调用SetRectEmpty函数将rect设置为空矩形。
空矩形是一个宽度和高度都为0的矩形,即左上角坐标和右下角坐标相等。
SetRectEmpty函数对于将RECT结构设置为空矩形非常有用,可以用于初始化矩形或在需要时将矩形重置为空矩形。
■CopyRect函数
CopyRect函数用于将一个RECT结构的坐标复制到另一个RECT结构。
CopyRect函数的函数原型如下:
BOOL CopyRect(
LPRECT lprcDst, //指向目标RECT结构的指针,用于接收源RECT结构的坐标
const RECT *lprcSrc //指向源RECT结构的指针,指定要复制坐标的源RECT结构
);
函数返回一个布尔值,表示是否成功将源RECT结构的坐标复制到目标RECT结构。
以下是使用CopyRect函数的示例代码:
RECT rectSrc;
RECT rectDst;
SetRect(&rectSrc, 100, 100, 200, 200); // 设置源矩形的坐标
CopyRect(&rectDst, &rectSrc); // 复制源矩形的坐标到目标矩形
// 目标矩形坐标
int dstLeft = rectDst.left;
int dstTop = rectDst.top;
int dstRight = rectDst.right;
int dstBottom = rectDst.bottom;
上述代码中,定义了两个RECT结构rectSrc和rectDst。然后,通过调用SetRect函数将源矩形的坐标设置为左上角(100, 100)、右下角(200, 200)。接下来,通过调用CopyRect函数将源矩形的坐标复制到目标矩形rectDst。最后,可以通过读取目标矩形坐标,即rectDst的左上角和右下角的坐标,来获取复制后的矩形位置。
CopyRect函数对于在不同的RECT结构之间复制矩形的坐标非常有用,可以用于复制、传递矩形的位置信息。
大多数情况下,还有一些简单的代码可以实现与这些函数相同的功能。例如,复制结构时,可以通过逐个字段的结构复制操作,来代替调用CopyRect函数,如下面的语句:
DestRect = SrcRect ;
■IntersectRect函数
IntersectRect函数用于计算两个矩形的交集,即它们重叠的部分。IntersectRect函数的函数原型如下:
BOOL IntersectRect(
LPRECT lprcDst, //指向目标RECT结构的指针,用于接收两个源RECT结构的交集
const RECT *lprcSrc1,//指向源RECT结构的指针1
const RECT *lprcSrc2//指向源RECT结构的指针2
);
函数返回一个布尔值,表示是否成功计算出两个矩形的交集。
以下是使用IntersectRect函数的示例代码:
RECT rect1;
RECT rect2;
RECT rectIntersect;
SetRect(&rect1, 100, 100, 200, 200); // 设置矩形1的坐标
SetRect(&rect2, 150, 150, 250, 250); // 设置矩形2的坐标
BOOL result = IntersectRect(&rectIntersect, &rect1, &rect2); // 计算两个矩形的交集
if (result)
{
// 交集矩形坐标
int intersectLeft = rectIntersect.left;
int intersectTop = rectIntersect.top;
int intersectRight = rectIntersect.right;
int intersectBottom = rectIntersect.bottom;
}
上述代码中,定义了两个RECT结构rect1和rect2,并定义了一个用于接收交集的RECT结构rectIntersect。然后,通过调用SetRect函数分别设置矩形1和矩形2的坐标。接下来,通过调用IntersectRect函数计算矩形1和矩形2的交集,并将结果存储在rectIntersect中。最后,可以通过读取交集矩形的坐标,即rectIntersect的左上角和右下角的坐标,来获取两个矩形的交集位置。
IntersectRect函数对于计算两个矩形的交集非常有用,可以用于碰撞检测、裁剪等应用场景。
■UnionRect函数
UnionRect函数是Windows API中的一个函数,用于计算两个矩形的并集,即包含这两个矩形的最小矩形。UnionRect函数的函数原型如下:
BOOL UnionRect(
LPRECT lprcDst, //指向目标RECT结构的指针,用于接收两个源RECT结构的并集
const RECT *lprcSrc1,//指向源RECT结构的指针1
const RECT *lprcSrc2//指向源RECT结构的指针2
);
函数返回一个布尔值,表示是否成功计算出两个矩形的并集。
以下是使用UnionRect函数的示例代码:
RECT rect1;
RECT rect2;
RECT rectUnion;
SetRect(&rect1, 100, 100, 200, 200); // 设置矩形1的坐标
SetRect(&rect2, 150, 150, 250, 250); // 设置矩形2的坐标
BOOL result = UnionRect(&rectUnion, &rect1, &rect2); // 计算两个矩形的并集
if (result)
{
// 并集矩形坐标
int unionLeft = rectUnion.left;
int unionTop = rectUnion.top;
int unionRight = rectUnion.right;
int unionBottom = rectUnion.bottom;
}
上述代码中,定义了两个RECT结构rect1和rect2,并定义了一个用于接收并集的RECT结构rectUnion。然后,通过调用SetRect函数分别设置矩形1和矩形2的坐标。接下来,通过调用UnionRect函数计算矩形1和矩形2的并集,并将结果存储在rectUnion中。最后,可以通过读取并集矩形的坐标,即rectUnion的左上角和右下角的坐标,来获取两个矩形的并集位置。
UnionRect函数对于计算两个矩形的并集非常有用,可以用于合并矩形、计算包围框等应用场景。
■IsRectEmpty函数
IsRectEmpty函数是Windows API中的一个函数,用于检查一个RECT结构是否为空矩形。IsRectEmpty函数的函数原型如下:
BOOL IsRectEmpty(
const RECT *lprc //指向要检查的RECT结构的指针
);
函数返回一个布尔值,表示指定的RECT结构是否为空矩形。如果RECT结构的宽度和高度都为0,则被认为是空矩形,函数返回TRUE;否则,函数返回FALSE。
以下是使用IsRectEmpty函数的示例代码:
RECT rect1;
RECT rect2;
SetRect(&rect1, 100, 100, 200, 200); // 设置矩形1的坐标
SetRectEmpty(&rect2); // 设置矩形2为空矩形
BOOL isEmpty1 = IsRectEmpty(&rect1); // 检查矩形1是否为空矩形
BOOL isEmpty2 = IsRectEmpty(&rect2); // 检查矩形2是否为空矩形