1

WinFormアプリケーションがあり、を使用してフォーム内のpictureBoxを移動しようとしていますMouseMove Eventが、MouseMoveで正しい計算を行う必要があるかどうかわかりません。最初にpictureBoxを使用すると、その場所が無意味に変化します。移動すると、pictureBoxの場所が正しく移動します。

OuterPanelこれは、pictureBoxを含むPanel名ですpicBox。ここでは、コードimを使用しています。

private void picBox_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        Point p = OuterPanel.PointToClient(MousePosition);
        picBox.Location = this.PointToClient(p);
    }
}

PS:目標は、Windowsフォトビューアーのように、ズームインした後の動画です

ここに画像の説明を入力してください

更新ConvertFromChildToFormメソッド

private Point ConvertFromChildToForm(int x, int y,Control control)
{
    Point p = new Point(x, y);
    control.Location = p;
    return p;
}
4

3 に答える 3

4

正しく実行するには、3つのイベントを管理する必要があります。

  • MouseDown
  • MouseMove
  • MouseUp

これが関連するSOの質問です。

あなたのコードpicBox

private void picBox_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        Point p = ConvertFromChildToForm(e.X, e.Y, picBox);
        iOldX = p.X;
        iOldY = p.Y;
        iClickX = e.X;
        iClickY = e.Y;
        clicked = true;
    }
}

private void picBox_MouseMove(object sender, MouseEventArgs e)
{
    if (clicked)
    {
        Point p = new Point(); // New Coordinate
        p.X =  e.X + picBox.Left;
        p.Y =  e.Y + picBox.Top;
        picBox.Left = p.X - iClickX;
        picBox.Top = p.Y - iClickY;
    }
}

private void picBox_MouseUp(object sender, MouseEventArgs e)
{
    clicked = false;   
}

private Point ConvertFromChildToForm(int x, int y, Control control)
{
    Point p = new Point(x, y);
    control.Location = p;
    return p;
}

ConvertFromChildToFormからの方法Mur Haf Soz

于 2012-05-19T04:49:33.103 に答える
0

これを試して。美しい。

const uint WM_NCLBUTTONDOWN = 161;
const uint HTCAPTION = 2;

[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr window, uint message, IntPtr wParam, IntPtr lParam);

public Form1()
{
    PictureBox picBox = new PictureBox();
    picBox.Text = "this control is crazy!";
    picBox.BackColor = Color.Red;
    picBox.SetBounds(8, 8, 128, 64);
    picBox.MouseDown += OnMouseDown;
    Controls.Add(picBox);
}

private void OnMouseDown(object sender, MouseEventArgs e)
{
    ReleaseCapture();
    SendMessage((sender as Control).Handle, WM_NCLBUTTONDOWN, (IntPtr) HTCAPION, IntPtr.Zero);
}

問題は、WinApi を使用する必要があることだけです。また、ラベルを移動させません。なぜだかわからない。

于 2014-10-30T14:33:00.727 に答える
0

使用して

ControlMoverOrResizer

この記事のクラスでは、コード 1 行だけで実行時に移動およびサイズ変更可能な制御を行うことができます。:) 例:

ControlMoverOrResizer.Init(button1);   

そして今、button1 は移動可能でサイズ変更可能なコントロールです!

于 2014-01-10T21:26:50.123 に答える