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

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(使用前将#替换为@)

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

  • 尚未注册类型“IServiceProviderFactory[Autofac.ContainerBuilder]”的服务

    当运行以下命令添加数据库迁移脚本时 出现以下错误 dotnet ef migrations add InitialCreate v o Migrations context MyContext 访问 Microsoft Extensions
  • 通过 SocketCAN 进行 boost::asio

    我正在考虑利用升压阿西奥 http www boost org doc libs 1 49 0 doc html boost asio html从a读取数据套接字CAN http en wikipedia org wiki SocketCA
  • 如何在 DataColumn.Expression 中使用 IF/ELSE 或 CASE?

    我有一个包含 1 列的表 状态 我想添加另一列名为 Action 的列 其值如下 如果 Status Yes 则 Action Go 否则 Action Stop 我使用以下代码添加到 操作 列中 但它不起作用 myDataTable Co
  • 有没有快速创建集合的方法?

    目前我正在创建一个像这样的新集 std set a s s insert a1 s insert a2 s insert a3 s insert a10 有没有办法创建s在一行 int myints 10 20 30 40 50 std s
  • 如何保证对象只有一个线程

    我有以下代码 class Service public void start creates thread which creates window and goes to message loop void stop sends WM C
  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 平滑滚动.net 表单

    您好 我正在 net 中使用表单 并且在运行时动态添加大量链接标签 我将这些链接标签添加到面板并将该面板添加到 winform 当链接标签的数量增加时 表单会显示一个自动滚动条 垂直 现在 当我使用自动滚动向下滚动时 表单在滚动时不会更新其
  • 我如何在 C# .NET(win7 手机)中使用“DataContractJsonSerializer”读入“嵌套”Json 文件?

    我有一个问题 如果我的 json 文件看起来像这样 Numbers 45387 Words 空间桶 我可以很好地阅读它 但是如果它看起来像这样 Main Numbers 45387 Words 空间桶 某事 数字 12345 单词 克兰斯基
  • 防止 boost::asio::io_context 在空轮询调用时停止

    此代码调用发布的句柄 boost asio io context ioc boost asio post ioc std cout lt lt lol lt lt std endl ioc poll 而这并没有 boost asio io
  • ASP.Net Core 内容配置附件/内联

    我正在从 WebAPI 控制器返回一个文件 Content Disposition 标头值自动设置为 附件 例如 处置 附件 文件名 30956 pdf 文件名 UTF 8 30956 pdf 当它设置为附件时 浏览器将要求保存文件而不是打
  • 如何在 C# 控制台应用程序中将修饰符(ctrl、alt、shift)按键捕获为单个按键?

    Console ReadKey 仅在按下 正常 键时捕获输入 然后将修饰符 如果有 附加为键信息的一部分 如何将单个修饰键注册为输入 提供了一种解决方案这个链接 https blogs msdn microsoft com toub 200
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • C++ php 和静态库

    我创建了一个library a 其中包含 cpp 和 h 文件 其中包含很多类 嵌套类和方法 我想在 php 示例中包含这个静态库并尝试使用它 我想提一下 我是 php 新手 我已经在 test cpp 文件中测试了我的 libray a
  • 无法在内存位置找到异常源:cudaError_enum

    我正在尝试确定 Microsoft C 异常的来源 test fft exe 中 0x770ab9bc 处的第一次机会异常 Microsoft C 异常 内存位置 0x016cf234 处的 cudaError enum 我的构建环境是 I
  • 如何分析组合的 python 和 c 代码

    我有一个由多个 python 脚本组成的应用程序 其中一些脚本正在调用 C 代码 该应用程序现在的运行速度比以前慢得多 因此我想对其进行分析以查看问题所在 是否有工具 软件包或只是一种分析此类应用程序的方法 有一个工具可以将 python
  • 如何在c的case语句中使用省略号?

    CASE expr no commas ELLIPSIS expr no commas 我在c的语法规则中看到了这样的规则 但是当我尝试重现它时 int test float i switch i case 1 3 printf hi 它失
  • cout 和字符串连接

    我刚刚复习了我的 C 我尝试这样做 include
  • 每个数据库多个/单个 *.edmx 文件

    我有一个通过 ADO net 数据服务与数据库交互的项目 数据库很大 近 150 个具有依赖关系的表 该项目几年前开始 当时使用的是数据集 现在我们正在转向实体模型关系 由于我们添加了更多需要使用的表 该模型正在不断增长 这是管理这一切的正

随机推荐