2012-03-30 2 views
4

私はmenustripを使用してフォームを移動する方法を探しています。menustripを使用してボーダレスフォームを移動する

いくつかの解決策がありますが、私が好きではない特定の問題があります。これらのメソッドを機能させるには、フォームはすでにmenustripをドラッグする前にフォーカスを合わせる必要があります。

menustripが実際に適切なウィンドウのタイトルバーのように動作するように、特定の問題を修正する方法はありますか?

+0

このWinformsのでしょうか?あなたは他の解決策を挙げることができますので、私たちは一見を持つことができます。 –

+0

タイトルが言うように、それはwinformsです:)私が現時点で使用している方法は、http://stackoverflow.com/questions/1592876/c-sharp-make-a-borderless-form-movable – denied66

+1

タイトルに「Winforms:」などのプレフィックスを付けないでください。それがタグのためのものです。 –

答えて

4

最高の賭けはpinvokeを使うことです。今までコントロールできないようにするための「mousedown」イベントを結びつけましょう。

using System.Runtime.InteropServices; 

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

[DllImportAttribute("user32.dll")] 
private static extern int SendMessage(IntPtr hWnd, 
       int Msg, int wParam, int lParam); 
[DllImportAttribute("user32.dll")] 
private static extern bool ReleaseCapture(); 

public Form1() 
{ 
    InitializeComponent(); 
} 

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

これにはフォームのフォーカスが必要ですが、マウスのホバーを使用して回避できます。それは優雅ではありませんが、それは動作します。

private void menuStrip1_MouseHover(object sender, EventArgs e) 
{ 
    Focus(); 
} 

更新は:ホバー若干の遅れを持っている、のMouseMoveがはるかに応答性である

private void menuStrip1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (!Focused) 
    { 
     Focus(); 
    } 
} 
+0

MouseHoverイベントを追加すると、その仕事はありがたいです。あなたがすぐにウィンドウをドラッグしようとすると、動作しないかもしれないので、少し遅く発射されるようです。 MouseEnterイベントは、この問題を抱えていないようです。 – denied66

+0

MouseMoveはマウスオーバーよりもはるかに高速です。試してみてください。 –

+0

MouseMoveは多くの時間を吹いていますが、ユーザーのマウスが問題になるメナトシプルを過ぎてしまったようなことを考えると、 MouseEnterは十分速くトリガーしているようです(私はそれまで何の問題もないようです)、一度だけトリガーされます。また、オーバーヘッドが最小であるため、ifステートメントの必要性を否定します。 – denied66

関連する問題