Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自定义控件-can';无法接收焦点或鼠标事件_C#_Winforms_Events_Focus - Fatal编程技术网

C# 自定义控件-can';无法接收焦点或鼠标事件

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

我创建了一个Winforms自定义控件,虽然它可以很好地接收MouseWheel消息,但不会接收MouseDown、MouseMove或MouseUp消息

我已设置以下控件样式:

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
    }
}