我正在构建一个MFC C ++应用程序。我需要渲染一个动态字符串形状的窗口。为了存档,我做了以下事情:
GraphicsPath
和AddString
呈现文字Region
GraphicsPath
对象
Region
转换为CRng
并使用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);
问题是我没有看到任何显示内容。有什么意见吗?
答案 0 :(得分:0)
一个问题可能是在绘制Window之前你的CRgn超出了范围。如果你查看文档(http://msdn.microsoft.com/en-us/library/aa930600.aspx),它会说“系统不会复制该区域”。尝试将CRgn作为窗口类的成员变量,看看它是否有帮助。
答案 1 :(得分:0)
确保CRgn
变量位于OnPaint
的最佳方式。 CRgn
结束后,OnInitDialog
就会超出范围
其次,使用ClientDC
代替WindowDC
。
您可能需要将Graphics
/ GraphicsPath
变量修改为全局,以便可以从OnPaint
访问该变量。
希望这会有所帮助。
答案 2 :(得分:0)
'CRgn :: FromHandle()'是一个返回CRgn的静态函数。
使用
CRgn * rgn = CRgn::FromHandle(myRgn.GetHRGN(&graphics));
而不是
rgn.FromHandle(myRgn.GetHRGN(&graphics));