前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【愚公系列】2023年12月 GDI+绘图专题 Rectangle

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

原创
作者头像
愚公搬代码
修改2023-12-28 08:13:56
1540
修改2023-12-28 08:13:56
举报
文章被收录于专栏:历史专栏历史专栏

🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,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腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🚀前言
  • 🚀一、Rectangle
    • 🔎1.Empty
      • 🔎2.属性
        • 🔎3.静态方法
          • 🔎4.非静态方法
            • 🔎5.运算符
              • 🔎6.案例
              相关产品与服务
              云开发 CloudBase
              云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档