如何防止C#中的TextBox闪烁光标(稍微复杂一些)

时间:2014-02-07 09:17:36

标签: c# textbox cursor label

我在GUI中编辑Label时遇到了问题所以我决定使用BackColor将该标签转换为文本框,因为背景必须使其看起来与标签完全一样,但是在关注该文本框后会出现闪烁的光标。这是非常难看的&我发现的唯一方法是将属性Enabled设置为false,但是我还需要从该文本框中执行doubleclick&只需点击一下。因此,如果未启用控件,则不会对双击做出反应。

基本上我希望默认情况下将该文本框表示为标签,直到它被点击一次,如果双击,则执行某些功能只会重写其他文本框的文本属性。因此,如果单击一次,我想使文本框看起来像文本插入的文本框,光标闪烁。按Enter后,它将再次变换为'假'标签,焦点后光标不会闪烁。

这可能吗?

P.S。我很抱歉这个副本,但我无法理解如何实现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);,但是怎么做?

1 个答案:

答案 0 :(得分: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);
    }
}