如何使矩形的第一个位置将是鼠标光标位置,终点将是我离开鼠标左键的位置?

2024-01-06

我有这个代码:

private void pictureBoxSnap_Paint(object sender, PaintEventArgs e)
        {
            if (pictureBoxSnap.Image != null)
            {
                if (btn == true)
                {
                    if (Rect != null && Rect.Width > 0 && Rect.Height > 0)
                    {
                        e.Graphics.DrawRectangle(pen, Rect);
                    }
                }
            }
        }

        private void pictureBoxSnap_MouseMove(object sender, MouseEventArgs e)
        {
            if (btn == true)
            {
            if (e.Button == MouseButtons.Left)
                return;
            Point tempEndPoint = e.Location;
            Rect.Location = new Point(
                Math.Min(RectStartPoint.X, tempEndPoint.X),
                Math.Min(RectStartPoint.Y, tempEndPoint.Y));
            Rect.Size = new Size(
                Math.Abs(RectStartPoint.X - tempEndPoint.X),
                Math.Abs(RectStartPoint.Y - tempEndPoint.Y));

                pictureBoxSnap.Invalidate();
            }
        }

        private void pictureBoxSnap_MouseDown(object sender, MouseEventArgs e)
        {
            btn = !btn;
        }

我想做的是两件事:

  1. 当我第一次点击鼠标左键时RectStartPoint X and Y应该是鼠标光标现在所在的位置。然后我移动鼠标,矩形会变大或变小,然后当我再次单击鼠标左键时,将矩形保留为上次鼠标光标所在的大小。我怎样才能得到它? 现在一切都开始于0,0 the RectStartPoint0,0如果我把它改成e.Location.X and Y反而RectStartPoint它不会画任何东西。

  2. 第二件事是,当我第一次单击鼠标左键并更改矩形大小时,如果我继续移动鼠标,同时再次单击鼠标左键,则矩形将消失/删除。如果我不移动鼠标,仅单击左键,则矩形将保留。为什么我移动鼠标的同时点击左键矩形会被删除?


我不太确定你想从你的问题中得到什么。下面的代码执行经典的橡皮筋操作:它绘制一个实时矩形,并在您单击而不移动时将其删除。

我把计算放在一个灵活的函数中。

bool btn = false;
Point RectStartPoint = Point.Empty;
Point RectEndPoint = Point.Empty;

private void pictureBoxSnap_Paint(object sender, PaintEventArgs e)
{
    if (pictureBoxSnap.Image != null)
    {
        {
            Rectangle Rect = getRect(RectStartPoint, RectEndPoint); ;
            if (Rect != Rectangle.Empty)
            {
                e.Graphics.DrawRectangle(Pens.Firebrick, Rect);
            }
        }
    }
}

private void pictureBoxSnap_MouseMove(object sender, MouseEventArgs e)
{
    if (btn == true)
    {
        RectEndPoint = e.Location;
        pictureBoxSnap.Invalidate();
    }
}

private void pictureBoxSnap_MouseDown(object sender, MouseEventArgs e)
{
    RectStartPoint = e.Location;
    btn = true;
}

private void pictureBoxSnap_MouseUp(object sender, MouseEventArgs e)
{
    btn = false;
    RectEndPoint = e.Location;
    pictureBoxSnap.Invalidate();
}

Rectangle getRect(Point p1, Point p2)
{
    Point p = new Point(Math.Min(p1.X, p2.X),Math.Min(p1.Y, p2.Y) );
    Size s = new Size(Math.Abs(p1.X - p2.X), Math.Abs(p1.Y - p2.Y));
    return new Rectangle(p, s);
}

注 1:PictureBox 控件已经是双缓冲的,因此无论您绘制的速度多快或多大,它都不会闪烁。

注 2:您可能需要更彻底地检查鼠标按钮是否会涉及到右侧(或中间)按钮。这是“正确”检查的示例:

