【问题标题】:Winform MouseMove event (left button down) fired when Doubleclick title bar to maximize window双击标题栏以最大化窗口时触发 Winforms MouseMove 事件(左键按下)
【发布时间】:2021-10-21 08:49:45
【问题描述】:

我正在尝试编写一些代码来“拖动”我的 Winform 应用程序中的某些内容。代码如下:

    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            this.textBox1.AppendText($"{DateTime.Now}\r\n");
        }
    } 

但是当我双击标题栏最大化窗口时,MouseMove 事件被触发并且e.ButtonMouseButtons.Left 所以我可以看到一些文本出现在文本框中。但是,当使用Maximize window 按钮(在X 按钮旁边)时不会发生这种情况。

发生了什么事?

我的环境: Windows 10 企业版、Visual Studio Enterprise 2019 v16.5.4、.net framework 4.6.1

【问题讨论】:

  • 大多数鼠标动作都是在鼠标抬起事件上触发的。例如,最大化按钮单击。双击标题栏有点奇怪的是,操作系统在第二个鼠标 down 事件而不是 mouse-up 事件上调整大小。你会得到一个鼠标移动,窗口位置改变了,所以相对鼠标位置改变了。你会看到按钮向下。使用 Control.DoDragDrop() 是避免意外的最佳方式。
  • @HansPassant 谢谢。但Control.DoDragDrop() 似乎用于在不同应用程序之间的不同窗口事件之间拖动对象(例如文件)。这对我来说有点“重”。

标签: winforms


【解决方案1】:

更改条件以检查执行了多少次点击:

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left && e.Clicks == 1) // <-- Here
    {
        this.textBox1.AppendText($"{DateTime.Now}\r\n");
    }
}

【讨论】:

  • 我试过了,但我也不能拖动。当我拖入表单时,AppendText 行永远不会运行。
  • 你要拖什么? textBox1?还是Form1
  • 我在Form上画了一些我自己的形状,我想用鼠标拖动它们。
  • 还有...为什么需要Form.MouseMove 事件而不是OwnShape.MouseMove 来拖动它们?
  • 我的形状不是 Controls 。它们是使用“g.FillRect()”绘制的。所以我的对象本身不处理鼠标事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多