【问题标题】:C# - Change Cursor in Window Caption While MovingC# - 移动时更改窗口标题中的光标
【发布时间】:2017-12-16 06:53:41
【问题描述】:

这是 StackOverFlow 中另一篇文章的代码,它将改变窗口标题中的光标:

 protected override void WndProc(ref Message m) {
        if (m.Msg == 0x20) {  // Trap WM_SETCUROR
            if ((m.LParam.ToInt32() & 0xffff) == 2) { // Trap HTCAPTION
                Cursor.Current = Cursors.Hand;
                m.Result = (IntPtr)1;  // Processed
                return;
            }
        }
        base.WndProc(ref m);
    }

来源:https://stackoverflow.com/a/6484627/4871566

但我还想解决三个额外的问题:

1- 移动窗口时(按住鼠标左键),光标将再次变为其窗口默认值。移动表单窗口时有什么方法可以将光标更改为我选择的光标?

2- 当我将子表单加载为ShowDialog() 时,主表单将被禁用,用户无法与之交互。我可以更改子表单区域中的光标,但是当光标在子表单区域之外时(窗口),它将是系统窗口的默认值。有什么办法可以在外面改变光标吗?

3- 有没有办法改变消息框标题栏的光标?

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    1) 我为您的问题制作了一个小示例应用程序,但我无法复制您的错误。在演示中,当我移动窗口时,它一直保持不变。当我离开字幕区域并返回时,它也会自行恢复。

    所以你可能想检查一下你自己没有在某处重置光标。

    我能想到的解决方法是拦截 Control.CursorChanged 事件并将光标设置在那里,有效地重置通过 Windows 基础所做的任何更改。

    2) 问题是使用ShowDialog方法时父窗口不再启用。我尝试改用Show,它完美无缺。

    现在这很棘手,因为您正在失去 ShowDialog 方法的模式属性。如果您仍然必须这样做,那么您可以自己重新实现一个 ShowDialog 逻辑来完成相同的事情,而无需将 Enabled 属性设置为 false

    【讨论】:

      【解决方案2】:

      3- 有没有办法改变消息框标题栏的光标?

      在 .NET Framework 中,MessageBox 使用 native methods,因此您无法覆盖 WndProc 方法。它甚至没有,因为没有Control 元素。另一方面,在 Mono 中,有一个 MessageBoxForm,您可以尝试这样做,但我不能保证它会起作用。无论哪种方式,如果您因为第二个问题而要编写自己的对话逻辑,那么您已经完成了编写自己的消息框表单的一半。

      【讨论】:

        猜你喜欢
        • 2011-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-11
        • 1970-01-01
        • 1970-01-01
        • 2021-05-05
        • 1970-01-01
        相关资源
        最近更新 更多