這可以通過使用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!
不知道它如何與DirectX一起工作,但您可以在線查看「SetWindowRgn」,一個WinAPI以...設置窗口區域。 – icabod
這看起來很酷,你可以舉一個小例子嗎? (如拿出一個像素或其他東西?) –