2010-08-27 165 views
1

我想將文本繪製到GDI表面並將此文本逆時針旋轉90度。我寧願使用DrawText來繪製文本,因爲它支持回車。我試圖在lfEscapement中使用字體(請參閱下面的代碼),但不會旋轉線條 - 其中一行會被渲染。有沒有可能旋轉文字?或者不旋轉渲染而旋轉整個設備上下文?使用GDI將文本旋轉90度


普通的文本佈局:

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,結果非常奇怪(文本在屏幕頂部呈現)。我看到了codeproject的關鍵字。我看到的唯一問題是我需要自己處理回車/線路長度。 – 2010-08-27 13:27:56

+1

只是另一個建議,在codeguru的這個鏈接上,有一些旋轉位圖的例子。您可以將文本水平地繪製在兼容DC的位圖中,並將其在主DC中旋轉。 http://www.codeguru.com/cpp/g-m/bitmap/specialeffects/article.php/c1743 – 2010-08-27 13:38:14