【愚公系列】2023年11月 GDI+绘图专题 Rectangle
🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏
🚀前言
在WinForm中,Rectangle是一个表示矩形的类,它包含了多个属性和方法,下面是一些常用的属性和方法介绍:
属性:
- X:获取或设置矩形左上角的 X 坐标。
- Y:获取或设置矩形左上角的 Y 坐标。
- Width:获取或设置矩形的宽度。
- Height:获取或设置矩形的高度。
- Location:获取或设置矩形的左上角的坐标。
- Size:获取或设置矩形的大小。
- Left:获取矩形左侧的 X 坐标。
- Top:获取矩形顶部的 Y 坐标。
- Right:获取矩形右侧的 X 坐标。
- Bottom:获取矩形底部的 Y 坐标。
方法:
- Contains(Point):判断一个点是否在矩形中。
- Contains(Rectangle):判断一个矩形是否被包含在另一个矩形中。
- IntersectsWith(Rectangle):判断是否与另一个矩形相交。
- Inflate(Int32, Int32):扩大或缩小矩形的大小。
- Offset(Int32, Int32):移动矩形的位置。
使用Rectangle类能够方便地处理矩形的各种操作,比如检测碰撞、裁剪等等。
🚀一、Rectangle
🔎1.Empty
Rectangle属性的Empty表示一个空的矩形,即矩形的宽度和高度都为0,且位于坐标系的原点上。它是一个静态只读属性,可以用于初始化Rectangle结构的实例或将Rectangle结构的实例设置为一个空矩形。在实际编程中,可以使用Empty属性来检查一个矩形是否为空,例如:
Rectangle rect = new Rectangle(0, 0, 0, 0);
if(rect == Rectangle.Empty)
{
//rect是一个空矩形
}
当需要创建一个矩形对象但不知道具体的尺寸时,可以使用Empty来初始化Rectangle属性,然后再根据实际需要设置其位置和尺寸。例如:
Rectangle rect = Rectangle.Empty;
rect.X = 100;
rect.Y = 100;
rect.Width = 200;
rect.Height = 150;
// 或者直接使用构造函数
// Rectangle rect = new Rectangle(100, 100, 200, 150);
这样就可以创建一个起始位置在(100,100),宽度为200,高度为150的矩形对象了。
🔎2.属性
Rectangle
结构表示一个矩形,它具有多个属性和方法,用于操作矩形的不同方面。以下是一些常用的 Rectangle
属性的介绍和示例:
-
Left
:获取或设置矩形的左边界的 x 坐标。示例:
Rectangle rect = new Rectangle(10, 20, 30, 40); int left = rect.Left; // 返回 10
-
Right
:获取矩形的右边界的 x 坐标(只读属性)。示例:
Rectangle rect = new Rectangle(10, 20, 30, 40); int right = rect.Right; // 返回 40(左边界的 x 坐标 + 宽度)
-
Top
:获取或设置矩形的上边界的 y 坐标。示例:
Rectangle rect = new Rectangle(10, 20, 30, 40); int top = rect.Top; // 返回 20
-
Bottom
:获取矩形的下边界的 y 坐标(只读属性)。示例:
Rectangle rect = new Rectangle(10, 20, 30, 40); int bottom = rect.Bottom; // 返回 60(上边界的 y 坐标 + 高度)
-
Width
:获取或设置矩形的宽度。示例:
Rectangle rect = new Rectangle(10, 20, 30, 40); int width = rect.Width; // 返回 30
-
Height
:获取或设置矩形的高度。示例:
Rectangle rect = new Rectangle(10, 20, 30, 40); int height = rect.Height; // 返回 40
-
X
:获取或设置矩形的左上角顶点的 x 坐标。示例:
Rectangle rect = new Rectangle(10, 20, 30, 40); int x = rect.X; // 返回 10
-
Y
:获取或设置矩形的左上角顶点的 y 坐标。示例:
Rectangle rect = new Rectangle(10, 20, 30, 40); int y = rect.Y; // 返回 20
-
Size
:获取或设置矩形的大小(Size
结构)。示例:
Rectangle rect = new Rectangle(10, 20, 30, 40); Size size = rect.Size; // 返回一个 Size 结构,宽度为 30,高度为 40
这些属性可用于检索和设置矩形的位置和尺寸,能够对图形元素进行准确的定位和调整。
🔎3.静态方法
Rectangle
结构提供了一些静态方法,用于执行不同的矩形操作。以下是这些静态方法的介绍和示例:
-
Rectangle.Contains
方法:- 描述:用于确定一个矩形是否完全包含另一个矩形或指定的点。
- 示例:
Rectangle rect1 = new Rectangle(10, 10, 50, 50); Rectangle rect2 = new Rectangle(20, 20, 30, 30); bool containsRect = Rectangle.Contains(rect1, rect2); // 返回 true,rect1 包含 rect2 bool containsPoint = Rectangle.Contains(rect1, new Point(15, 15)); // 返回 true,点 (15, 15) 在 rect1 内
-
Rectangle.Intersect
方法:- 描述:用于计算两个矩形的交集。
- 示例:
Rectangle rect1 = new Rectangle(10, 10, 50, 50); Rectangle rect2 = new Rectangle(30, 30, 40, 40); Rectangle intersection = Rectangle.Intersect(rect1, rect2); // 返回一个新的矩形,表示两者的交集
-
Rectangle.Union
方法:- 描述:用于计算两个矩形的并集。
- 示例:
Rectangle rect1 = new Rectangle(10, 10, 50, 50); Rectangle rect2 = new Rectangle(30, 30, 40, 40); Rectangle union = Rectangle.Union(rect1, rect2); // 返回一个新的矩形,表示两者的并集
-
Rectangle.FromLTRB
方法:- 描述:用于创建一个矩形,通过指定左上角和右下角的坐标。
- 示例:
Rectangle rect = Rectangle.FromLTRB(10, 20, 60, 70); // 创建一个左上角 (10, 20),右下角 (60, 70) 的矩形
这些静态方法允许您在处理矩形时执行常见的操作,如检测包含关系、计算交集和并集以及创建矩形。它们在图形处理和布局管理中非常有用。
🔎4.非静态方法
Rectangle
结构还提供了一些非静态方法,用于在实例级别执行不同的矩形操作。以下是这些非静态方法的介绍和示例:
-
Rectangle.Intersect
方法:- 描述:用于计算当前矩形与另一个矩形的交集,并将结果存储在当前矩形中。
- 示例:
Rectangle rect1 = new Rectangle(10, 10, 50, 50); Rectangle rect2 = new Rectangle(30, 30, 40, 40); rect1.Intersect(rect2); // 将 rect1 修改为两者的交集
-
Rectangle.IntersectsWith
方法:- 描述:用于检查当前矩形是否与另一个矩形相交。
- 示例:
Rectangle rect1 = new Rectangle(10, 10, 50, 50); Rectangle rect2 = new Rectangle(60, 60, 40, 40); bool intersects = rect1.IntersectsWith(rect2); // 返回 false,rect1 与 rect2 不相交
-
Rectangle.Inflate
方法:- 描述:用于调整矩形的大小,通过添加或移除边框。
- 示例:
Rectangle rect = new Rectangle(10, 10, 50, 50); rect.Inflate(5, 5); // 扩大矩形,边界向外扩展 5 个单位
-
Rectangle.Offset
方法:- 描述:用于移动矩形的位置。
- 示例:
Rectangle rect = new Rectangle(10, 10, 50, 50); rect.Offset(20, 30); // 移动矩形,将其左上角移到 (30, 40)
-
Rectangle.Contains
方法:- 描述:用于检查当前矩形是否包含另一个点或矩形。
- 示例:
Rectangle rect = new Rectangle(10, 10, 50, 50); Point point = new Point(20, 20); bool containsPoint = rect.Contains(point); // 返回 true,矩形包含点 (20, 20)
-
Rectangle.Round
,Rectangle.Ceiling
,Rectangle.Truncate
方法:- 描述:用于将矩形的坐标值舍入到不同的精度级别。
- 示例:
RectangleF rectF = new RectangleF(10.5f, 20.7f, 50.2f, 60.9f); Rectangle roundedRect = Rectangle.Round(rectF); // 将坐标值四舍五入到整数 Rectangle ceilingRect = Rectangle.Ceiling(rectF); // 向上取整 Rectangle truncateRect = Rectangle.Truncate(rectF); // 向下取整
这些非静态方法允许您在矩形实例上执行各种操作,包括计算交集、检查相交、调整大小、移动位置和检查包含关系等。它们在处理矩形
🔎5.运算符
Rectangle
结构支持相等性运算符 ==
和不相等性运算符 !=
,这些运算符用于比较两个矩形是否相等或不相等。以下是它们的介绍和示例:
-
==
运算符:- 描述:
==
运算符用于比较两个矩形是否相等,即它们的位置和尺寸是否完全相同。 - 示例:
Rectangle rect1 = new Rectangle(10, 20, 30, 40); Rectangle rect2 = new Rectangle(10, 20, 30, 40); bool areEqual = rect1 == rect2; // 返回 true,rect1 与 rect2 相等
- 描述:
-
!=
运算符:- 描述:
!=
运算符用于比较两个矩形是否不相等,即它们的位置或尺寸有任何一个不同。 - 示例:
Rectangle rect1 = new Rectangle(10, 20, 30, 40); Rectangle rect2 = new Rectangle(20, 30, 40, 50); bool areNotEqual = rect1 != rect2; // 返回 true,rect1 与 rect2 不相等,因为它们的位置不同
- 描述:
🔎6.案例
以下是一个完整的WinForms应用程序示例,演示如何使用GDI+绘制一个圆角彩色矩形按钮,并支持点击事件:
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
public class ColoredRoundedRectButton : Control
{
private bool isMouseOver = false;
private bool isMouseDown = false;
public ColoredRoundedRectButton()
{
// 设置控件的大小
this.Size = new Size(100, 40);
// 订阅鼠标事件
this.MouseEnter += ColoredRoundedRectButton_MouseEnter;
this.MouseLeave += ColoredRoundedRectButton_MouseLeave;
this.MouseDown += ColoredRoundedRectButton_MouseDown;
this.MouseUp += ColoredRoundedRectButton_MouseUp;
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
g.SmoothingMode = SmoothingMode.AntiAlias;
Rectangle rect = new Rectangle(0, 0, this.Width - 1, this.Height - 1);
int radius = 10;
// 根据鼠标状态设置颜色
Color buttonColor = Color.LightBlue;
if (isMouseDown)
{
buttonColor = Color.DarkBlue;
}
else if (isMouseOver)
{
buttonColor = Color.Blue;
}
// 绘制圆角矩形按钮
using (SolidBrush brush = new SolidBrush(buttonColor))
{
g.FillRectangle(brush, rect);
}
using (Pen pen = new Pen(Color.Black))
{
g.DrawRectangle(pen, rect);
}
// 绘制按钮文本
TextRenderer.DrawText(g, this.Text, this.Font, rect, Color.White, TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter);
}
private void ColoredRoundedRectButton_MouseEnter(object sender, EventArgs e)
{
isMouseOver = true;
this.Invalidate();
}
private void ColoredRoundedRectButton_MouseLeave(object sender, EventArgs e)
{
isMouseOver = false;
this.Invalidate();
}
private void ColoredRoundedRectButton_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
isMouseDown = true;
this.Invalidate();
}
}
private void ColoredRoundedRectButton_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
isMouseDown = false;
this.Invalidate();
// 触发按钮点击事件
OnClick(EventArgs.Empty);
}
}
}
public class MainForm : Form
{
public MainForm()
{
this.Size = new Size(400, 200);
this.Text = "Colored Rounded Rectangle Button Example";
// 创建彩色圆角矩形按钮控件
ColoredRoundedRectButton button = new ColoredRoundedRectButton();
button.Location = new Point(50, 50);
button.Text = "Click Me"; // 按钮文本
// 添加按钮到窗体
this.Controls.Add(button);
// 订阅按钮的Click事件
button.Click += Button_Click;
}
private void Button_Click(object sender, EventArgs e)
{
// 处理按钮点击事件
MessageBox.Show("按钮被点击了!");
}
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
在这个示例中,我们创建了一个名为ColoredRoundedRectButton
的自定义控件,它绘制了一个圆角彩色矩形按钮,并支持点击事件。然后,在MainForm
中创建了一个窗体,将这个自定义按钮添加到窗体上,并订阅了按钮的Click
事件。当按钮被点击时,会弹出一个消息框。你可以根据你的需求进一步自定义按钮的外观和功能。
🚀感谢:给读者的一封信
亲爱的读者,
我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。
如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。
我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。
如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。
![在这里插入图片描述](https://img-blog.csdnimg.cn/e06a317e89694a23ad89d2c59538c3a1.jpeg#pic_center =450x300)
再次感谢您的阅读和支持!
最诚挚的问候, “愚公搬代码”
- 点赞
- 收藏
- 关注作者
评论(0)