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

举报
愚公搬代码 发表于 2023/11/29 22:37:51 2023/11/29
【摘要】 🏆 作者简介,愚公搬代码🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物...

🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,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属性来检查一个矩形是否为空,例如:

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 属性的介绍和示例:

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

    示例:

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

    示例:

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

    示例:

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

    示例:

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

    示例:

    Rectangle rect = new Rectangle(10, 20, 30, 40);
    int width = rect.Width; // 返回 30
    
  6. Height:获取或设置矩形的高度。

    示例:

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

    示例:

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

    示例:

    Rectangle rect = new Rectangle(10, 20, 30, 40);
    int y = rect.Y; // 返回 20
    
  9. Size:获取或设置矩形的大小(Size 结构)。

    示例:

    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+绘制一个圆角彩色矩形按钮,并支持点击事件:

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)

再次感谢您的阅读和支持!

最诚挚的问候, “愚公搬代码”

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。