2

我看了这个问题,虽然它会有所帮助,但 WndProc 不会触发

将鼠标事件传递给父控件

所以我有一个游戏板,它是一个带有图片框的用户控件。在 mouseClick 事件期间,我进行了一次点击测试以确定板的哪个部分被点击并将一块放在相关区域中。然后,我创建了一个游戏片段,并将其从宿主窗体边缘动画到棋盘上的适当位置。所以游戏块不是游戏板的孩子

这一切都很好。但是,如果用户单击游戏块,则下方棋盘的 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,以便您可以将其传递ControlGamePiece. 它可以通过构造函数完成,您可以立即将父级注册HandleMouseClickGamePiece.

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