不同的窗口形式

时间:2013-07-24 13:11:41

标签: c++ winapi directx

我一直在使用directx一段时间以来一直困扰我的一件事就是windows是正方形(我想这适用于大多数程序)。现在,通常通过定义矩形形状并绘制它来创建,例如黑色。我一直在考虑两种方法:

  • 定义一个更大的矩形并将部分背景透明。

我决定不去参加这个,因为我完全不知道怎么做。

  • 了解微软提供的窗口形状。

虽然他们确实有很多win32配置设置(没有边框等)但我找不到任何关于特定形状绘图的信息(比如使用三角形)。

有没有人有窗体形状或透明背景的经验?也许我错过了更好的选择?提前谢谢!

1 个答案:

答案 0 :(得分:1)

使用SetWindowRgn API调用可以非常简单地完成此操作。这样做是为了定义系统允许绘图出现的区域。

举个简单的例子,让我们在其中一个窗口打一个洞。可以在窗口的WM_CREATE处理程序中完成以下操作:

case WM_CREATE:
    {
        // Get the window rect
        RECT r;
        GetWindowRect(m_hwnd, &r);
        MapWindowPoints(NULL, m_hwnd, reinterpret_cast<LPPOINT>(&r), 2);
        // Work out the size of the window
        LONG w = r.right - r.left;
        LONG h = r.bottom - r.top;
        // Create a rectangular region to cover the window (almost)
        HRGN hRgn = CreateRectRgnIndirect(&r);
        // and a smaller elliptical window
        r.left += w/4;
        r.right -= w/4;
        r.top += h/4;
        r.bottom -= h/4;
        HRGN rgnCirc = CreateEllipticRgnIndirect(&r);

        // Now we combine the two regions, using XOR to create a hole
        int cres = CombineRgn(hRgn, rgnCirc, hRgn, RGN_XOR);

        // And set the region.
        SetWindowRgn(m_hwnd, hRgn, TRUE);
    }
    break;

一些重要的说明。传递给SetWindowRgn的区域来自系统拥有的那个点,因此不要对其执行任何操作。此外,如果调整窗口大小,则需要修改区域 - 我只将示例放在WM_CREATE中作为示例。

关于上述内容的另一个小瑕疵,它没有正确执行窗口大小的计算......正如我所说,这只是一个在窗口中打孔的例子。

最后,我尝试使用简单的Direct-X程序,它也可以使用它。 Hoorah!