Новая строка WinAPI DrawText

Как сделать так, чтобы каждая строка отображалась с новой строки?

int i = 1;
char *s = *environ;
    for (; s; i++) {
        DrawText(hdc, s, -1, &rect,
            DT_WORDBREAK | DT_EDITCONTROL | DT_BOTTOM);
            s = *(environ + i);
         }

person Evgenyj Afanasyev    schedule 09.12.2015    source источник
comment
Хм, перемещая прямоугольник назначения вниз для каждой новой строки. И сегодня ваш счастливый день, потому что кто-то даже реализовал функцию OffsetRect. для тебя!   -  person IInspectable    schedule 09.12.2015
comment
Если вы читаете то, что только что сказал IInspectable, я предполагаю, что следующий вопрос заключается в том, как мне получить высоту линии, которую я только что нарисовал. Ну у вас есть три варианта. Первые два должны дать вам одинаковый результат: GetTextExtentPoint32() и DrawText(DT_CALCRECT). Они будут измерять ограничивающую рамку строки, которую вы рисуете, поэтому, если подъем или спуск символов в одной переменной среды отличается, вы получите разную высоту строки. Другой способ — использовать GetTextMetrics() и TEXTMETRIC.tmHeight. Это даст вам максимально возможную высоту строки для текущего выбранного шрифта.   -  person andlabs    schedule 09.12.2015
comment
Этот последний, вероятно, тот, на который стоит обратить внимание, поскольку вы получаете постоянную высоту строки (и эта высота строки, вероятно, в любом случае используется DrawText() для многострочного рисования). Вы также всегда можете просто создать комбинированную строку переменных среды, разделенных символами новой строки, но, не зная, какова ваша общая цель, я не уверен, что это хорошая идея.   -  person andlabs    schedule 09.12.2015
comment
...на самом деле, работает ли DT_CALCRECT так, как я только что указал, или он ведет себя как GetTextMetrics() в случае одной строки? Кто-то, кто хочет пойти на это, должен будет проверить; Я всегда просто использую GetTextMetrics(), так как на данный момент мне нужно заранее получить высоту строки в моих программах. (Это может измениться в будущем.)   -  person andlabs    schedule 09.12.2015
comment
@andlabs Четвертый вариант: Если функция завершается успешно, возвращаемое значение представляет собой высоту текста в логических единицах   -  person Jonathan Potter    schedule 09.12.2015
comment
Верно; Я думаю, что это будет то же самое, что и GetTextExtentPoint32(), но я не уверен. Также я не знаю, какой у вас компилятор, но environ может работать некорректно перед значениями переменных среды Unicode... если это не так, вам нужно будет использовать GetEnvironmentStringsW().   -  person andlabs    schedule 09.12.2015


Ответы (2)


Используйте значение, возвращаемое функцией DrawText (высота нарисованного текста), чтобы сместить прямоугольник для следующей строки текста.

int i = 1;
char *s = *environ;
for (; s; i++) {
    int height = DrawText(hdc, s, -1, &rect,
        DT_WORDBREAK | DT_EDITCONTROL | DT_BOTTOM);
    OffsetRect(&rect, 0, height);
    s = *(environ + i);
}
person Jonathan Potter    schedule 09.12.2015

Вам нужно добавить новый символ строки '\n' в конец каждой строки.

Исправление: я думал, что все строки будут нарисованы сразу...

person Vlad Feinstein    schedule 09.12.2015
comment
Вероятно, вам следует удалить этот ответ. - person Jonathan Potter; 10.12.2015