Вычисление смещения линии для отображения текста (пользовательский элемент управления редактирования) - PullRequest
0 голосов
/ 10 января 2020

Я следовал Пользовательский элемент управления для редактирования win32 Второй ответ для создания пользовательского элемента управления для редактирования, но проблема в том, что я отрисовываю каждую букву отдельно, поэтому у меня могут быть разные цвета текста. И для каждого вызова рендеринга мне нужно рассчитать смещение текста, чтобы начать рендеринг с верхней части экрана (0,0), поэтому мне не нужно рендерить весь текст. И если у меня есть файл размером 200 КБ, и я прокручиваю его до конца (и выполняю там какое-то редактирование), слишком большая задержка, поскольку мне нужно go пропустить весь этот текст и найти все '\ n' (указывает на строку число) для смещения.

Функция рендеринга:

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;
}

Я выбрал неправильный путь и должен использовать «другой алгоритм» для рендеринга текста ( в разные цвета ), или, если нет, как я могу оптимизировать этот код? Мне нравится этот подход (для карета), поскольку выбор текста действительно прост.

Я также сталкивался с Какой самый быстрый способ рисовать форматированный текст в Win32 API? но это не так. не отвечай на мой вопрос. Здесь упоминается только функция рендеринга (ExtTextOut), но мне это не нужно. Мне нужен быстрый способ вычисления смещения линии для больших строк.

...