来自GDI +区域的SetWindowRgn

时间:2013-02-21 14:30:00

标签: winapi gdi+ gdi

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

  1. 使用GDI +在GDI +中使用GraphicsPathAddString呈现文字
  2. Region
  3. 创建GraphicsPath对象
  4. Region转换为CRng并使用SetWindowRgn设置窗口形状
  5. 以下是代码:

    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);
    

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

3 个答案:

答案 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));