BOOL GdiplusUtilities::DrawTextOutline(Gdiplus::Graphics& graphics, LPCTSTR lpchText, int cchText, const Gdiplus::Rect& rc, const Gdiplus::StringFormat& format, const Gdiplus::Font& font, Gdiplus::Color fill, Gdiplus::Color outline, INT outlineWidth, BOOL bCalcOnly/* = FALSE*/, Gdiplus::Rect* rcCalc/* = NULL*/) { Gdiplus::FontFamily fontFamily; font.GetFamily(&fontFamily); Gdiplus::GraphicsPath path; path.AddString(lpchText, cchText, &fontFamily, font.GetStyle(), font.GetHeight(&graphics), rc, &format); if (rcCalc != NULL) { path.GetBounds(rcCalc); rcCalc->Inflate(outlineWidth, outlineWidth); } if (bCalcOnly) return TRUE; Gdiplus::Pen pen(outline, (Gdiplus::REAL) outlineWidth); if (graphics.DrawPath(&pen, &path) == Gdiplus::Ok) { Gdiplus::SolidBrush brush(fill); return graphics.FillPath(&brush, &path) == Gdiplus::Ok; } return FALSE; }
static Gdiplus::Size getTxtSize(std::wstring txt) { Gdiplus::GraphicsPath path; Gdiplus::FontFamily ff; Gdiplus::Font* font = g_lv.f; font->GetFamily(&ff); Gdiplus::Rect rc; Gdiplus::Size sz; int len = txt.length(); if (len == 0) { return sz; } bool is_space = false; if (txt[len - 1] == L' ') { txt[len - 1] = L'M'; is_space = true; } path.AddString(txt.c_str(), len, &ff, font->GetStyle(), font->GetSize(), Gdiplus::Point(1, 0), NULL); path.GetBounds(&rc); int sd = (int)(font->GetSize() / 4); sz.Width = rc.Width + sd; if (is_space) { sz.Width -= sd; } sz.Height = rc.Height; return sz; }