更改插入颜色的文本框

问题描述:

我用这个代码在一个文本框(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

您遇到的问题是您的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 –