程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 形態各異的不規則窗體

形態各異的不規則窗體

編輯:關於VC++

說起不規則窗體也許我們大家都會覺得新鮮,這是因為我們平日裡絕大部分窗體用的都是正規正矩的矩形窗體,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!所有的代碼都在本文附帶的例子裡面,可不要錯過哦!

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved