1

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

我设置了以下 ControlStyles:

SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer |
ControlStyles.AllPaintingInWmPaint, true);

(我也尝试过设置ControlStyles.Selectableand ControlStyles.UserMouse,但没有区别)

我已经将代码放入GotFocusLostFocus事件中,并且我可以看到在某些情况下控件确实获得了焦点,只是立即再次失去它。

这是一个 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
    }
}
4

0 回答 0