首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
【愚公系列】2023年11月 WPF控件专题 Line控件详解
2
【愚公系列】2023年11月 WPF控件专题 2023秋招WPF高频面试题
3
【愚公系列】2023年11月 Winform控件专题 Label控件详解
4
【愚公系列】2023年11月 Winform控件专题 Button控件详解
5
【愚公系列】2023年11月 Winform控件专题 Form控件详解
6
【愚公系列】2023年11月 Winform控件专题 TextBox控件详解
7
【愚公系列】2023年11月 Winform控件专题 CheckBox控件详解
8
【愚公系列】2023年11月 Winform控件专题 RadioButton控件详解
9
【愚公系列】2023年11月 Winform控件专题 ComboBox控件详解
10
【愚公系列】2023年11月 Winform控件专题 RichTextBox控件详解
11
【愚公系列】2023年11月 Winform控件专题 ListBox控件详解
12
【愚公系列】2023年11月 Winform控件专题 CheckedListBox控件详解
13
【愚公系列】2023年11月 Winform控件专题 numericUpDown控件详解
14
【愚公系列】2023年11月 Winform控件专题 LinkLabel控件详解
15
【愚公系列】2023年11月 Winform控件专题 DateTimePicker控件详解
16
【愚公系列】2023年11月 Winform控件专题 NotifyIcon控件详解
17
【愚公系列】2023年11月 Winform控件专题 ContextMenuStrip控件详解
18
【愚公系列】2023年11月 Winform控件专题 Timer控件详解
19
【愚公系列】2023年11月 Winform控件专题 PictureBox控件详解
20
【愚公系列】2023年11月 Winform控件专题 Chart控件详解
21
【愚公系列】2023年11月 Winform控件专题 DataGridView控件详解
22
【愚公系列】2023年11月 Winform控件专题 TableLayoutPanel控件详解
23
【愚公系列】2023年11月 Winform控件专题 ProgressBar控件详解
24
【愚公系列】2023年11月 Winform控件专题 Panel控件详解
25
【愚公系列】2023年11月 Winform控件专题 FlowLayoutPanel控件详解
26
【愚公系列】2023年11月 Winform控件专题 GroupBox控件详解
27
【愚公系列】2023年11月 Winform控件专题 SplitContainer控件详解
28
【愚公系列】2023年11月 Winform控件专题 TabControl控件详解
29
【愚公系列】2023年11月 Winform控件专题 ToolTip控件详解
30
【愚公系列】2023年11月 Winform控件专题 MaskedTextBox控件详解
31
【愚公系列】2023年11月 Winform控件专题 MonthCalendar控件详解
32
【愚公系列】2023年11月 Winform控件专题 TreeView控件详解
33
【愚公系列】2023年11月 Winform控件专题 MenuStrip控件详解
34
【愚公系列】2023年11月 Winform控件专题 OpenFileDialog控件详解
35
【愚公系列】2023年11月 Winform控件专题 SaveFileDialog控件详解
36
【愚公系列】2023年12月 Winform控件专题 FontDialog控件详解
37
【愚公系列】2023年12月 Winform控件专题 ColorDialog控件详解
38
【愚公系列】2023年12月 Winform控件专题 FolderBrowserDialog控件详解
39
【愚公系列】2023年12月 Winform控件专题 StatusStrip控件详解
40
【愚公系列】2023年12月 Winform控件专题 ToolStrip控件详解
41
【愚公系列】2023年12月 Winform控件专题 HelpProvider控件详解
42
【愚公系列】2023年12月 Winform控件专题 ToolStripContainer控件详解
43
【愚公系列】2023年12月 Winform控件专题 BackgroundWorker控件详解
44
【愚公系列】2023年12月 GDI+绘图专题 图形图像编程基础
45
【愚公系列】2023年12月 GDI+绘图专题 图形图像的重绘
46
【愚公系列】2023年12月 GDI+绘图专题 颜色获取和图形绘制
47
【愚公系列】2023年12月 GDI+绘图专题 Point
48
【愚公系列】2023年12月 GDI+绘图专题 Rectangle
49
【愚公系列】2023年12月 GDI+绘图专题 Matrix
50
【愚公系列】2023年12月 GDI+绘图专题 Pen

