在 GDI 中旋转矩形

Rotate The Rectangle in GDI

我正在使用 windows GDI API ExtTextOut 函数绘制文本,如下所示:

ExtTextOut(hDC, 2000, 2000, 0, &stRect, PrintText, TextOutLen, aiCharCellDistances);

我正在尝试旋转文本,我确实旋转了文本。但是当我给矩形填充颜色的时候,我发现矩形并没有随着文字旋转。

有什么方法可以让文字的矩形旋转吗?或者有更好的方法吗?

P.S.: 我的目标是在矩形(如文本区域)中绘制文本并可以任意角度旋转,并设置背景颜色、边框线、换行符、右对齐等。

谢谢!

不是100%不清楚你想要什么,但我想你想画一些旋转相同角度的文本和矩形?如果是这样,使用 SetWorldTransform 可能最简单。

下面是一些使用 MFC 执行此操作的代码:

double factor = (2.0f * 3.1416f)/360.0f;
double rot = 45.0f * factor;

// Create a matrix for the transform we want (read the docs for details)
XFORM xfm = { 0.0f };
xfm.eM11 = (float)cos(rot);
xfm.eM12 = (float)sin(rot);
xfm.eM21 = (float)-sin(rot);
xfm.eM22 = (float)cos(rot);

pDC->SetGraphicsMode(GM_ADVANCED);
pDC->SetWorldTransform(&xfm);    // Tell Windows to use that transform matrix

pDC->SetBkMode(TRANSPARENT);
CRect rect{ 290, 190, 450, 230 };
CBrush red;
red.CreateSolidBrush(RGB(255, 0, 0));

pDC->FillRect(rect, &red); // Draw a red rectangle behind the text

pDC->TextOut(300, 200, L"This is a string"); // And draw the text at the same angle

在大多数情况下,在没有 MFC 的情况下执行此操作仅意味着将 pDC->foo(args) 更改为 foo(dc, args)

结果如下所示:

请注意,在这种情况下,您 不需要 需要为您的字体指定旋转(完全是 lfRotationlfEscapement)采用。您只需像普通文本一样绘制,世界变换会处理所有旋转。