【问题标题】:Drag PictureBox拖动图片框
【发布时间】:2020-07-09 07:15:18
【问题描述】:

我想拖动一个 PictureBox,我已经成功地做到了。但是我的应用程序没有Windows photo viewer 那样顺利。我的意思是差异不是很大或任何东西,但它很明显。有什么我可以做的让它不那么波涛汹涌吗?这是我的简单代码:

int MOUSE_X = 0;
int MOUSE_Y = 0;

public Form1()
{
    InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
    picBox.Image = Image.FromFile(@"D:\test_big.png");
    picBox.Width = 3300;
    picBox.Height = 5100;
}

private void picBox_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        MOUSE_X = e.X;
        MOUSE_Y = e.Y;
    }
}

private void picBox_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        picBox.Left = picBox.Left + (e.X - MOUSE_X);
        picBox.Top = picBox.Top + (e.Y - MOUSE_Y);
    }
}

【问题讨论】:

  • 如果您在表单上设置了 DoubleBuffer,请将其关闭。
  • 我没有接触过 DoubleBuffer,但我在表单加载时测试了 false / true,但没有发现任何不同。
  • DoubleBuffer 在窗体上处于活动状态可能会在拖动大图像时导致卡顿。如果它已经关闭,我不明白为什么拖动操作不应该流畅。除非您有其他未提及的尺寸或绘画逻辑(或其他计算)。
  • 不,我只有问题中的代码,我没有修改任何其他内容。我的意思是它不会卡得太厉害,但与 Windows 照片查看器相比,它绝对是显而易见的。
  • 你在父窗体中有背景图片吗?

标签: c# forms optimization picturebox drag


【解决方案1】:

这是一个演示,说明了您的方法和 cmets 中建议的方法。

测试您的代码会产生:

而建议的代码:

using System.Runtime.InteropServices;
//...

private const int WM_SYSCOMMAND = 0x112;
private const int MOUSE_MOVE = 0xF012;

[DllImport("user32.dll")]
private static extern IntPtr SendMessage(
    IntPtr hWnd,
    int wMsg,
    IntPtr wParam,
    IntPtr lParam);

[DllImport("user32.dll")]
private static extern int ReleaseCapture(IntPtr hWnd);

private void picBox_MouseMove(object sender, MouseEventArgs e)
{
    if (!DesignMode && e.Button == MouseButtons.Left)
    {
        ReleaseCapture(picBox.Handle);
        SendMessage(picBox.Handle, WM_SYSCOMMAND, (IntPtr)MOUSE_MOVE, IntPtr.Zero);
    }
}

生产:

请注意,如果我可以这么说的话,我还会使用背景图片来使情况变得更糟。但是,没有背景图片,很难检测出使用了哪个代码sn-p。

【讨论】:

  • 第一个代码可以直接在 picBox_MouseMove 上方,对吗?当然在最顶端使用。如果那是正确的,只要我拖动图片,它就会崩溃。感谢您迄今为止的所有帮助! =)
  • 很好的例子!我不知道为什么,但是当我使用这个确切的代码时,我得到一个错误:imgur.com/jCniFg5
  • 哦,等一下,如果我出于某种原因不通过 VS 运行它,它会起作用......但遗憾的是我没有注意到任何区别(我没有背景)。也许 Windows 照片查看器只是用比 C# 更适合拖动图片的语言编写的。正如我所说的,Windows 照片查看器和它之间的差异并不大,但如果比较的话,绝对是显而易见的。无论如何,非常感谢帮助我尝试这种 win32 方法! =)
猜你喜欢
  • 2016-09-15
  • 2023-03-20
  • 2013-11-05
  • 2014-08-19
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 2013-10-25
相关资源
最近更新 更多