我创建了一个 Winforms 自定义控件,虽然它可以很好地接收 MouseWheel 消息,但没有接收到 MouseDown、MouseMove 或 MouseUp 消息。
我设置了以下 ControlStyles:
SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer |
ControlStyles.AllPaintingInWmPaint, true);
(我也尝试过设置ControlStyles.Selectable
and ControlStyles.UserMouse
,但没有区别)
我已经将代码放入GotFocus
和LostFocus
事件中,并且我可以看到在某些情况下控件确实获得了焦点,只是立即再次失去它。
这是一个 GIS 地图查看器/编辑器控件,它必须能够接收焦点,既可以接收鼠标事件,也可以使用热键执行各种操作。
有任何想法吗?
[编辑:这是一些演示这一点的代码。我猜这个问题与将焦点设置为 .NET UserControl 相同...?,没有得到满意的回答。]
public partial class CustomControl1 : Control
{
public CustomControl1()
{
SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.Selectable | ControlStyles.UserMouse, true);
MouseWheel += CustomControl1_MouseWheel;
MouseDown += CustomControl1_MouseDown;
MouseMove += CustomControl1_MouseMove;
MouseUp += CustomControl1_MouseUp;
}
void CustomControl1_MouseUp(object sender, MouseEventArgs e)
{
Debug.Write("MouseUp"); // never gets fired
}
void CustomControl1_MouseMove(object sender, MouseEventArgs e)
{
Debug.Write("MouseMove"); // never gets fired
}
void CustomControl1_MouseDown(object sender, MouseEventArgs e)
{
Debug.Write("MouseDown"); // never gets fired
}
void CustomControl1_MouseWheel(object sender, MouseEventArgs e)
{
Debug.Write("MouseWheel"); // works fine!
}
protected override void OnPaint(PaintEventArgs pe)
{
// do some drawing stuff here
}
}