这可以使用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 程序进行了尝试,它也可以使用。万岁!