You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不改变光标位置的情况下设置RichTextBox文本背景色?

不移动光标为RichTextBox指定文本设置背景色

不需要使用Select方法,直接通过Windows API发送EM_SETCHARFORMAT消息即可在不改变光标位置的前提下,为指定范围文本设置背景色。

实现步骤(VB.NET)

  1. 导入必要的API和结构声明:
Imports System.Runtime.InteropServices

Public Class YourForm
    <DllImport("user32.dll", CharSet:=CharSet.Auto)>
    Private Shared Function SendMessage(hWnd As IntPtr, msg As Integer, wParam As Integer, lParam As IntPtr) As IntPtr
    End Function

    Private Const EM_SETCHARFORMAT As Integer = &H442
    Private Const SCF_SELECTION As Integer = &H1

    <StructLayout(LayoutKind.Sequential)>
    Private Structure CHARFORMAT2
        Public cbSize As Integer
        Public dwMask As Integer
        Public dwEffects As Integer
        Public yHeight As Integer
        Public yOffset As Integer
        Public crTextColor As Integer
        Public bCharSet As Byte
        Public bPitchAndFamily As Byte
        <MarshalAs(UnmanagedType.ByValArray, SizeConst:=32)>
        Public szFaceName As Char()
        Public wWeight As Integer
        Public sSpacing As Integer
        Public crBackColor As Integer
        Public lcid As Integer
        Public dwReserved As Integer
        Public sStyle As Integer
        Public wKerning As Integer
        Public bUnderlineType As Byte
        Public bAnimation As Byte
        Public bRevAuthor As Byte
        Public bReserved1 As Byte
    End Structure

    <StructLayout(LayoutKind.Sequential)>
    Private Structure CHARRANGE
        Public cpMin As Integer
        Public cpMax As Integer
    End Structure
  1. 编写设置背景色的工具方法:
Public Sub SetTextBgColor(rtb As RichTextBox, startPos As Integer, length As Integer, bgColor As Color)
        ' 初始化格式结构,仅指定背景色
        Dim charFormat As New CHARFORMAT2()
        charFormat.cbSize = Marshal.SizeOf(charFormat)
        charFormat.dwMask = &H200 ' CFM_BACKCOLOR标记,仅修改背景色
        charFormat.crBackColor = bgColor.ToArgb()

        ' 指定要修改的文本范围
        Dim charRange As New CHARRANGE()
        charRange.cpMin = startPos
        charRange.cpMax = startPos + length

        ' 分配内存并转换结构为指针
        Dim cfPtr As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(charFormat))
        Marshal.StructureToPtr(charFormat, cfPtr, False)

        Dim crPtr As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(charRange))
        Marshal.StructureToPtr(charRange, crPtr, False)

        ' 发送消息,应用格式到指定范围
        SendMessage(rtb.Handle, EM_SETCHARFORMAT, SCF_SELECTION, cfPtr)

        ' 释放分配的内存
        Marshal.FreeHGlobal(cfPtr)
        Marshal.FreeHGlobal(crPtr)
    End Sub
  1. 调用方法使用:
' 示例:为位置10开始的3个字符设置白色背景
SetTextBgColor(RichTextBox1, 10, 3, Color.White)

说明

  • 该方法直接通过底层Windows消息修改文本格式,完全不会触动RichTextBox的选中状态和光标位置。
  • 仅适用于WinForms平台的RichTextBox控件。

内容的提问来源于stack exchange,提问作者tmighty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:01:06