2

我正在构建一个 MFC C++ 应用程序。我需要将窗口呈现为动态字符串的形状。为了存档这个,我做了以下事情:

  1. 使用 GDI+在 GDI+ 中使用GraphicsPath和呈现文本AddString
  2. 从创建Region对象GraphicsPath
  3. 转换RegionCRng并用于SetWindowRgn设置窗口形状

这是代码:

OnInitDialog

CClientDC dc(this);
Graphics graphics(dc.GetSafeHdc());
graphics.SetSmoothingMode(SmoothingModeAntiAlias);
graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic);

GraphicsPath path;
FontFamily fontFamily(L"Arial");
StringFormat strformat;
wchar_t pszbuf[] = L"testString";
path.AddString(pszbuf, wcslen(pszbuf), &fontFamily, FontStyleRegular, 14, 
Gdiplus::Point(0,16), &strformat );
Region myRgn(&path);    

CRng rgn;
rgn.FromHandle(myRgn.GetHRGN(&graphics));
SetWindowRgn(rgn,TRUE) ;

OnPaint

RECT rect;
GetWindowRect(&rect);
CBrush brush;
brush.CreateSolidBrush(color);
paint_dc.FillRect(&rect, &brush);

问题是我没有看到任何显示的内容。任何意见?

4

3 回答 3

0

一个问题可能是您的 CRgn 在绘制窗口之前超出了范围。如果您查看文档 ( http://msdn.microsoft.com/en-us/library/aa930600.aspx ),它会显示“系统不会复制该区域”。尝试将您的 CRgn 作为窗口类的成员变量,看看它是否有帮助。

于 2013-02-28T19:07:21.843 回答
0

让这个工作的最好方法是确保CRgn变量在OnPaint. CRgn结束后立即超出范围OnInitDialog其次,使用ClientDC而不是WindowDC. 您可能必须将Graphics/GraphicsPath变量修改为全局变量,以便可以从OnPaint. 希望这可以帮助。

于 2013-04-28T22:14:58.180 回答
0

'CRgn::FromHandle()' 是一个返回 CRgn 的静态函数。

利用

CRgn * rgn = CRgn::FromHandle(myRgn.GetHRGN(&graphics));

代替

rgn.FromHandle(myRgn.GetHRGN(&graphics));
于 2014-02-14T09:39:18.427 回答