MFC.在RichEditCtrl中快速突出显示所有匹配项

MFC. Quickly highlight all matches in RichEditCtrl

本文关键字:显示 RichEditCtrl MFC      更新时间:2023-10-16

我有一个非常大的文本(>50mb)。

FindTextSetSelSetSelectionCharFormat对我来说太慢了。我试着制定文本,然后显示,但速度更慢。

我可以在内存中使用RichEditCtrl,然后只显示吗?或者我可以加快第一个选项的速度,或者你可以用另一种方式解决我的问题?

我的改进度量与您的不同。

这是我的代码:

void CRichEditAppView::OnEditHighlight()
{
    FINDTEXTEX ft = {};
    ft.chrg = { 0, -1 };
    ft.lpstrText = L"Lorem ipsum";
    DWORD dwFlags(FR_DOWN);
    CHARFORMAT2 cf = {};
    cf.cbSize = sizeof cf;
    cf.dwMask = CFM_BACKCOLOR;
    cf.crBackColor = RGB(255, 255, 0);
    CRichEditCtrl& ctrl = GetRichEditCtrl();
    ctrl.HideSelection(TRUE, FALSE);
    ctrl.SetRedraw(FALSE);
    int count(0);
    while (ctrl.FindTextW(dwFlags, &ft) >= 0)
    {
        ctrl.SetSel(ft.chrgText);
        ctrl.SetSelectionCharFormat(cf);
        ft.chrg.cpMin = ft.chrgText.cpMax + 1;
        count++;
    }
    ctrl.HideSelection(FALSE, FALSE);
    ctrl.SetRedraw(TRUE);
    ctrl.Invalidate();
}

我在一个有3000份"Lorem ipsum"文本的文件上测试了它(文件大小1379 KB)。

"幼稚"的实现(没有调用HideSelection()SetRedraw())耗时11秒。

调用HideSelection()将时间减少到9秒,将SetRedraw()-增加到1.2秒。所以我希望看到10倍的进步。

相比之下,如果我删除对SetSelectionCharFormat()的调用,我只节省了0.4秒。