2012-05-19 33 views
0

我有一個WinForm應用程序,我試圖移動一個圖片使用MouseMove Event,但我不知道什麼是正確的計算,我應該在MouseMove上做什麼,當我第一次pictureBox,它的位置變化在一個無謂的方式然後移動pictureBox位置正確移動。如何在運行時移動mousemove上的控件?

這其中包含了圖片框picBox一個小組名稱OuterPanel,這裏的代碼即時通訊使用:

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照片查看器

enter image description here

更新ConvertFromChildToForm方法

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

回答

3

你必須要管理三個事件得到它做正確:

  • MouseDown
  • MouseMove
  • MouseUp

Here is a Related SO Question..

您的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

+0

我沒有任何叫做'ConvertFromChildToForm'的方法! –

+0

我在這裏包含'ConvertFromChildToForm'代碼! – Writwick

0

利用

ControlMoverOrResizer

this article你可以做移動和調整大小控制在運行時只用一行代碼! :) 例如:

ControlMoverOrResizer.Init(button1); 

現在Button1的是可移動和可調整大小的控制!

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。它不會讓標籤移動。不知道爲什麼。

相關問題