我使用directx 已经有一段时间了,一直困扰我的一件事是窗口是正方形的(我想这适用于大多数程序)。现在,通常通过定义一个矩形形状并绘制它来进行创作,例如黑色。我一直在考虑两种方法:
- 定义一个更大的矩形并绘制透明的背景部分。
我决定不去这个,因为我完全不知道该怎么做。
- 看看微软在窗口形状方面提供了什么。
虽然他们确实有很多 win32 配置设置(无边框等),但我找不到任何关于绘制特定形状的信息(例如使用三角形)。
有没有人有窗口形状或绘制透明背景的经验?也许我错过了更好的选择?提前致谢!
这可以使用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 程序进行了尝试,它也可以使用。万岁!