2010-08-27 3 views
1

Я хочу нарисовать текст на поверхность GDI и повернуть этот текст на 90 градусов против часовой стрелки. Я бы предпочел использовать DrawText для рисования текста, потому что он поддерживает возврат каретки. Я попытался использовать шрифт с lfEscapement (см. Код ниже), но линия не вращается - одна строка получается над другой. Есть ли возможность повернуть текст? Или визуализировать без вращения и вращать весь контекст устройства?Поверните текст на 90 градусов с помощью GDI


Нормальный макет текста:

alt text


повернутого (желаемый результат):

alt text

case WM_PAINT: 
    { 
     hdc = BeginPaint(hWnd, &ps); 

     LOGFONT lf = {0}; 
     HANDLE hFont; 
     ZeroMemory(&lf, sizeof(LOGFONT)); 

     lf.lfWeight = FW_NORMAL; 
     lstrcpy(lf.lfFaceName, _T("Tahoma")); 
     lf.lfEscapement = 90; 
     lf.lfHeight = 30; 
     hFont = CreateFontIndirect (&lf); 
     hFont = (HFONT)SelectObject (ps.hdc, hFont); 

     RECT RectBody = {10,lf.lfHeight+10,::GetSystemMetrics(SM_CXSCREEN)-10,::GetSystemMetrics(SM_CYSCREEN)-lf.lfHeight-20}; 
     { 
      ScopedLock lock(me->m_mutex); 
      DrawText (ps.hdc, me->GetMessageString().c_str(), (int)me->GetMessageString().length(), &RectBody, 0); 
     } 

     hFont = (HFONT)SelectObject (ps.hdc, hFont); 
     DeleteObject (hFont); 

     EndPaint(hWnd, &ps); 
     break; 
    } 

ответ

3
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); 

Думаю, я пробовал все варианты выравнивания.

0

У меня такое впечатление что эта связь отвечает на ваш вопрос, но с использованием ExtTextOut, а не DrawText

http://www.codeproject.com/KB/GDI/textrotation.aspx

это не GDI + это MFC, но они близки.

+0

Спасибо за ваш ответ, я попробовал TA_BASELINE с очень странными результатами (текст отображается в верхней части экрана). Я видел артикул на кодепроекте. Единственная проблема, которую я вижу, это то, что мне нужно самостоятельно обрабатывать возврат каретки/длину строки. –

+1

Еще одно предложение, по этой ссылке на codeguru, есть примеры для поворота растровых изображений. Вы можете нарисовать текст горизонтально в растровом формате совместимого DC на вашем основном контроллере постоянного тока, а затем использовать его в главном DC. http://www.codeguru.com/cpp/g-m/bitmap/specialeffects/article.php/c1743 –

Смежные вопросы