【问题标题】:How to prevent blinking cursor for TextBox in C# (little bit more complicated)如何防止 C# 中 TextBox 的光标闪烁(稍微复杂一点)
【发布时间】:2014-02-07 09:17:36
【问题描述】:

我在 GUI 中编辑标签时遇到问题,因此我决定将该标签转换为带有 BackColor 的文本框,因为背景必须使其看起来与标签完全相同,但在关注该文本框后会出现闪烁的光标。这非常难看,我发现的唯一方法是将属性 Enabled 设置为 false,但我还要求在双击后从该文本框中执行某些操作并且只需单击一次。所以如果没有启用控制,它不会对双击做出反应。

基本上我想默认将该文本框作为标签,直到它被单击一次,如果它被双击,那么将执行一些仅重写其他文本框的文本属性的功能。因此,如果单击一次,我想让文本框看起来像真正的文本框,以便在光标闪烁的情况下插入文本。按下 Enter 后,它会再次转换为“假”标签,焦点后光标不会闪烁。

这可能吗?

附:我很抱歉重复,但我不明白如何实施 f.e. [DllImport("user32")] 它用红线在 'DllImport' 下划线,注释是:

The type or namespace 'DllImport' could not be found.

详细:

Error   1   The type or namespace name 'DllImport' could not be found (are you missing a using directive or an assembly reference?) C:\Users\**\Visual Studio 2013\Projects\Práce\Rozvržení práce\Rozvržení práce\Form1.cs  17  10  Rozvržení práce

Error   2   The type or namespace name 'DllImportAttribute' could not be found (are you missing a using directive or an assembly reference?)    C:\Users\**\Visual Studio 2013\Projects\Práce\Rozvržení práce\Rozvržení práce\Form1.cs  17  10  Rozvržení práce

评论解决了

(实施 [System.Runtime.InteropServices.DllImport("user32")] 代替 =D – Sinatr )

让我问一下:

如何重新设置闪烁的光标?我想通过编辑static extern bool HideCaret(IntPtr hWnd);,但是如何?

【问题讨论】:

  • 你已经得到了一个代码示例的答案,所以它是重复的。如果您无法复制和粘贴介绍的代码解决方案,请告诉我们您到底有什么不明白的地方。 stackoverflow.com/q/601255/1284902
  • 实施 [System.Runtime.InteropServices.DllImport("user32")] 而不是=D
  • 只需将TabStop 设置为false

标签: c# textbox cursor label


【解决方案1】:

它被称为“插入符号”。它仅在 TextBox 获得焦点时显示。但是由于您不希望用户更改任何内容,因此让它获得焦点也没有任何意义。因此,简单的解决方法是挫败聚焦尝试。向您的项目添加一个类并粘贴如下所示的代码。编译并将其从工具箱顶部拖放到您的表单中。

using System;
using System.Windows.Forms;

class TextBoxLabel : TextBox {
    public TextBoxLabel() {
        this.SetStyle(ControlStyles.Selectable, false);
        this.TabStop = false;
    }
    protected override void WndProc(ref Message m) {
        // Workaround required since TextBox calls Focus() on a mouse click
        // Intercept WM_NCHITTEST to make it transparent to mouse clicks
        if (m.Msg == 0x84) m.Result = IntPtr.Zero;
        else base.WndProc(ref m);
    }
}

【讨论】:

    猜你喜欢
    • 2010-10-10
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多