Перетащите PictureBox - PullRequest
       44

Перетащите PictureBox

0 голосов
/ 28 марта 2020

Я хочу перетащить PictureBox, и мне удалось это сделать. Но мое приложение не делает это так гладко, как Windows просмотрщик фотографий . Я имею в виду, разница не велика или что-то, но это заметно. Есть ли что-то, что я могу сделать, чтобы сделать его немного менее изменчивым? Это мой простой код:

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);
    }
}

1 Ответ

1 голос
/ 29 марта 2020

Вот демонстрация, которая иллюстрирует ваш подход и предложенный в комментариях.

Тестирование вашего кода дает:

SOQ60819266A

Принимая во внимание, что предлагаемый код:

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);
    }
}

Производит:

SOQ60819266B

Обратите внимание, что я также использую фоновое изображение, чтобы сделать ситуацию хуже, если можно так сказать. Однако без фонового изображения сложно определить, какой фрагмент кода используется.

...