lf.lfEscapement = 90;
Это должно быть 900, чтобы получить текст по вертикали, единицы - 0,1 градуса.
Боюсь, ваш план по обеспечению DrawText позаботится о разрыве строк. Я не мог убедить его правильно выровнять текст. Он выравнивается по последней строке, а не по первой. Некоторый код для игры:
wchar_t* msg = L"Hello\r\nworld";
RECT rcMeasure = {0, 0, 400, 0};
DrawTextEx(hdc, msg, -1, &rcMeasure, DT_CALCRECT, 0);
RECT rcDraw = {10, 30, 10 + rcMeasure.bottom - rcMeasure.top, 30 + rcMeasure.right - rcMeasure.left };
FillRect(hdc, &rcDraw, (HBRUSH) (COLOR_WINDOW+2));
SetTextAlign(hdc, TA_TOP | TA_CENTER);
DrawTextEx(hdc, msg, -1, &rcDraw, DT_BOTTOM, 0);
Я думаю, что перепробовал все варианты выравнивания.