【问题标题】:SetWindowRgn freezes windowSetWindowRgn 冻结窗口
【发布时间】:2012-05-30 02:48:34
【问题描述】:

正如标题所说,我在调用 SetWindowRgn 后遇到了应用程序窗口冻结(不再绘制)的问题。我的源代码如下:

    void MakeHole() 
    {
      // This will make a hole you can see through for the MainToon window.
      HRGN thisHgrn = CreateRectRgn(10, 200, 300, 200);
      SetWindowRgn(hwndClientList[intMainToon], thisHgrn, TRUE);
    }

我什至不太确定 SetWindowRgn 是我需要使用的代码。我想要完成的只是游戏窗口中的一个洞(透明块),以便我可以看穿它。在这一点上,项目中的其他代码都不是真正相关的。一切都按预期工作,只是在我调用 SetWindowRgn 之后,游戏窗口不再绘制。它看起来冻结了,但我仍然可以关闭窗口并且声音仍然清晰地播放。这是一个可视化 C++ 控制台应用程序,但我也看不出它有什么重要性。 如果您需要更多信息,请告诉我。

感谢您的帮助。

【问题讨论】:

  • 您的代码似乎是在设置整个窗口区域,而不是创建一个洞。您的回答似乎做得更好。

标签: windows visual-studio-2010 winapi visual-c++


【解决方案1】:

用下面的代码修复了问题。

    void MakeHole()
    {
       // This will make a hole you can see through for the MainToon window.

       HRGN rgnOriginalWnd;
       HRGN rgnTheHole;
       HRGN rgnNewWnd;

       RECT rectDlg;
       GetWindowRect(hwndClientList[intMainToon], &rectDlg);

       rgnOriginalWnd = CreateRectRgn(0, 0, rectDlg.right - rectDlg.left, rectDlg.bottom - rectDlg.top);
       rgnTheHole = CreateRectRgn(10, 200, 350, 450);
       rgnNewWnd = CreateRectRgn(0, 0, 0, 0);

       CombineRgn(rgnNewWnd, rgnOriginalWnd, rgnTheHole, RGN_DIFF);
       SetWindowRgn(hwndClientList[intMainToon], rgnNewWnd, TRUE);

       DeleteObject(rgnOriginalWnd);
       DeleteObject(rgnTheHole);
       DeleteObject(rgnNewWnd);
    }

【讨论】:

    猜你喜欢
    • 2020-05-25
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    相关资源
    最近更新 更多