-
前言:
如果勇敢PhotoShop繪圖軟件,就一定記得它有“選擇區域”,以及“路徑”的概念,區域用來選定一個範圍,以便對指定的範圍進行某種操作;而路徑相當於用虛擬的線條進行 “圈地運動”,雖然路徑圈出來的看上去也是一個區域,但路徑記錄的是“圈地”用的線條而不是圈出來的地。 -
使用區域:
-
創建區域:
-
GDI 中可以用下列區域建立函數來創建區域:
- CreateRectRgn 函數的參數指定了 左上和右下兩個對角的座標。
- CreateEllipticRgn 的參數指定了一個矩形,產生的矩形區域是相切的。
- CreateRllipiticRgnIndrect 函數同樣建立橢圓區域,但指定與橢圓相切的矩形是由一個 RECT 結構定義的。
- CreatePolygonRgn 建立一個多邊形區域。lpPoint 指向了一系列的 POINT 結構, iCount 指定了點的數量,iPolyFillMode參數就是 SetPolyFillMode 函數使用的參數:ALTERNATE 或 WINDING,結果的不同之處相當於表 7.4中 Polygon 函數的兩種區別
-
如果創建區域成功的話,這些函數返回一個區域句柄 hRgn,區域和畫筆,畫刷等一樣的,都是GDI對象。如果不再使用一個區域,需要用 DeleteObject將它刪除。
-
-
合併區域
- 僅僅上面的函數可能用途不是很大,但是將不同形狀的區域按照各種方式合併在一起,用處就大了,可以因此定義出很複雜的區域。
- 要合併區域可以使用函數:
- 該函數將 hScrRgn1 和 hSrcRgn2 兩個區域合併起來放入 hDestRgn 指定的區域句柄中,但 hDestRgn 並不是新生成的,它必須是一個已經存在的區域句柄,當函數執行後,hDestRgn中原來的區域會被破壞並替換成合並的區域,但可以對 hDestRgn 和 hSrcRgn1 使用同一個句柄,相當於把2合併到1進去。
- 合併的方式:dwCombine 指定了合併的方式,它可以是以下取值
-
區域的用途:
區域主要可以用在兩個地方:建立特殊形狀的窗口和對繪畫區域進行裁剪。
- 建立特殊窗口圖形:
使用SetWindowRgn 函數可以使窗口的形狀由區域指定,如BmpClock 時鐘程序是橢圓形的,當把時鐘移動到其他窗口上面的時候,它的四角並不覆蓋住下層窗口,這就是因爲程序中有下面代碼:
- SetWindowRgn 最後一個參數爲 TRUE,表示設置窗口形狀後 WIndows 要發送一個WM_PAINT 消息將窗口 重畫。
- 由於 Windows對使用的區域保存一個拷貝,所以程序在調用 SetWindowRgn 函數後就可以用 DeleteObject 刪掉,並不需要退出時再刪除掉。
- 另外,區域可以用來對繪畫區域進行裁剪,任意使用以下兩條語句之一:
那麼以後在 hDC上繪製函數的話,只有 hRgn 指定的區域中的點纔會被繪畫,對裁剪區區域外的繪畫將會被忽略。同樣,Windows 會對選入DC的區域建立一個拷貝,如果以後不需要這個區域了,那麼在函數執行後,可以馬上用 DeleteObject函數將其刪除掉。
- 建立特殊窗口圖形:
-
-
使用路徑
-
創建路徑
-
路徑不是GDI對象,它並沒有一個句柄,WIndows對每個DC在內部保存一個路徑,每次新開始建立一個路徑,原有的路徑就會被破壞掉。如果要建立一個陸行,可以使用 BeginPath函數:
-
調用了這個函數以後,對 hDC 使用畫線函數所畫的線條都被會當做路徑記錄,使用畫線函數畫出來的線條可能是不連續的,比如多次調用的 LineTo函數,最後一點和開始一點不同,這時需要使用 CloseFigure 函數將路徑封閉起來:
CloseFigure 函數從 最後一點到第一個點畫一條直線把路徑封閉起來。Windows允許創建多個子路徑,封閉前面一條路徑以後,可以繼續“圈”出和前面路徑不相連的另一條路徑。 -
最後,使用 EndPath 函數結束創建路徑:
-
舉例:
如圖,示範了一次創建路徑的過程,在第1步調用BeginPath 和 第11步調用 EndPath之間,用 lineTo 函數和 Rectangle 畫出了包含兩個三角形和一個矩形區域,其中兩個三角形用 CloseFigure去封閉:
-
-
使用路徑:
創建了路徑以後,我們可以進行下面操作:
- 首先,對路徑進行畫線操作,或者對路徑圍起來的區域進行填充操作:
- 函數介紹:
- 第一個函數沿着路徑用當前畫筆描繪線條。
- 第二個函數使用當前畫刷填充路徑圍起來的區域。
- 第三個函數既使用當前畫筆繪畫邊線也使用當前畫刷填充中間區域。
- 說明:當執行了任何一個函數的時候,路徑都會被破壞掉。實際上,這些函數的功能就相當於 7.2.3節中的畫線和填充函數,那麼爲什麼要這樣大動干戈呢?唯一的好處就是用這種方法可以操作很複雜的形狀,因爲定義路徑時可以使用任何畫線函數,包括畫弧與畫貝塞爾曲線函數等,而用普通的填充函數是無法填充出一個由貝塞爾曲線圍成的區域的。
- 函數介紹:
- 路徑的另一個用途是定義一個複雜形狀的區域,可以使用下面的函數將路徑轉換爲區域:
這個可以用來定義形狀複雜的多的區域。同樣,執行了PathToRegion函數以後,原有的路徑定義就會被破壞掉。
- 首先,對路徑進行畫線操作,或者對路徑圍起來的區域進行填充操作:
-
win32 7.5 區域和路徑
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.