# MFC 圆形环绕文字 **Repository Path**: zzlouiss/mfc-circular-wrap-text ## Basic Information - **Project Name**: MFC 圆形环绕文字 - **Description**: 制作一个圆形环绕文字 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-06-01 - **Last Updated**: 2023-08-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MFC 圆形环绕文字 #### 介绍 制作一个圆形环绕文字 #### 软件架构 Windows API ### 效果图 ![输入图片说明](image.png) ![输入图片说明](ceshiroundtextimage.png) ### 实现逻辑 MFC中的DrawText 或是 TextOut 一般情况下只能输入横向或纵向的文字。如果我们使用这两个接口是没法实现文字环绕的。GDI 也没有什么高级的API可以调用。 无意中看到一篇文章说如何打印出一串斜着的字体。看到这个文章后恍然大悟,虽然我们还是不能将一整个字符串直接首位相连做成环形,但如果我们将字符串中的每个字都倾斜一定的角度,然后依次放在圆周上,这样我们就可得到一个圆形的文字环绕了。 ### 关键代码 ``` // 这个代码打印了一个旋转的"A" // 于平常的CFont类似,我们可以指定字号、粗细这些,具体参数请按照需求 LOGFONT lf; lf.lfWidth = 5; lf.lfHeight = 8; lf.lfWeight = 400; lf.lfUnderline = false; lf.lfStrikeOut = false; lf.lfItalic = false; lf.lfCharSet = DEFAULT_CHARSET; lf.lfQuality = DRAFT_QUALITY; lf.lfClipPrecision = CLIP_STROKE_PRECIS; lf.lfOutPrecision = OUT_STROKE_PRECIS; lstrcpy(lf.lfFaceName, L"arial"); // 字体 lf.lfEscapement = 270 * 10; // 0-3600 一个圆360° * 10,为什么要*10,我也不知道,参数的范围就是这么指定的 // 具体角度,需要根据自己的需求算出来 CFont newfont, *oldfont; newfont.CreateFontIndirectW(&lf); // 创建新font oldfont = pDC->SelectObject(&newfont); // 保存旧font,使用新font int x = 50; int y = 50; pDC->TextOut(x, y, L"A"); newfont.DeleteObject(); pDC->SelectObject(oldfont); ``` ``` // 如何算出每个字的位置 // 已知: 圆心(rx,ry),半径r,角度θ,这个角度你可以理解为lf.lfEscapement / 10。 // 由圆的坐标方程 x = rx + cosθ * r; y = ry + sinθ * r; int x, y; // cos sin 在 math.h 里面 x = rx + cos(θ * 3.1415926 / 180) * r; y = ry + sin(θ * 3.1415926 / 180) * r; pDC->TextOut(x, y, L"A"); ```