Vb.net 更改文本框中的插入符号颜色

Vb.net 更改文本框中的插入符号颜色,vb.net,colors,caret,Vb.net,Colors,Caret,我使用此代码在文本框(vb.net)中创建插入符号: 是否可以更改插入符号的颜色?问题是您的PInvoke函数没有正确声明。查找它们并与它们匹配 创建插入符号的调用将采用位图句柄。因此,根据插入符号的外观,只需创建位图并将其传递给CreateCaret函数即可更改其颜色。下面是我用来更改常规文本框插入符号颜色的一些(非常)粗略的代码。请注意,我只将CreateCaret和ShowCaret更改为来自的正确签名。剩下的你得换了 Public Class Form1 Private Decl

我使用此代码在文本框(vb.net)中创建插入符号:


是否可以更改插入符号的颜色?

问题是您的PInvoke函数没有正确声明。查找它们并与它们匹配

创建插入符号的调用将采用位图句柄。因此,根据插入符号的外观,只需创建位图并将其传递给
CreateCaret
函数即可更改其颜色。下面是我用来更改常规文本框插入符号颜色的一些(非常)粗略的代码。请注意,我只将
CreateCaret
ShowCaret
更改为来自的正确签名。剩下的你得换了

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
你可以创建你想要的位图


希望能有所帮助。

如果
RichTextbox
不起作用,我想你可以这样做。现在我有一个更大的问题,它向我显示了一个错误:PinVokesTackDistancer检测到一个问题。你能提供完整的代码来显示插入符号吗?我无法运行上面的示例。别担心。。。你不需要RichTextbox。在这里,我将发布一个答案。我在看到这个之前解决了这个问题。nvm。无论如何,谢谢你的帮助。我将标记你的答案:D
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