【愚公系列】2023年12月 GDI+绘图专题 Rectangle

🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。 🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。 🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。 🏆🎉欢迎 👍点赞✍评论⭐收藏

🚀前言

在WinForm中,Rectangle是一个表示矩形的类,它包含了多个属性和方法,下面是一些常用的属性和方法介绍:

属性:

  1. X:获取或设置矩形左上角的 X 坐标。
  2. Y:获取或设置矩形左上角的 Y 坐标。
  3. Width:获取或设置矩形的宽度。
  4. Height:获取或设置矩形的高度。
  5. Location:获取或设置矩形的左上角的坐标。
  6. Size:获取或设置矩形的大小。
  7. Left:获取矩形左侧的 X 坐标。
  8. Top:获取矩形顶部的 Y 坐标。
  9. Right:获取矩形右侧的 X 坐标。
  10. Bottom:获取矩形底部的 Y 坐标。

方法:

  1. Contains(Point):判断一个点是否在矩形中。
  2. Contains(Rectangle):判断一个矩形是否被包含在另一个矩形中。
  3. IntersectsWith(Rectangle):判断是否与另一个矩形相交。
  4. Inflate(Int32, Int32):扩大或缩小矩形的大小。
  5. Offset(Int32, Int32):移动矩形的位置。

使用Rectangle类能够方便地处理矩形的各种操作,比如检测碰撞、裁剪等等。

🚀一、Rectangle

🔎1.Empty

Rectangle属性的Empty表示一个空的矩形,即矩形的宽度和高度都为0,且位于坐标系的原点上。它是一个静态只读属性,可以用于初始化Rectangle结构的实例或将Rectangle结构的实例设置为一个空矩形。在实际编程中,可以使用Empty属性来检查一个矩形是否为空,例如:

代码语言:csharp
复制
Rectangle rect = new Rectangle(0, 0, 0, 0);
if(rect == Rectangle.Empty)
{
    //rect是一个空矩形
}

当需要创建一个矩形对象但不知道具体的尺寸时,可以使用Empty来初始化Rectangle属性,然后再根据实际需要设置其位置和尺寸。例如:

代码语言:csharp
复制
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 属性的介绍和示例:

  1. Left:获取或设置矩形的左边界的 x 坐标。

示例:

代码语言:csharp
复制
Rectangle rect = new Rectangle(10, 20, 30, 40);
int left = rect.Left; // 返回 10
  1. Right:获取矩形的右边界的 x 坐标(只读属性)。

示例:

代码语言:csharp
复制
Rectangle rect = new Rectangle(10, 20, 30, 40);
int right = rect.Right; // 返回 40(左边界的 x 坐标 + 宽度)
  1. Top:获取或设置矩形的上边界的 y 坐标。

示例:

代码语言:csharp
复制
Rectangle rect = new Rectangle(10, 20, 30, 40);
int top = rect.Top; // 返回 20
  1. Bottom:获取矩形的下边界的 y 坐标(只读属性)。

示例:

代码语言:csharp
复制
Rectangle rect = new Rectangle(10, 20, 30, 40);
int bottom = rect.Bottom; // 返回 60(上边界的 y 坐标 + 高度)
  1. Width:获取或设置矩形的宽度。

示例:

代码语言:csharp
复制
Rectangle rect = new Rectangle(10, 20, 30, 40);
int width = rect.Width; // 返回 30
  1. Height:获取或设置矩形的高度。

示例:

代码语言:csharp
复制
Rectangle rect = new Rectangle(10, 20, 30, 40);
int height = rect.Height; // 返回 40
  1. X:获取或设置矩形的左上角顶点的 x 坐标。

示例:

代码语言:csharp
复制
Rectangle rect = new Rectangle(10, 20, 30, 40);
int x = rect.X; // 返回 10
  1. Y:获取或设置矩形的左上角顶点的 y 坐标。

示例:

代码语言:csharp
复制
Rectangle rect = new Rectangle(10, 20, 30, 40);
int y = rect.Y; // 返回 20
  1. Size:获取或设置矩形的大小(Size 结构)。

示例:

