【问题标题】:SetWindowRgn from GDI+ region来自 GDI+ 区域的 SetWindowRgn
【发布时间】:2013-02-06 22:13:42
【问题描述】:

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

  1. 使用 GDI+ 在 GDI+ 中使用 GraphicsPathAddString 呈现文本
  2. GraphicsPath 创建一个Region 对象
  3. 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);

问题是我没有看到任何显示。有cmets吗?

【问题讨论】:

  • 您是否尝试过使用 LRESULT OnPaint (HWND hWnd) 和 BeginPaint / EndPaint?
  • 根本没有错误检查,所以你当然不知道为什么它不起作用。 SetWindowRgn 并没有按照您的想法做,请改用 SelectObject()。
  • @HansPassant 你为什么认为没有错误检查?当然有。此处的清单是为了突出代码中的主要调用。我需要将整个窗口设置为区域的形状,所以我确实需要 SetWindowRgn(更新了描述)

标签: winapi gdi+ gdi


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    最好的方法是确保CRgn 变量在OnPaint 中。 CRgnOnInitDialog 结束后立即超出范围 其次,使用ClientDC 而不是WindowDC。 您可能需要将Graphics / GraphicsPath 变量修改为全局变量,以便可以从OnPaint 访问它。 希望这会有所帮助。

    【讨论】:

      【解决方案3】:

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

      使用

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

      而不是

      rgn.FromHandle(myRgn.GetHRGN(&graphics));
      

      【讨论】:

        猜你喜欢
        • 2014-01-27
        • 2015-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-20
        • 2010-09-26
        • 1970-01-01
        • 2012-03-14
        相关资源
        最近更新 更多