質問

環境:.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_NCHITTESTHTTRANSPARENTからメッセージを変更する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;
  }
}

さらに読むには:

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top