在 Windows 窗体上拖动时调整矩形大小

2023-12-13

我在 Windows 窗体顶部绘制了一个矩形,我想使用提供的手柄之一调整它的大小!

enter image description here

Rectangle areaRect = new Rectangle(100,100, 300, 300);
Bool dragging = false;
Point ptOld = new Point(0, 0);

protected override void OnPaint(PaintEventArgs e)
{
  Graphics dcPaint = e.Graphics;
  dcPaint.DrawRectangle(rectPen, areaRect);
}

protected override void OnMouseDown(MouseEventArgs e)
{
  ptOld = new Point(e.X, e.Y);
  dragging = true;
}

protected override void OnMouseMove(MouseEventArgs e)
{
  if(dragging = true) 
  {
    Point ptNew = new Point(e.X, e.Y);
    Int32 handleSelected = GetSelectedHandle(ptNew);

   // Lets say I want to resize this rectangle using Handle 2 now.
    if(handleSelected == 2) 
    {
      // I am resizing this rectangle Width
      areaRect.X += ptNew.X - ptOld.X;
      areaRect.Width -= ptNew .X - ptOld.X;

      this.Invalidate();
    }
  }
}

protected override void OnMouseUp(MouseEventArgs e)
{
  dragging = false;
}

它会给我这样的效果。哪个是对的,

enter image description here

我想对此进行一些小调整,我也想改变这个矩形的高度,当我移动点 2 时,我的点 7 应该保持原样,像这样...... 同样,当我移动点 4 时,我的点 5 应该完好无损,依此类推,点 7 和 2 也应该完好无损。

enter image description here

知道如何继续吗,因为如果我改变高度,我的点 7 位置也会改变?


画在一个MouseMove这样在 WinForms 中不会很顺利。

在调整矩形大小之前,您基本上需要对矩形的引用。

我添加了以下代码来跟踪矩形和 8 个可拖动点:

private Point GetHandlePoint(int value) {
  Point result = Point.Empty;

  if (value == 1)
    result = new Point(areaRect.Left, areaRect.Top);
  else if (value == 2)
    result = new Point(areaRect.Left, areaRect.Top + (areaRect.Height / 2));
  else if (value == 3)
    result = new Point(areaRect.Left, areaRect.Bottom);
  else if (value == 4)
    result = new Point(areaRect.Left + (areaRect.Width / 2), areaRect.Top);
  else if (value == 5)
    result = new Point(areaRect.Left + (areaRect.Width / 2), areaRect.Bottom);
  else if (value == 6)
    result = new Point(areaRect.Right, areaRect.Top);
  else if (value == 7)
    result = new Point(areaRect.Right, areaRect.Top + (areaRect.Height / 2));
  else if (value == 8)
    result = new Point(areaRect.Right, areaRect.Bottom);

  return result;
}

private Rectangle GetHandleRect(int value) {
  Point p = GetHandlePoint(value);
  p.Offset(-2, -2);
  return new Rectangle(p, new Size(5, 5));
}

以下是我修改表单代码的方法:

private Rectangle areaRect = new Rectangle(100, 100, 300, 300);
private Rectangle oldRect;
private int dragHandle = 0;
private Point dragPoint;

public Form1() {
  InitializeComponent();
  this.DoubleBuffered = true;
}

protected override void OnMouseDown(MouseEventArgs e) {
  for (int i = 1; i < 9; i++) {
    if (GetHandleRect(i).Contains(e.Location)) {
      dragHandle = i;
      oldRect = areaRect;
      dragPoint = GetHandlePoint(i);
    }
  }
  base.OnMouseDown(e);
}

protected override void OnMouseMove(MouseEventArgs e) {
  if (dragHandle == 1) {
    // to do
  } else if (dragHandle == 2) {
    int diff = dragPoint.X - e.Location.X;
    areaRect = new Rectangle(oldRect.Left - diff, oldRect.Top, oldRect.Width + diff, oldRect.Height);
  } else if (dragHandle == 7) {
    int diff = dragPoint.X - e.Location.X;
    areaRect = new Rectangle(oldRect.Left, oldRect.Top, oldRect.Width - diff, oldRect.Height);
  }

  if (dragHandle > 0)
    this.Invalidate();

  base.OnMouseMove(e);
}

protected override void OnMouseUp(MouseEventArgs e) {
  dragHandle = 0;
  base.OnMouseUp(e);
}

protected override void OnPaint(PaintEventArgs e) {
  e.Graphics.DrawRectangle(Pens.Red, areaRect);
  for (int i = 1; i < 9; i++) {
    e.Graphics.FillRectangle(Brushes.DarkRed, GetHandleRect(i));
  }
  base.OnPaint(e);
}

发布的代码仅执行第 #2 点和第 #7 点,但这应该为您提供一些可以使用的逻辑。我确信这段代码可以改进,它只是一个工作示例。

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

在 Windows 窗体上拖动时调整矩形大小 的相关文章

随机推荐

  • 使用布尔掩码有效地将 numpy 数组的元素归零

    所以我创建了一个超慢的版本 arr np arange 3 9 reshape 3 9 print arr to black np random choice a False True size 9 for i j in enumerate
  • 在python中分隔克拉A

    我有以下形式的数据 37101000ssd48800 A1420asd938987 A2011 09 10 A18 47 50 000 A99 00 A1 A0 A 37101000sd48801 A44557asd03082 A2011
  • iOS 13 - 当搜索主动推送到其他 VC 时,该 VC UITableView 会位于 Swift 4 中的导航栏下方

    我已经在 iOS 12 中检查过它工作正常 问题是当我要搜索并推送到第二个 VC 时它工作正常 当我来回推到第二个 VC 时 UITableview 就会进入导航栏下方 正常推送工作正常 仅在搜索活动并第二次推送时出现问题 我已经尝试过下面
  • Google Dataflow / Apache Beam Python - PCollection 的侧面输入会降低性能

    我们正在使用 Python SDK 在 google 数据流中运行日志文件解析作业 数据分布在数百个每日日志中 我们通过云存储中的文件模式读取这些日志 所有文件的数据量约为 5 8 GB gz 文件 总共 50 8000 万行 loglin
  • 单个脚本可以在 Windows 批处理和 Linux Bash 中运行吗?

    是否可以编写一个在 Windows 视为 bat 和 Linux 通过 Bash 中执行的脚本文件 我知道两者的基本语法 但不明白 它可能会利用一些 Bash 的晦涩语法或一些 Windows 批处理器故障 要执行的命令可能只是一行来执行其
  • 在循环 x86-64 程序集之前和内部使用 printf

    我无法弄清楚如何在此函数中正确使用 printf 因此该函数称为 multInts 应该将第一个数组的第一个元素与第二个数组的第一个元素相乘 然后继续遍历整个数组 但是 实验说明指定我不能在主函数中调用 printf 因此 我需要打印出 P
  • 摩托罗拉手机上的谷歌地图出现故障

    在摩托罗拉 Bravo 上 地图视图的左下角有一个丑陋的橙色方块 而不是谷歌徽标 我不仅在我的应用程序上注意到这一点 而且在 Yelp 上也注意到了这一点 请参阅屏幕截图 有其他人看到过这个吗 有解决方法吗 我不知道它是否发生在其他摩托罗拉
  • 连接/处理脚本到 PySimpleGUI 按钮

    你们能帮助我知道如何连接 PySimpleGui 脚本中的按钮 该按钮将在按下 单击运行按钮时执行另一个 python 脚本 现在 我一直在 GUI 脚本中阅读有关 Subprocess 和 command os popen 的内容 lay
  • 如何杀死一段时间内没有输出的进程

    我编写了一个程序 该程序应该运行很长时间 并将进度输出到stdout但是 在某些情况下 它开始挂起 最简单的方法就是重新启动它 我的问题是 有没有办法做一些事情 只有在特定秒数内没有输出时才会终止进程 我开始思考这个问题 唯一想到的就是这样
  • Symfony 2 错误:调用非对象上的成员函数 get()

    我查找了一些解决方案 但没有找到适合我的问题的解决方案 在一个控制器中我创建另一个控制器的实例 Controller1 mailController new MailController mailController gt newComme
  • 在 C++ 中将字符串转换为 int [重复]

    这个问题在这里已经有答案了 我正在尝试将从文件中读取的字符串转换为 int 值 以便可以将其存储在整数变量中 这就是我的代码的样子 ifstream sin sin open movie output txt string line get
  • 如何在空手道中为 SOAP 创建动态负载

    我使用一个变量来读取 XML 文件 然后将其分配给另一个称为有效负载的变量 将该 XML 作为 CDATA 在有效负载中传递 我的有效负载结构不会改变 我必须使用不同的 XML 文件 即不同的 CDATA 进行三到五个连续的 SOAP 调用
  • 在 Cypress 中测试我的网站时如何将数据添加到 Stripe 中

    我会尝试解释我的问题 我在网站上进行了测试 mysite com 但在注册过程中 用户应添加信用卡数据 他们可以做到https checkout stripe com pay 单击 下一步 按钮后将打开此页面 如何添加信用卡数据 谢谢 Go
  • 如何编写 C# 5 异步?

    我有以下场景 当输入命令时 为了测试 它是一个控制台应用程序 当它准备好时 我希望它将是一个WebService 我执行一些代码 当需要进一步的用户输入时 我立即返回到命令解释器 当给出新的输入时 我希望处理从我离开的地方恢复 这听起来很像
  • 创建 iruby 笔记本时内核死掉

    我对 SciRuby 完全是菜鸟 我第一次使用 SciRuby 我正在关注这个video 概述如何使用 SciRuby 并绘制图形 图表等 当我转到 localhost 8888 并从右侧下拉菜单创建新笔记本时 Ruby 2 2 3 我在
  • 是否可以在一个 JVM 中运行多个映射任务?

    我想为 Hadoop 中的映射任务共享大量内存静态数据 RAM lucene 索引 有没有办法让多个map reduce任务共享同一个JVM 作业可以通过指定作业配置mapred job reuse jvm num tasks来重用任务JV
  • 使用 mysql php pdo 从数据库返回一个值

    我不想使用循环 我只从一行的一列中获取一个值 我通过以下代码得到了我想要的 但必须有一种更简单的方法使用 PDO try conn new PDO mysql host localhost dbname advlou test advlou
  • 用C程序杀死一个进程

    我正在编写一个程序 通过 vim 打开 txt 文件 每当我按 CTRL C 时 该进程就会被终止 但问题是我找不到我刚刚创建的进程的 pid 并杀死它 有谁能够帮助我 include
  • 如何使用 EF Core 将 JSON 存储在实体字段中?

    我正在使用 NET Core 针对 NETStandard 1 4 创建一个可重用库 并且正在使用 Entity Framework Core 对于两者来说都是新的 我有一个实体类 如下所示 public class Campaign Ke
  • 在 Windows 窗体上拖动时调整矩形大小

    我在 Windows 窗体顶部绘制了一个矩形 我想使用提供的手柄之一调整它的大小 Rectangle areaRect new Rectangle 100 100 300 300 Bool dragging false Point ptOl