2012-03-22 10 views
1

移動できる場所でユーザーコントロールを作成する必要がありますが、スクラッチから外す必要があります(つまり、コントロールの位置を取得してマウスを移動するとそれに応じてコントロールを動かす) これは私が今持っているものです。スクラッチから移動可能なコントロールを作成する

パブリック部分クラスMainMenu:UserControl { public Point OldMouseLoc; public Point OldWindowLoc; public MainMenu() { InitializeComponent();私のコントロールの場所がその親ウィンドウの左上に相対的である一方でMousePositionは、画面の上部に相対的であるため、Imはトラブルを抱えて今 }

private void customButton1_MouseDown(object sender, MouseEventArgs e) 
{ 
    OldMouseLoc = MousePosition; 
    OldWindowLoc = new Point(this.Location.X + this.Parent.Location.X,this.Location.Y + this.Parent.Location.Y); 
    Mover.Start(); 
} 

private void Mover_Tick(object sender, EventArgs e) 
{ 
    Point NewMouseLoc = MousePosition; 
    if (NewMouseLoc.X > OldMouseLoc.X || true) { // (|| true is for debugging) 
     this.Location = new Point(NewMouseLoc.X - OldWindowLoc.X, this.Location.Y); 
     MessageBox.Show(NewMouseLoc.X.ToString() + " " + OldWindowLoc.X.ToString()); // for debugging 
    } 
} 

}

理由があります。すべての座標を把握する数学は私に大きな頭痛を与えています。これらのX位置を固定してYを理解するために使用することができますので、私は自分のやり方を学ぶことができます。

答えて

2

PointToClientあなたのために数学を行う必要があります。コントロールの親でこのメソッドを呼び出す必要があります。

更新:

はまた少し違ったアプローチを検討してください。あなたは本当に任意のタイマーやスクリーン座標を必要としません:

private Point _mdLocation; 

    private void customButton1_MouseDown(object sender, MouseEventArgs e) 
    { 
     _mdLocation = e.Location; 
    } 

    private void customButton1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if(e.Button == MouseButtons.Left) 
     { 
      var x = this.Left + e.X - _mdLocation.X; 
      var y = this.Top + e.Y - _mdLocation.Y; 
      this.Location = new Point(x, y); 
     } 
    } 
+0

ああおかげで、これは方法ではなく、財産XD – Oztaco

+0

だった実現するために私にしばらく時間がかかった私はまた、私は通常私の可動のために使用したコードを追加しましたコントロール。 – max

+0

ああありがとう、私はタイマーの代わりにmousemoveを使用すると思っていません – Oztaco

関連する問題