代码语言:csharp
复制
Rectangle rect = new Rectangle(10, 20, 30, 40);
Size size = rect.Size; // 返回一个 Size 结构,宽度为 30,高度为 40

这些属性可用于检索和设置矩形的位置和尺寸,能够对图形元素进行准确的定位和调整。

🔎3.静态方法

Rectangle 结构提供了一些静态方法,用于执行不同的矩形操作。以下是这些静态方法的介绍和示例:

  1. 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 内
    • 描述:用于确定一个矩形是否完全包含另一个矩形或指定的点。
    • 示例:
  2. Rectangle.Intersect 方法:Rectangle rect1 = new Rectangle(10, 10, 50, 50); Rectangle rect2 = new Rectangle(30, 30, 40, 40); Rectangle intersection = Rectangle.Intersect(rect1, rect2); // 返回一个新的矩形,表示两者的交集
    • 描述:用于计算两个矩形的交集。
    • 示例:
  3. Rectangle.Union 方法:Rectangle rect1 = new Rectangle(10, 10, 50, 50); Rectangle rect2 = new Rectangle(30, 30, 40, 40); Rectangle union = Rectangle.Union(rect1, rect2); // 返回一个新的矩形,表示两者的并集
    • 描述:用于计算两个矩形的并集。
    • 示例:
  4. Rectangle.FromLTRB 方法:Rectangle rect = Rectangle.FromLTRB(10, 20, 60, 70); // 创建一个左上角 (10, 20),右下角 (60, 70) 的矩形
    • 描述:用于创建一个矩形,通过指定左上角和右下角的坐标。
    • 示例:

这些静态方法允许您在处理矩形时执行常见的操作,如检测包含关系、计算交集和并集以及创建矩形。它们在图形处理和布局管理中非常有用。

🔎4.非静态方法

Rectangle 结构还提供了一些非静态方法,用于在实例级别执行不同的矩形操作。以下是这些非静态方法的介绍和示例:

  1. Rectangle.Intersect 方法:Rectangle rect1 = new Rectangle(10, 10, 50, 50); Rectangle rect2 = new Rectangle(30, 30, 40, 40); rect1.Intersect(rect2); // 将 rect1 修改为两者的交集
    • 描述:用于计算当前矩形与另一个矩形的交集,并将结果存储在当前矩形中。
    • 示例:
  2. 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 不相交
    • 描述:用于检查当前矩形是否与另一个矩形相交。
    • 示例:
  3. Rectangle.Inflate 方法:Rectangle rect = new Rectangle(10, 10, 50, 50); rect.Inflate(5, 5); // 扩大矩形,边界向外扩展 5 个单位
    • 描述:用于调整矩形的大小,通过添加或移除边框。
    • 示例:
  4. Rectangle.Offset 方法:Rectangle rect = new Rectangle(10, 10, 50, 50); rect.Offset(20, 30); // 移动矩形,将其左上角移到 (30, 40)
    • 描述:用于移动矩形的位置。
    • 示例:
  5. Rectangle.Contains 方法:Rectangle rect = new Rectangle(10, 10, 50, 50); Point point = new Point(20, 20); bool containsPoint = rect.Contains(point); // 返回 true,矩形包含点 (20, 20)
    • 描述:用于检查当前矩形是否包含另一个点或矩形。
    • 示例:
  6. 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 结构支持相等性运算符 == 和不相等性运算符 !=,这些运算符用于比较两个矩形是否相等或不相等。以下是它们的介绍和示例:

  1. == 运算符:Rectangle rect1 = new Rectangle(10, 20, 30, 40); Rectangle rect2 = new Rectangle(10, 20, 30, 40); bool areEqual = rect1 == rect2; // 返回 true,rect1 与 rect2 相等
    • 描述:== 运算符用于比较两个矩形是否相等,即它们的位置和尺寸是否完全相同。
    • 示例:
  2. != 运算符: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+绘制一个圆角彩色矩形按钮,并支持点击事件:

代码语言:csharp
复制
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事件。当按钮被点击时,会弹出一个消息框。你可以根据你的需求进一步自定义按钮的外观和功能。

我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!

下一篇
举报
领券