2

在 C# WinForms 中,我有一个自定义 RichTextBox,我可以在其中自己处理鼠标中键滚动。完成后,我想显示我自己的光标。当按下中间按钮时,我在 MouseDown 事件中切换到此光标。

    void richText_MouseDown(object sender, MouseEventArgs e) {
        if (e.Button == MouseButtons.Middle) {
            Cursor.Current = MainForm.cursors["hand_NS"];
        }
    }

但是,文本框随即切换到 Windows“箭头”光标。这似乎是 RichTextBox autom 的一部分。MouseDown 或 MouseMove 中的行为。我可以通过在 MouseMove 中不断显示我的光标来覆盖它,但它看起来闪烁,因为两个光标相互争斗。我可以以某种方式阻止此自动切换到“箭头”光标吗?

编辑:尝试设置光标属性:

 void richText_MouseDown(object sender, MouseEventArgs e) {
        if (e.Button == MouseButtons.Middle) {
            richText.Cursor = MainForm.cursors["hand_NS"];
            //Cursor.Current = MainForm.cursors["hand_NS"];
        }
    }

恢复 I 型光标:

void richText_MouseUp(object sender, MouseEventArgs e) {
    if (e.Button == MouseButtons.Middle) {
        richText.Cursor = Cursors.IBeam;
        //Cursor.Current = Cursors.IBeam;
    }

}

4

1 回答 1

0

最终通过向它投掷我能找到的所有火炮,让它正常工作(几乎没有闪烁)。在 MouseMove(下)中完成的操作也在 MouseDown 中完成。

    public const uint LVM_SETHOTCURSOR = 4158;
    [DllImport("user32.dll")]
    public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);


    void richText_MouseMove(object sender, MouseEventArgs e) {
        if (e.Button == MouseButtons.Middle) {
                this.TopLevelControl.Cursor = Cursors.PanNorth;
                richText.Cursor = Cursors.PanNorth;
                SendMessage(richText.Handle, LVM_SETHOTCURSOR, IntPtr.Zero, Cursors.PanNorth.Handle);
                Cursor.Current = Cursors.PanNorth;
         }
    }

覆盖 RTB 控件中的 SETCURSOR 消息:

    [DllImport("user32.dll")]
    public static extern int SetCursor(IntPtr cursor);
    private const int WM_SETCURSOR = 0x20;

    protected override void WndProc(ref System.Windows.Forms.Message m) {
        if (m.Msg == WM_SETCURSOR) {
            SetCursor(Cursors.PanNorth.Handle);
            m.Result = new IntPtr(1);
            return;
        }
        base.WndProc(ref m);
    }

资料来源:

ListView 光标变化和闪烁

鼠标光标在所选文本上闪烁 - 如何防止这种情况?

于 2018-06-03T08:12:38.330 回答