I followed Custom edit control win32 second answer to create custom edit control, but the problem is that, I render every letter separate, so I can have different text colors. And for every render call, I have to calculate text offset to start rendering from top of the screen (0,0), so i don't have to render whole text. And if I have a 200kB file and scroll to bottom of the file (and do some editing there), there is just too much lag, since I have to go trough all that text and find all '\n' (indicates line number) for offset.
Render function:
int Screen_X = 0, Screen_Y = 0;
size_t Text_YOffset = Calc_TextYPos(m_Screen_YOff); //Screen pos(0,0) to text
size_t Text_Size = m_Text.size();
COLORREF Text_ColorOld = 0;
for (size_t pos = Text_YOffset; pos < Text_Size; pos++) {
if (m_Text.at(pos) == L'\n') {
Screen_Y++; Screen_X = 0;
continue;
}
if (Screen_X < m_Screen_XOff) { Screen_X++; continue; }
if (m_Screen_MaxX < Screen_X) continue;
if (m_Screen_MaxY < Screen_Y) break;
if (m_Text_Color.at(pos) != Text_ColorOld) {
Text_ColorOld = m_Text_Color.at(pos);
if (SetTextColor(hDC, Text_ColorOld) == CLR_INVALID) {
MB_ERR("'SetTextColor' Failed!");
PostQuitMessage(-1);
}
}
CHECK_ERR(TextOut(hDC, (Screen_X - m_Screen_XOff) * m_Char_Width, Screen_Y * m_Char_Height, &m_Text.at(pos), 1), ERR_MSG_TEXT_OUT);
Screen_X++;
}
Calc_TextYPos:
size_t Edit_Control::Calc_TextYPos(int Screen_y) {
if (Screen_y == 0) return 0;
size_t Offset = 0;
size_t Text_Size = m_Text.size();
for (size_t pos = 0; pos < Text_Size; pos++) {
if (m_Text.at(pos) == L'\n' && Screen_y != 0) {
Screen_y--;
Offset = pos + 1;
}
if (Screen_y == 0) return Offset;
}
return Offset;
}
Am I taking the wrong path here and should use "different algorithm" for rendering text (in different colors), or if not, how can I optimize this code? I like this approach (for caret) since, selecting text is really easy.
I also came across What is the fastest way to draw formatted text in the Win32 API? but, it doesn't answer my question. It only mentions about rendering function (ExtTextOut), but I don't need that. I need a fast way of calculating line offset(s) on big strings.