2016-11-30 6 views
1

私のWinFormは、ユーザーがクリックしてヘルプを呼び出すことができる単なる40x40ボタンです。ボタンをクリックしてドラッグして別の部分に移動させる場合を除いて、すべては機能します。マウスの左ボタンを離した後にボタンがアクティブになります(「クリック」を完了します)。その場合、mousedownイベントが発生している間にウィンドウが移動したかどうかを確認して、mouseclickイベントを停止する方法はありますか?あなたがサブクラス化ボタンを使用できる場合私はWinFormsの「ボタン」を持っていますが、ボタンをアクティブにしないでクリックしてドラッグするにはどうすればいいですか?

private bool ignoreClick = false; 

private void btn_MouseMove(object sender, MouseEventArgs e) { 
    if (e.Button == MouseButtons.Left) { 
    ignoreClick = true; 
    btn.Left = e.X + btn.Left - mouseDownLocation.X; 
    btn.Top = e.Y + btn.Top - mouseDownLocation.Y; 
    } 
} 

private void btn_MouseUp(object sender, MouseEventArgs e) { 
    ignoreClick = false; 
} 

private void btn_Click(object sender, EventArgs e) { 
    if (!ignoreClick) { 
    // do your click code... 
    } 
} 
+0

がどのようにこの動きを実行していますか?標準フォーム内の標準ボタンをドラッグしてもフォーム(またはボタン)は移動しません。私はここに何かを逃していますか –

+0

申し訳ありませんが、あなたは何も欠けていません。私は質問を更新します。 – MrDysprosium

+0

今、あなたのコードはボタンではなく、フォームを動かしています。 – LarsTech

答えて

1

:私は現在、「クリック&ドラッグ」やっている方法

カーソルがあまりにも遠くに移動した場合(実際にはデフォルトの動作でなければならない)、発砲からクリックイベントが発生します。
このようにして、実際のイベントハンドラは少しきれいに保つことができ、これに対処する必要はありません。

class SpecialButton: Button 
{ 
    private Point ClickOrigin; 
    private const int ClickMaxDistance = 5; 

    protected override void OnMouseDown(MouseEventArgs e) 
    { 
     ClickOrigin = System.Windows.Forms.Cursor.Position; 
     base.OnMouseDown(e); 
    } 

    protected override void OnClick(EventArgs e) 
    { 
     Point p = System.Windows.Forms.Cursor.Position; 
     if(Math.Abs(p.X - ClickOrigin.X) < ClickMaxDistance && 
      Math.Abs(p.Y - ClickOrigin.Y) < ClickMaxDistance) 
     base.OnClick(e); 
    } 
} 
0

、あなたが防ぐことができます:あなたはちょうどそれを処理するためにフラグを使用することができます

private void btn_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (e.Button == System.Windows.Forms.MouseButtons.Left) 
     { 
      MouseDownLocation = e.Location; 
     } 
    } 

    private void btn_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.Button == System.Windows.Forms.MouseButtons.Left) 
     { 
      this.Left = e.X + this.Left - MouseDownLocation.X; 
      this.Top = e.Y + this.Top - MouseDownLocation.Y; 
     } 
    } 
1

また、代わりに、このようなボタンを経由して、フォームを移動することができ:

public const int HT_CAPTION = 0x2; 
    public const int WM_NCLBUTTONDOWN = 0xA1; 

    [System.Runtime.InteropServices.DllImport("user32.dll")] 
    public static extern bool ReleaseCapture(); 
    [System.Runtime.InteropServices.DllImport("user32.dll")] 
    public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); 

    private void button1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Left) 
     { 
      ReleaseCapture(); 
      SendMessage(this.Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0); 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show("Hello!"); 
    } 
関連する問題