在GDI中旋转矩形

时间:2016-08-04 03:02:04

标签: winapi gdi

我使用windows GDI API ExtTextOut函数来绘制这样的文字:

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

我正在尝试旋转文本,我会旋转文本。但是当我用颜色填充矩形时,我发现矩形没有随文本一起旋转。

有没有办法用文字旋转矩形?或者有更好的方法吗?

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

谢谢!

1 个答案:

答案 0 :(得分:6)

它不是 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)

结果如下:

enter image description here

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