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