2011-04-29 74 views
0

我明顯可以使用EM_GETCHARFORMAT一次完成一個字符,但速度非常慢。如何在RichEdit控件中查找粗體文本的運行?

一個想法是以某種方式使用ITextDocument/ITextFont接口,另一種是使用EM_STREAMOUT消息並手動解析RTF。但我無法確定哪種方法更好,並且對實現細節非常模糊。將感謝任何幫助,謝謝!

回答

2

我發現我滿意,並認爲將與您分享的解決方案:

ITextRange界面包含一個非常有用的方法Expand可用於查找常量字符(tomCharFormat)和段落的連續運行(tomParaFormat)格式。

下面是一些示例代碼(警告:代碼驗證的概念麪條沒有任何錯誤處理, 重構應用需要):

// Get necessary interfaces 
    IRichEditOle* ole; 
    SendMessage(hwndRichEdit, EM_GETOLEINTERFACE, 0, (LPARAM)&ole); 

    ITextDocument* doc; 
    ole->QueryInterface(__uuidof(ITextDocument), (void**)&doc); 

    long start = 0; 

    // Get total length:   
    ITextRange* range; 
    doc->Range(start, start, &range); 
    range->Expand(tomStory, NULL); 
    long eof; 
    range->GetEnd(&eof); 

    // Extract formatting: 

    struct TextCharFormat { long start, length; DWORD effects; } 
    std::vector<TextCharFormat> fs; 

    while(start < eof - 1) 
    { 
     doc->Range(start, start, &range); 

     long n; 
     range->Expand(tomCharFormat, &n); // <-- Magic happens here 

     ITextFont* font; 
     range->GetFont(&font); 

     DWORD effects = 0; 
     long flag; 

     font->GetBold(&flag); 
     if (flag == tomTrue) effects |= CFE_BOLD; 

     font->GetItalic(&flag); 
     if (flag == tomTrue) effects |= CFE_ITALIC; 

     font->GetUnderline(&flag); 
     if (flag == tomSingle) effects |= CFE_UNDERLINE; 

     font->GetStrikeThrough(&flag); 
     if (flag == tomTrue) effects |= CFE_STRIKEOUT; 

     if (effects) 
     { 
      TextCharFormat f = { start, n, effects }; 
      fs.push_back(f); 
     } 
     start += n; 
    } 
相關問題