2015-09-22 78 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); 
    } 
} 
相關問題