2013-07-24 102 views
0

我一直在使用directx一段時間,一直困擾着我的是窗口是正方形(我想這適用於大多數程序)。現在,創建經常通過定義矩形形狀並繪製該矩形來實現,例如黑色。我一直在想這2種方法:不同的窗口形式

  • 定義一個更大的矩形並繪製背景透明的部分。

我決定不去這個,因爲我完全不知道該怎麼做。

  • 查看microsoft提供的關於窗口形狀的內容。

雖然他們確實有很多win32配置設置(無邊框等),但找不到任何有關繪製特定形狀的內容(例如使用三角形)。

有沒有人有窗口形狀的經驗或繪製背景透明?也許更好的選擇,我錯過了?提前致謝!

+2

不知道它如何與DirectX一起工作,但您可以在線查看「SetWindowRgn」,一個WinAPI以...設置窗口區域。 – icabod

+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!