C# 自定义控件-can';无法接收焦点或鼠标事件
我创建了一个Winforms自定义控件,虽然它可以很好地接收MouseWheel消息,但不会接收MouseDown、MouseMove或MouseUp消息 我已设置以下控件样式:C# 自定义控件-can';无法接收焦点或鼠标事件,c#,winforms,events,focus,C#,Winforms,Events,Focus,我创建了一个Winforms自定义控件,虽然它可以很好地接收MouseWheel消息,但不会接收MouseDown、MouseMove或MouseUp消息 我已设置以下控件样式: SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true); (我也尝试过设置ControlStyles.selective和ControlStyl
SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer |
ControlStyles.AllPaintingInWmPaint, true);
(我也尝试过设置ControlStyles.selective
和ControlStyles.UserMouse
,但没有什么区别)
我已经将代码放入GotFocus
和LostFocus
事件中,我可以看到在某些情况下控件确实获得了焦点,但又会立即失去它
这是一个GIS地图查看器/编辑器控件,它必须能够接收焦点,既可以接收鼠标事件,也可以使用热键执行各种操作
有什么想法吗
[编辑:
这里有一些代码演示了这一点。我想这个问题与相同,没有得到令人满意的回答。
]
控件确实获得了焦点,但又会立即失去焦点
。在什么地方用定时器?不要使用事件,而是覆盖方法,如OnMouseDown等。您的问题实际上不可回答,因为它需要查看代码。应用程序中的任何地方都没有使用计时器。我也尝试过覆盖OnMouseDown等,但他们没有被解雇。我想我要寻找的答案将涉及启用自定义控件以接收焦点。请尝试发布再现问题的代码。您是使用UserControl还是对现有控件(如Panel控件)进行子类化?在C#项目中,我使用了一个子类面板控件,它对于查看器/编辑器来说工作得很好。只需重写要处理的OnNNN事件。我已从控件派生。覆盖OnMouseMove等不起作用。
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
}
}