我看了这个问题虽然它会有所帮助,但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);
}
}
}
答案 0 :(得分:1)
为了使您的控件对鼠标单击事件透明,您可以将所有单击事件传递给父控件适当的方法。因此,首先创建一个将声明HandleMouseClick
方法的接口。
interface IMouseClickable
{
void HandleMouseClick(object sender, MouseEventArgs e);
}
将此界面应用于父Control
,以便您可以将此Control
传递给GamePiece
。它可以通过构造函数完成,您可以立即将父HandleMouseClick
注册到GamePiece
。
...
public GamePiece(IMouseClickable parent)
{
MouseClick += parent.HandleMouseClick;
}
...