通过点击事件来控制下面

时间:2013-02-28 23:39:36

标签: c#

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

Pass-through mouse events to parent control

所以我有一个游戏板,它是一个带有图片框的用户控件。在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);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

为了使您的控件对鼠标单击事件透明,您可以将所有单击事件传递给父控件适当的方法。因此,首先创建一个将声明HandleMouseClick方法的接口。

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

将此界面应用于父Control,以便您可以将此Control传递给GamePiece。它可以通过构造函数完成,您可以立即将父HandleMouseClick注册到GamePiece

...
public GamePiece(IMouseClickable parent)
{
   MouseClick += parent.HandleMouseClick;
}
...