2017-04-09 8 views
-1

基本的には、私はマウスクリックMouse_Downで移動できるフォームを持っていて、このフォームにはテキストが表示されている中央のラベルがあります。問題は、ラベル枠内でクリックが発生したときにフォームが動かず、ラベルを無効にするとフォームが動きますが、テキストの色が白になると黒に変わるということです。ラベル内でマウスをクリックしたときにフォーム移動を行う方法は? C#

1.

は、フォームのControl.PreProcessMessageをオーバーライドすることにより、メッセージの前処理方法を書く:

答えて

2

これは(私はボーダレスなフォームを持っているとき)私が使用する標準コードです:

using System.Runtime.InteropServices; 
.. 
public const int WM_NCLBUTTONDOWN = 0xA1; 
public const int HT_CAPTION = 0x2; 

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

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

私はそれがフォームのキャプションバーをヒットした偽物だと思います。

もちろん、同じコードにフォームを含め、任意の数の他のコントロールのMouseDownイベントをフックできます。

3

は、二つの解決策があります。この方法では、Windowsのメッセージに対処する必要があります。これは難しいことではありませんが、慣れていなければなりません。 pinvoke.netここで多くを助けることができます。

2.

ので、同じように、フォームのコントロールのすべてにMouseDownイベントハンドラを追加します。

foreach(Control control in this.Controls) 
{ 
    control.MouseDown += myMouseDownHandler; 
} 

myMouseDownHandlerは、基本的には、フォーム自体に使用するのと同じ方法になります。 フォームにネストされたコントロール(パネルやユーザーフォームなど)が含まれている場合は、フォームのコントロールの子コントロールも処理できるように、ループを拡張する必要があります。

フォーム内の唯一のコントロールがこのlabenの場合、もちろんループは必要ありません。

+0

[This(http://stackoverflow.com/a/11043661/815938)は、最初のアプローチの例です。 – kennyzx

関連する問題