0

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

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

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

  • 看看微软在窗口形状方面提供了什么。

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

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

4

1 回答 1

1

这可以使用SetWindowRgnAPI 调用非常简单地完成。这样做是定义系统允许绘图出现的区域。

作为一个简单的例子,让我们在我们的一个窗户上打一个洞。以下可以在窗口的 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 程序进行了尝试,它也可以使用。万岁!

于 2013-07-30T09:24:34.467 回答