if (e.Button & MouseButtons.Left != MouseButtons.None)  ..
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使矩形的第一个位置将是鼠标光标位置,终点将是我离开鼠标左键的位置? 的相关文章

  • DispatcherTimer 未按时执行

    我正在使用 c 中的 DispatchTimer 编写一个时钟应用程序 但由于某些原因 我的时钟似乎时不时地跳过 1 秒 例如 52 秒 gt 54 秒 跳过 53 秒 在我看来 计时器并不是每秒都执行一次 DispatcherTimer
  • MVC 重定向到没有控制器的视图

    希望应该是一个简单的 我创建了一个通用错误视图 当整个站点的操作方法内发生异常时 我想显示该视图 我创建了一个部分页面 所有导航都位于其中 因此我不需要在此视图上使用控制器 那么如何从控制器内的操作方法重定向到它 像这样的东西 HttpPo
  • 扫描文本文件时如何跳过行?

    我想扫描一个文件并在阅读之前跳过一行文本 我试过 fscanf pointer n struct test i j 但这个语法只是从第一行开始 我可以使用 scanf 使用以下指令跳过行 fscanf config file n n 格式字
  • 没有 Unicode 字节顺序标记。无法切换到 Unicode

    我正在使用 XSD 编写 XML 验证器 下面是我所做的 但是当验证器到达该线时while list Read 它给了我错误 没有 Unicode 字节顺序标记 无法切换到 Unicode 有人可以帮我解决吗 public class Va
  • WebClient读取错误页面的内容

    我有一个加载页面内容的应用程序 我使用 WebClient 类 即使服务器返回 404 500 等错误 我也需要检索内容 我需要这样的东西 WebClient wc new WebClient string pageContent try
  • Android NDK C++“wstring”支持

    我有用 C 编写的源代码 lib 现在我想在 Android NDK 项目 NDK 6 中编译并使用相同的源代码 lib 我能够编译大多数 C 文件 除了基于 std wstring 的功能 在 Application mk 中 当我指定时
  • 为什么派生类不使用基类的operator=(赋值运算符)?

    以下是实际问题的简化版本 而不是打电话Base operator int 代码似乎生成了一个临时的Derived对象并复制它 既然函数签名似乎完美匹配 为什么不使用基本赋值运算符 这个简化的示例没有显示任何不良影响 但原始代码在析构函数中有
  • 如何将pdf页面设置设置为打印属性对话框?

    大家好 我想知道如何设置 pdf 页面设置到打印属性对话框 例如 如果我的 PDF 页面设置为横向 则布局会自动显示横向而不是纵向 如果我的 PDF 页面设置为纵向 则布局会自动显示纵向 我在这个主题上做了很多研发 但没有找到任何满意的链接
  • 通过单个 GPIO 引脚转储闪存

    我正在使用 Infineon 的 XMC4500 Relax Kit 并尝试通过单个 GPIO 引脚提取固件 我非常天真的想法是通过 GPIO 引脚一次转储一位 然后用逻辑分析仪以某种方式 嗅探 数据 伪代码 while word by w
  • 返回 int& 的函数[重复]

    这个问题在这里已经有答案了 我在网上查了一下发现一篇试图解释的文章std move和右值 http thbecker net articles rvalue references section 01 html并发现了一些我实在无法掌握的东
  • rand() 播种与 time() 问题

    我很难弄清楚如何使用 rand 并使用 Xcode 用 time 为其播种 我想生成 0 到 1 之间的随机十进制数 该代码为我提供了元素 1 和 2 看似随机的数字 但元素 0 始终在 0 077 左右 有什么想法吗 我的代码是 incl
  • 将 C# 反射代码移植到 Metro-Ui

    我正在尝试移植使用反射的现有 C 类 通用工厂 但我无法编译这段代码 Type types Assembly GetAssembly typeof TProduct GetTypes foreach Type type in types i
  • 使用反射获取基类的受保护属性值

    I would like to know if it is possible to access the value of the ConfigurationId property which is located in the base
  • .net Framework (.net 4.0) 中定义 Base 3 数字的类

    我正在寻找一些可以用来定义 3 基数 三进制数 的类 有什么我可以在 net 框架中使用的东西或者我需要写一些东西吗 谢谢你的帮助 您可以使用解析Convert ToInt32 s base http msdn microsoft com
  • 导出到 CSV 时 Gridview 出现空行

    这个问题是由进一步讨论引发的这个问题 https stackoverflow com questions 6674555 export gridview data into csv file 6674589 noredirect 1 com
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • 如何使用泛型类型的 DataContractSerializer 编写自定义序列化器?

    我想编写一个自定义序列化器 用于将会话状态存储到Azure 缓存 预览版 这意味着这个自定义序列化器必须实现IDataCacheObjectSerializer 如果我错了 请告诉我 我需要编写这个自定义序列化程序的原因是我需要序列化一些包
  • 指示泛型返回动态类型的对象

    这个问题是我原来问题的后续问题here https stackoverflow com questions 2541184 using a type object to create a generic 假设我有以下泛型类 简化 class
  • 如何在 C# 中使用 XmlDsigC14NTransform 类

    我正在尝试使用规范化 xml 节点System Security Cryptography Xml XMLDsigC14nTransformC net Framework 2 0 的类 该实例需要三种不同的输入类型 NodeList Str
  • 使用剪贴板 SetText 换行

    如何使用 SetText 方法添加换行符 I tried Clipboard SetText eee n xxxx 但当我将剪贴板数据粘贴到记事本中时 它没有给我预期的结果 预期结果 eee xxxx 我怎样才能做到这一点 Windows

随机推荐