0

WINAPIでプログラムを書いています。シンタックス ハイライトを実装する必要があります。現時点では、次のアルゴリズムを使用しています。

void PaintWords(const char *SearchWord,COLORREF rgb)
{
    counter = TabCtrl_GetCurSel(TabControl_hWnd);
    ft.chrg.cpMin = 0;
    ft.chrg.cpMax = GetWindowTextLength(hWnd);
    ft.lpstrText = (LPCSTR)SearchWord; //keyword
    do
    {
        int poe_p = SendMessage(hWnd, EM_FINDTEXTEX, FR_DOWN | FR_WHOLEWORD | FR_MATCHCASE, (LPARAM)&ft);
        if(poe_p != -1)
        {
            int selword = SendMessage(hWnd, EM_EXSETSEL,0,(LPARAM)&ft.chrgText);
            ZeroMemory(&chd, sizeof(chd));
            chd.cbSize = sizeof(CHARFORMAT);
            chd.dwMask = CFM_SIZE | CFM_FACE | CFM_COLOR | CFM_CHARSET;
            chd.crTextColor = rgb;
            chd.bPitchAndFamily = FW_THIN;
            lstrcpy(chd.szFaceName , "Courier New");
            SendMessage(hWnd,EM_SETCHARFORMAT,SCF_WORD|SCF_SELECTION,(LPARAM)&chd);
            ft.chrg.cpMin = ft.chrgText.cpMax;
        }
        else
        {
            break;
        }
    }while(ft.chrg.cpMin != ft.chrg.cpMax);
}

このコードは遅すぎます。これは最適なオプションではないため、ちらつきが見られます。

他のバリエーションに興味があります。

4

2 に答える 2

0

ちらつきを減らすには、ダブルバッファリングを使用する必要があると思います。それ以外は、(同じスレッド内の)どのウィンドウにSendMessageも使用しないでください(または. PostMessage構文を強調表示するペイント コードで選択を行う必要があるのはなぜですか?

ダブル バッファに関する記事の 1 つがこれです

于 2013-01-26T12:25:47.523 に答える