2

私はこの質問を見ましたが、それは役に立ちますが、WndProcは起動しません

親コントロールへのパススルー マウス イベント

これは、ピクチャ ボックスを備えたユーザー コントロールです。mouseClick イベント中にヒット テストを実行して、ボードのどの部分がクリックされたかを判断し、ピースを相対的な領域に置きます。次に、ゲーム ピースの 1 つを作成し、ホスト フォームの端からボード上の適切な場所までアニメーション化します。ゲームピースはゲームボードの子ではない

それはすべてうまくいっています。ただし、ユーザーがゲーム ピースをクリックしても、その下のボードの mouseClick はイベントを発生させません。ボタンの下のボタンのように、私はそれを理解しています。

私の質問は、ボードだけが「クリック可能」になるように、ゲームピースのクリックイベントを「通過」できるかということです

public enum PieceColor
{
    Blue=0,
    Yellow,
    Red,
    Green
}

public class GamePiece : PictureBox
{
    PieceColor _color;
    public PieceColor Color {
        get {

            return _color;
        }
        set
        {
            _color = value;

            if (_color == PieceColor.Blue)
                this.Image = global::GameEntities.Properties.Resources.pieceBlue;
        }
    }


    protected override void WndProc(ref Message m)
    {
        const int WM_NCHITTEST = 0x0084;
        const int HTTRANSPARENT = (-1);

        if (m.Msg == WM_NCHITTEST) //<-- this never fires
        {
            m.Result = (IntPtr)HTTRANSPARENT;
        }
        else
        {
            base.WndProc(ref m);
        }
    }
}
4

1 に答える 1

1

コントロールをマウス クリック イベントに対して透明にするために、すべてのクリック イベントを親コントロールの適切なメソッドに渡すことができます。そのため、まずメソッドを宣言するインターフェイスを作成しますHandleMouseClick

interface IMouseClickable
{
   void HandleMouseClick(object sender, MouseEventArgs e);
}

このインターフェイスを親に適用して、これを にControl渡すことができるようにします。コンストラクターを介して行うことができ、親をすぐに登録できます。ControlGamePieceHandleMouseClickGamePiece

...
public GamePiece(IMouseClickable parent)
{
   MouseClick += parent.HandleMouseClick;
}
...
于 2013-03-01T01:09:48.540 に答える