マウス イベントを親コントロールにパススルーする
-
23-08-2019 - |
質問
環境:.NET Framework 2.0、VS 2008。
特定のマウス イベントを通過する特定の .NET コントロール (ラベル、パネル) のサブクラスを作成しようとしています (MouseDown
, MouseMove
, MouseUp
) を親コントロール (または最上位のフォーム) に追加します。これを行うには、標準コントロールのインスタンスでこれらのイベントのハンドラーを作成します。例:
public class TheForm : Form
{
private Label theLabel;
private void InitializeComponent()
{
theLabel = new Label();
theLabel.MouseDown += new MouseEventHandler(theLabel_MouseDown);
}
private void theLabel_MouseDown(object sender, MouseEventArgs e)
{
int xTrans = e.X + this.Location.X;
int yTrans = e.Y + this.Location.Y;
MouseEventArgs eTrans = new MouseEventArgs(e.Button, e.Clicks, xTrans, yTrans, e.Delta);
this.OnMouseDown(eTrans);
}
}
親コントロールでイベントを発生させるメソッドが保護されており、親コントロールの修飾子がないため、イベント ハンドラーをコントロールのサブクラスに移動できません。
保護されたメンバーにアクセスできません
System.Windows.Forms.Control.OnMouseDown(System.Windows.Forms.MouseEventArgs)
type の修飾子を介してSystem.Windows.Forms.Control
;修飾子は次の型でなければなりませんTheProject.NoCaptureLabel
(またはそこから派生したもの)。
をオーバーライドすることを検討しています WndProc
私のサブクラスのコントロールのメソッドですが、誰かがもっときれいな解決策を提供してくれることを願っています。
解決
はい。検索の多くの後、私は記事の「フローティングコントロール、ツールチップスタイル」を発見しましたマウスイベントに対して透明WndProc
を行う、WM_NCHITTEST
にHTTRANSPARENT
からメッセージを変更するControl
を使用に、
それを達成するために、Label
から継承されたコントロールを作成し、単純に次のコードを追加します。
protected override void WndProc(ref Message m)
{
const int WM_NCHITTEST = 0x0084;
const int HTTRANSPARENT = (-1);
if (m.Msg == WM_NCHITTEST)
{
m.Result = (IntPtr)HTTRANSPARENT;
}
else
{
base.WndProc(ref m);
}
}
私は、.NET Framework 4クライアントプロファイルでのVisual Studio 2010でこれをテストしています。
他のヒント
あなたはあなたのためのイベントを発生させます、あなたのベースクラスで公開/保護されたメソッドを記述する必要があります。その後、派生クラスからこのメソッドを呼び出します。
または
これは何をしたいですか?
public class MyLabel : Label
{
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
//Do derived class stuff here
}
}
の WS_EX_TRANSPARENT
拡張ウィンドウ スタイルは実際にこれを行います (インプレース ツールチップが使用するものです)。これを行うために多数のハンドラーをコーディングするのではなく、このスタイルを適用することを検討することをお勧めします。
これを行うには、 CreateParams
方法:
protected override CreateParams CreateParams
{
get
{
CreateParams cp=base.CreateParams;
cp.ExStyle|=0x00000020; //WS_EX_TRANSPARENT
return cp;
}
}
さらに読むには: