34

環境: .NET Framework 2.0、VS 2008。

MouseDown特定のマウス イベント ( 、MouseMoveMouseUp) を親コントロール (または最上位フォーム)に渡す特定の .NET コントロール (ラベル、パネル) のサブクラスを作成しようとしています。これを行うには、標準コントロールのインスタンスでこれらのイベントのハンドラーを作成します。たとえば、次のようになります。

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)タイプ の修飾子を介して保護されたメンバーにアクセスできませんSystem.Windows.Forms.Control。修飾子は型TheProject.NoCaptureLabel(または派生型) でなければなりません。

サブクラスでコントロールのメソッドをオーバーライドすることを検討していますが、WndProc誰かがよりクリーンなソリューションを提供してくれることを願っています。

4

3 に答える 3

69

はい。何度も検索した結果、「フローティング コントロール、ツールチップ スタイル」という記事を見つけました。これは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);
    }
}

これは、Visual Studio 2010 で .NET Framework 4 Client Profile を使用してテストしました。

于 2011-12-26T12:11:38.340 に答える
3

WS_EX_TRANSPARENT拡張ウィンドウ スタイルは実際にこれを行います (これは、インプレース ツールチップが使用するものです) 。多くのハンドラーをコーディングしてそれを行うのではなく、このスタイルを適用することを検討することをお勧めします。

これを行うには、CreateParamsメソッドをオーバーライドします。

protected override CreateParams CreateParams
{
  get
  {
    CreateParams cp=base.CreateParams;
    cp.ExStyle|=0x00000020; //WS_EX_TRANSPARENT
    return cp;
  }
}

さらに読むには:

于 2009-02-13T18:54:43.470 に答える
3

イベントを発生させる基本クラスに public/protected メソッドを記述する必要があります。次に、派生クラスからこのメソッドを呼び出します。

また

これは、あなたの望むことですか?

public class MyLabel : Label
{
    protected override void OnMouseDown(MouseEventArgs e)
    {
        base.OnMouseDown(e);
        //Do derived class stuff here
    }
}
于 2009-02-13T18:47:26.967 に答える