2015-09-22 77 views
2

我想更改C#中的文本框中的插入符号,使其看起来更像在旧的DOS应用程序中那样。在C#中的文本框中更改插入符(光标)

我有:enter image description here

实例我想要什么: enter image description here

我想:

using System.Runtime.InteropServices; 

...

[DllImport("user32.dll")] 
    static extern bool CreateCaret(IntPtr hWnd, IntPtr hBitmap, int nWidth, int nHeight); 
    [DllImport("user32.dll")] 
    static extern bool ShowCaret(IntPtr hWnd); 

...

public partial class Form1 : Form 
{ 
    [DllImport("user32.dll")] 
    static extern bool CreateCaret(IntPtr hWnd, IntPtr hBitmap, int nWidth, int nHeight); 
    [DllImport("user32.dll")] 
    static extern bool ShowCaret(IntPtr hWnd); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Shown(object sender, EventArgs e) 
    { 
     CreateCaret(textBox1.Handle, IntPtr.Zero, 20, textBox1.Height); 
     ShowCaret(textBox1.Handle); 
    } 
} 

但它看起来一样。你能帮忙的话,我会很高兴。提前致谢!

编辑:

这只是一个例子。我的真实代码如下所示:

TextBox textbox = new TextBox(); 
textbox.MaxLength = fieldLength; 
textbox.Width = fieldLength*24; 
textbox.MaxLength = maxChars; 
this.Controls.Add(textbox); 

CreateCaret(textbox.Handle, IntPtr.Zero, 20, textbox.Height); 
ShowCaret(textbox.Handle); 

该代码被调用但不会更改任何内容。

EDIT2:

我试过的例子,它工作正常,但我的问题仍然exisits: 创建文本框时,我不能改变插入符。它只能用于使用表单创建的文本框。

+1

如果有人正在阅读:我的问题的答案是,我在表单完全加载之前调用方法。 –

回答

2

你没有的情况下正确链接,您应该更改为:

public partial class Form1 : Form 
{ 
    [DllImport("user32.dll")] 
    static extern bool CreateCaret(IntPtr hWnd, IntPtr hBitmap, int nWidth, int nHeight); 
    [DllImport("user32.dll")] 
    static extern bool ShowCaret(IntPtr hWnd); 

    public Form1() 
    { 
     InitializeComponent(); 
     this.Shown += Form1_Shown; 
    } 

    private void Form1_Shown(object sender, EventArgs e) 
    { 
     CreateCaret(textBox1.Handle, IntPtr.Zero, 20, textBox1.Height); 
     ShowCaret(textBox1.Handle); 
    } 
} 
+0

当在设计器的属性网格中双击“显示”事件时,事件处理程序将附加在“.designer.cs”中,因此不会显示。但是,在这种情况下,您可能是正确的,因为原始代码似乎可以正确连接处理程序正常工作。我只是添加它,因为它不必那么明显。 – Jens

+0

事件处理程序通常附加在InitializeComponent方法内的窗体designer.cs文件内。 **编辑**就像Jens先前提到的那样:) – Dbuggy

+0

我的代码上面只是一个例子。我以编程方式创建文本框时调用这两种方法。我只想展示我用过的东西。该方法得到执行,但不影响出现 –

0

这是怎么回事,似乎是在显示事件只开始工作。当通过标签离开文本框并返回到控件时,插入符号将被底层代码重置。

看看this线程的答案。

我拿了他们的DrawDaret方法并改变了一下。在textbox1.Enter事件中调用DrawCaret不起作用。文本框实现可能会通知Enter事件,然后更改插入符号。这将撤销Enter事件处理程序中有关脱字符的更改。

编辑

但控制也有,你可以用一个GotFocus事件。

public partial class Form1 : Form 
{ 
    [DllImport("user32.dll")] 
    static extern bool CreateCaret(IntPtr hWnd, IntPtr hBitmap, int nWidth, int nHeight); 
    [DllImport("user32.dll")] 
    static extern bool ShowCaret(IntPtr hWnd); 

    public Form1() 
    { 
     InitializeComponent(); 

     textBox1.GotFocus += new EventHandler(textBox1_GotFocus); 
    } 

    void textBox1_GotFocus(object sender, EventArgs e) 
    { 
     DrawCaret(textBox1); 
    } 

    public void DrawCaret(Control ctrl) 
    { 
     var nHeight = 0; 
     var nWidth = 10; 

     nHeight = Font.Height; 

     CreateCaret(ctrl.Handle, IntPtr.Zero, nWidth, nHeight); 
     ShowCaret(ctrl.Handle); 
    } 
} 
相关问题