MFC。快速突出显示RichEditCtrl中的所有匹配项

时间:2016-03-24 14:54:41

标签: c++ stl mfc

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

FindTextSetSelSetSelectionCharFormat对我来说太慢了。 我试图制定文本,然后显示,但它甚至更慢。

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

1 个答案:

答案 0 :(得分:1)

我对改进的衡量标准与你的不同。

这是我的代码:

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();
}

我在一个包含3,000份“Lorem ipsum”文本(文件大小为1,379 KB)的文件上进行了测试。

“天真”的实现(不调用HideSelection()SetRedraw())花了11秒。

调用HideSelection()将时间缩短为9秒,将SetRedraw()添加到1.2秒。所以我希望看到10倍的改进。

比较一下,如果我删除了对SetSelectionCharFormat()的电话,我只能节省0.4秒。