Rotation de lignes de texte
Vous pouvez faire pivoter les polices TrueType à n’importe quel angle. Cela est utile pour l’étiquetage des graphiques et d’autres illustrations. L’exemple suivant montre comment faire pivoter une chaîne par incréments de 10 degrés autour du centre de la zone cliente en modifiant la valeur des membres lfEscapement et lfOrientation de la structure LOGFONT utilisée pour créer la police.
#include "strsafe.h"
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_PAINT:
{
hdc = BeginPaint(hWnd, &ps);
RECT rc;
int angle;
HGDIOBJ hfnt, hfntPrev;
WCHAR lpszRotate[22] = TEXT("String to be rotated.");
HRESULT hr;
size_t pcch = 22;
// Allocate memory for a LOGFONT structure.
PLOGFONT plf = (PLOGFONT) LocalAlloc(LPTR, sizeof(LOGFONT));
// Specify a font typeface name and weight.
hr = StringCchCopy(plf->lfFaceName, 6, TEXT("Arial"));
if (FAILED(hr))
{
// TODO: write error handler
}
plf->lfWeight = FW_NORMAL;
// Retrieve the client-rectangle dimensions.
GetClientRect(hWnd, &rc);
// Set the background mode to transparent for the
// text-output operation.
SetBkMode(hdc, TRANSPARENT);
// Draw the string 36 times, rotating 10 degrees
// counter-clockwise each time.
for (angle = 0; angle < 3600; angle += 100)
{
plf->lfEscapement = angle;
hfnt = CreateFontIndirect(plf);
hfntPrev = SelectObject(hdc, hfnt);
//
// The StringCchLength call is fitted to the lpszRotate string
//
hr = StringCchLength(lpszRotate, 22, &pcch);
if (FAILED(hr))
{
// TODO: write error handler
}
TextOut(hdc, rc.right / 2, rc.bottom / 2,
lpszRotate, pcch);
SelectObject(hdc, hfntPrev);
DeleteObject(hfnt);
}
// Reset the background mode to its default.
SetBkMode(hdc, OPAQUE);
// Free the memory allocated for the LOGFONT structure.
LocalFree((LOCALHANDLE) plf);
EndPaint(hWnd, &ps);
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}