Народ, кто делал, плиз, помогите сделать так что-бы не тормозило. Текста — 250 байт, а тормозит очень сильно.
Этот код выполняется только один раз:
IUnknown *_pUnk;
ITextDocument *_pDoc;
ITextRange *_pRange;
ITextFont *_pFont;
if(!_pUnk)
SendMessage(EM_GETOLEINTERFACE, 0, (LPARAM)&_pUnk);
if(!_pUnk || _pUnk->QueryInterface(IID_ITextDocument, (void**)&_pDoc) != NOERROR)
return;
Вот кусок кода, он вызывается каждый раз когда меняется селекшен.
void VFormulaEditCtrl::OnEnSelchange(NMHDR *pNMHDR, LRESULT *pResult)
{
const char* cur_ch = _myText;
char lex_buf[MAX_PATH];
int start_lex = 0;
int end_lex = 0;
int i = 0;
int staples = 0;
do {
if(*cur_ch == '"') {
do {
stepForward(&cur_ch);
end_lex++;
} while(*cur_ch != '"' && *cur_ch);
end_lex++;
intSetOleColor(start_lex, end_lex, TEXT_COLOR); // эта функция красит текст, ее текст ниже
stepForward(&cur_ch);
} else if (intIsSeparate((CString)*cur_ch)) {
i = 0;
end_lex++;
start_lex = end_lex;
if(*cur_ch == '(')
staples += 1;
if(*cur_ch == ')')
staples -= 1;
intSetOleColor(end_lex - 1, end_lex, intGetSeparatorColor(*cur_ch));// эта функция красит текст, ее текст ниже
stepForward(&cur_ch);
}
else {
lex_buf[i + 1] = '\0';
lex_buf[i] = *cur_ch;
i++;
end_lex++;
if(intIsReservedWord(lex_buf))
intSetOleColor(start_lex, end_lex, RESERVED_COLOR);// эта функция красит текст, ее текст ниже
else
intSetOleColor(start_lex, end_lex, ERROR_COLOR);// эта функция красит текст, ее текст ниже
stepForward(&cur_ch);
}
} while(*cur_ch);
SetEventMask(GetEventMask() | ENM_SELCHANGE | ENM_CHANGE);
_pRange->SetFont(_pFont);
_pRange->Release();
_pDoc->Unfreeze(&_count);
_pDoc->Undo(tomTrue, NULL);
}
вот функция которая красит текст:
void VFormulaEditCtrl::intSetOleColor(long chMin, long chMax, COLORREF color)
{
_pDoc->Range(chMin, chMax, &_pRange);
_pRange->GetFont(&_pFont);
_pFont->SetForeColor(color);
}
Проблема точно в вызове функций OLE, т. к. если отрубить в верхнем куске кода функцию intSetOleColor, все просто летает. Может стек какой-нить или еще что-нибудь??
Все имена функций и классов изменены, любое совпадение является случайным.