0
我明顯可以使用EM_GETCHARFORMAT一次完成一個字符,但速度非常慢。如何在RichEdit控件中查找粗體文本的運行?
一個想法是以某種方式使用ITextDocument/ITextFont接口,另一種是使用EM_STREAMOUT消息並手動解析RTF。但我無法確定哪種方法更好,並且對實現細節非常模糊。將感謝任何幫助,謝謝!
我明顯可以使用EM_GETCHARFORMAT一次完成一個字符,但速度非常慢。如何在RichEdit控件中查找粗體文本的運行?
一個想法是以某種方式使用ITextDocument/ITextFont接口,另一種是使用EM_STREAMOUT消息並手動解析RTF。但我無法確定哪種方法更好,並且對實現細節非常模糊。將感謝任何幫助,謝謝!
我發現我滿意,並認爲將與您分享的解決方案:
的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;
}