2010-08-27 5 views
1

Je souhaite dessiner du texte sur une surface GDI et faire pivoter ce texte de 90 degrés dans le sens inverse des aiguilles d'une montre. Je préférerais utiliser DrawText pour dessiner le texte car il prend en charge le retour chariot. J'ai essayé d'utiliser une police avec lfEscapement (voir le code ci-dessous) mais la ligne n'est pas pivotée - une ligne est rendue sur l'autre. Est-il possible de faire pivoter le texte? Ou pour rendre sans rotation et tourner le contexte de l'ensemble du dispositif?Faire pivoter le texte de 90 degrés avec GDI


mise en page de texte normal:

alt text


pivotée (résultat souhaité):

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

Répondre

3
lf.lfEscapement = 90; 

Cela devrait être 900 pour obtenir le texte vertical, les unités sont 0,1 degrés.

Votre plan pour laisser DrawText prendre soin des sauts de ligne va tomber à plat j'ai peur. Je ne pouvais pas le convaincre d'aligner le texte correctement. Il s'aligne sur la dernière ligne, pas la première. Un peu de code à jouer avec:

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

Je pense avoir essayé toutes les options d'alignement.

0

J'ai l'impression que ce lien répond à votre question, mais en utilisant ExtTextOut, et non drawText

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

ce n'est pas GDI + il est MFC mais ils sont proches.

+0

Merci pour votre réponse, j'ai essayé TA_BASELINE avec des résultats très étranges (le texte est rendu en haut de l'écran). J'ai vu l'article sur codeproject. Le seul problème que je vois est que je dois gérer les retours chariot/longueur de ligne moi-même. –

+1

Juste une autre suggestion, à ce lien sur codeguru, il y a des exemples de rotation de bitmaps. Vous pouvez dessiner votre texte horizontalement dans un bitmap d'un DC compatible à votre DC principal, puis l'utiliser pivoté dans votre DC principal. http://www.codeguru.com/cpp/g-m/bitmap/specialeffects/article.php/c1743 –

Questions connexes