2016-07-05 177 views
1

我用這個代碼在一個文本框(vb.net)來創建一個插入符號:更改插入顏色的文本框

Private Declare Function CreateCaret Lib "user32" (ByVal hwnd As Long, ByVal hBitmap As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long 
Private Declare Function DestroyCaret Lib "user32"() As Long 
Private Declare Function SetCaretBlinkTime Lib "user32" (ByVal wMSeconds As Long) As Long 
Private Declare Function SetCaretPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long 
Private Declare Function ShowCaret Lib "user32" (ByVal hwnd As Long) As Long 
Private Declare Function HideCaret Lib "user32" (ByVal hwnd As Long) As Long 
Private Sub txtOutput_GotFocus(sender As Object, e As EventArgs) Handles txtOutput.GotFocus 
    CreateCaret(txtOutput.Handle, IntPtr.Zero, 9, 12) 
    ShowCaret(txtOutput.Handle) 
End Sub 

是否有可能改變插入符號的顏色?

+0

我認爲你可以做到這一點,如果它是一個'RichTextbox' – Brandon

+0

沒有工作。現在我有一個更大的問題,它顯示我一個錯誤:PInvokestackImpalance檢測到一個問題 –

+0

你能提供完整的代碼來顯示插入符號?我無法運行上面的示例。 – Brandon

回答

2

您遇到的問題是您的PInvoke功能未正確聲明。看看它們並與http://pinvoke.net/匹配。

創建插入符號的調用需要一個位圖句柄。因此,根據您的脫字符的樣式,您只需創建一個位圖並將其傳遞給CreateCaret函數以更改其顏色。以下是我用來更改常規文本框的插入符號的一些(非常)粗糙的代碼。請注意,我僅將CreateCaretShowCaret更改爲http://www.pinvoke.net的正確簽名。你將不得不改變其餘的。

Public Class Form1 
    Private Declare Function CreateCaret Lib "user32" (ByVal hWnd As IntPtr, ByVal hBitmap As IntPtr, ByVal nWidth As Integer, ByVal nHeight As Integer) As Boolean 
    Private Declare Function DestroyCaret Lib "user32"() As Long 
    Private Declare Function SetCaretBlinkTime Lib "user32" (ByVal wMSeconds As Long) As Long 
    Private Declare Function SetCaretPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long 
    Private Declare Function ShowCaret Lib "user32" (ByVal hwnd As IntPtr) As Boolean 
    Private Declare Function HideCaret Lib "user32" (ByVal hwnd As Long) As Long 

    Private caretBitmap as Bitmap 
    Private Sub txtOutput_GotFocus(sender As Object, e As EventArgs) Handles txtOutput.GotFocus 
     If caretBitmap Is Nothing Then 
      caretBitmap = CreateCaretBitmap() 
     End If 
     CreateCaret(txtOutput.Handle, caretBitmap.GetHbitmap(), 5, 10) 
     ShowCaret(txtOutput.Handle) 
    End Sub 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

    End Sub 

    Private Function CreateCaretBitmap() As Bitmap 
     Dim flag As New Bitmap(5, 5) 
     Dim flagGraphics As Graphics = Graphics.FromImage(flag) 

     flagGraphics.FillRectangle(Brushes.Chartreuse, 0, 0, 5, 10) 
     Return flag 

    End Function 
End Class 

但是,您可以創建位圖,但您明顯需要。

希望有所幫助。

+0

我在看到this.nvm之前解決了這個問題。感謝您的幫助。我會標記您的答案:D –