>백엔드 개발 >C++ >실시간 구문 강조를 위해 RichTextBox 다시 그리기를 어떻게 최적화할 수 있습니까?

실시간 구문 강조를 위해 RichTextBox 다시 그리기를 어떻게 최적화할 수 있습니까?

DDD
DDD원래의
2025-01-06 03:01:401004검색

How Can I Optimize RichTextBox Repainting for Real-Time Syntax Highlighting?

실시간 RichTextBox 구문 강조를 위한 다시 그리기 비활성화

특정 프로그래밍 시나리오에서는 키워드나 특정 단어를 동적으로 강조 표시해야 할 수도 있습니다. 사용자가 입력하는 RichTextBox입니다. 그러나 계속해서 다시 칠하면 입력 시 깜박임과 불편함이 발생할 수 있습니다.

사용자 경험을 개선하려면 텍스트를 편집하는 동안 RichTextBox의 자동 다시 그리기를 비활성화할 수 있습니다. 불행하게도 표준 RichTextBox 클래스는 이에 대한 내장 메서드를 제공하지 않습니다.

외부 클래스로 RichTextBox 사용자 정의

한 가지 해결책은 사용자 정의 RichTextBox 클래스를 만드는 것입니다. 누락된 기능을 추가하는 것입니다. 예는 다음과 같습니다.

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

class MyRichTextBox : RichTextBox {
    public void BeginUpdate() {
        SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)0, IntPtr.Zero);
    }
    public void EndUpdate() {
        SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero); 
        this.Invalidate();
    }
    [DllImport("user32.dll")]
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
    private const int WM_SETREDRAW = 0x0b;
}

그런 다음 실시간으로 키워드를 강조 표시하는 사용자 정의 함수에서 BeginUpdate() 및 EndUpdate() 메서드를 사용할 수 있습니다.

void HighlightKeywords(MyRichTextBox richTextBox) {
    richTextBox.BeginUpdate();

    // Highlight keywords and bad words

    richTextBox.EndUpdate();
}

직접 P/Invoke를 사용하여 다시 그리기 제어

또는 사용자 정의를 사용하여 우회할 수 있습니다. 클래스를 생성하고 WM_SETREDRAW 메시지와 함께 SendMessage 메서드를 사용하여 다시 그리기를 직접 제어합니다.

RichTextBox의 텍스트를 업데이트하기 전:

[DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
const int WM_SETREDRAW = 0x0b;

// (Disable repainting)
SendMessage(richTextBox.Handle, WM_SETREDRAW, (IntPtr)0, IntPtr.Zero);

RichTextBox의 텍스트를 업데이트한 후:

// (Enable repainting)
SendMessage(richTextBox.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero);
richTextBox.Invalidate();

이 접근 방식을 사용하면 표준 RichTextBox 클래스를 수정하지 않고도 동일한 결과를 얻을 수 있습니다.

위 내용은 실시간 구문 강조를 위해 RichTextBox 다시 그리기를 어떻게 최적화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.