說起不規則窗體也許我們大家都會覺得新鮮,這是因為我們平日裡絕大部分窗體用的都是正規正矩的矩形窗體,Word這個大名鼎鼎的軟件想必大家都已用過,那麼在Word裡就按下你手中的F1鍵吧,彈出的窗體形態怎麼樣,很炫吧!(如下圖所示)。
那麼實現這樣的窗體困難嗎?簡單!幾句話就可以輕松搞定。不過在揭示答案之前我們還是先來熟悉一下在Windows裡不規則窗體的實現幾點要素。
一、創建不規則窗體的幾個主要函數:
<1> CreateRectRgn : 創建矩形窗體輪廓。
<2> CreateRoundRectRgn : 創建圓角矩形窗體輪廓。
<3> CreateEllipticRgn : 創建圓形或橢圓形窗體輪廓。
<4> CreatePolygonRgn : 創建多邊形窗體輪廓。
上面函數在創建不規則窗體輪廓時可直接使用,無須自己指定輪廓路徑。如果想讓窗體更復雜,你可以使用CombineRgn把多個輪廓路徑混合起來實現。上面的函數還可以用BeginPath,EndPath和PathToRegion三個函數實現,其實這三個函數給用戶提供了最大的創造和發揮的空間,讓用戶自定義窗體輪廓路徑,這樣用戶就可以拿起手中Pen來畫出所有你想要的東西,什麼矩形/橢圓/多邊形/弧線形...... 都可以輕松搞定,就連字體來可以作為窗體的形狀哦。
二、改變窗體的形狀:
我們創建好了自己的窗體形狀,那麼如何來通知Windows來改變窗體的形狀呢?秘密只有一句話:SetWindowRgn。
注意:本文所附帶的例子全部以BeginPath,EndPath和PathToRegion為中心來講解如何實現不規則窗體。
三、具體實現步驟:
說了這麼多的函數,那麼接下來就讓我們一起來看一看如何來使用BeginPath,EndPath和PathToRegion。下面就以一個字體窗體來看看三者的使用步驟。假設以下代碼放在了一個按鈕的Click事件中:
CClientDC dc(this);
HDC hDC;
CFont mFont;
hDC = ::GetDC(this->m_hWnd);
//創建字體
VERIFY(mFont.CreateFont(
200, 50, 0, 0, FW_HEAVY, TRUE, FALSE,
0, ANSI_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_SWISS, "宋體"));
if (hDC!=NULL)
{
//開始記錄窗體輪廓路徑
dc.BeginPath();
//設置背景為透明模式,這句話是必須有的。
dc.SetBkMode(TRANSPARENT);
CFont * pOldFont;
pOldFont = dc.SelectObject( &mFont );
dc.TextOut(0, 0, "VCKbase");
dc.SelectObject( pOldFont );
mFont.DeleteObject();
//結束記錄窗體輪廓路徑
dc.EndPath();
//把所記錄的路徑轉化為窗體輪廓句柄
m_wndRgn = ::PathToRegion(dc);
//賦予窗體指定的輪廓形狀
this->SetWindowRgn(m_wndRgn, TRUE);
}
else
AfxMessageBox("Error!");
看過了以上代碼你也許已經明白這三個函數的內涵。那麼又如何畫出象Word中按F1後彈出的窗體呢?這我就不用多說了吧,拿起你手中的畫筆吧,一切都很Easy!所有的代碼都在本文附帶的例子裡面,可不要錯過哦!
本文配套源碼