win32 7.5 區域和路徑

  1. 前言:
    如果勇敢PhotoShop繪圖軟件,就一定記得它有“選擇區域”,以及“路徑”的概念,區域用來選定一個範圍,以便對指定的範圍進行某種操作;而路徑相當於用虛擬的線條進行 “圈地運動”,雖然路徑圈出來的看上去也是一個區域,但路徑記錄的是“圈地”用的線條而不是圈出來的地。

  2. 使用區域:

    1. 創建區域:

      1. GDI 中可以用下列區域建立函數來創建區域:
        在這裏插入圖片描述

        1. CreateRectRgn 函數的參數指定了 左上和右下兩個對角的座標。
        2. CreateEllipticRgn 的參數指定了一個矩形,產生的矩形區域是相切的。
        3. CreateRllipiticRgnIndrect 函數同樣建立橢圓區域,但指定與橢圓相切的矩形是由一個 RECT 結構定義的。
        4. CreatePolygonRgn 建立一個多邊形區域。lpPoint 指向了一系列的 POINT 結構, iCount 指定了點的數量,iPolyFillMode參數就是 SetPolyFillMode 函數使用的參數:ALTERNATE 或 WINDING,結果的不同之處相當於表 7.4中 Polygon 函數的兩種區別
      2. 如果創建區域成功的話,這些函數返回一個區域句柄 hRgn,區域和畫筆,畫刷等一樣的,都是GDI對象。如果不再使用一個區域,需要用 DeleteObject將它刪除。

    2. 合併區域

      1. 僅僅上面的函數可能用途不是很大,但是將不同形狀的區域按照各種方式合併在一起,用處就大了,可以因此定義出很複雜的區域。
      2. 要合併區域可以使用函數:
        在這裏插入圖片描述
        1. 該函數將 hScrRgn1 和 hSrcRgn2 兩個區域合併起來放入 hDestRgn 指定的區域句柄中,但 hDestRgn 並不是新生成的,它必須是一個已經存在的區域句柄,當函數執行後,hDestRgn中原來的區域會被破壞並替換成合並的區域,但可以對 hDestRgn 和 hSrcRgn1 使用同一個句柄,相當於把2合併到1進去。
        2. 合併的方式:dwCombine 指定了合併的方式,它可以是以下取值
          在這裏插入圖片描述
    3. 區域的用途:

      區域主要可以用在兩個地方:建立特殊形狀的窗口和對繪畫區域進行裁剪。

      1. 建立特殊窗口圖形:
        使用SetWindowRgn 函數可以使窗口的形狀由區域指定,如BmpClock 時鐘程序是橢圓形的,當把時鐘移動到其他窗口上面的時候,它的四角並不覆蓋住下層窗口,這就是因爲程序中有下面代碼:
        在這裏插入圖片描述
        1. SetWindowRgn 最後一個參數爲 TRUE,表示設置窗口形狀後 WIndows 要發送一個WM_PAINT 消息將窗口 重畫。
        2. 由於 Windows對使用的區域保存一個拷貝,所以程序在調用 SetWindowRgn 函數後就可以用 DeleteObject 刪掉,並不需要退出時再刪除掉。
      2. 另外,區域可以用來對繪畫區域進行裁剪,任意使用以下兩條語句之一:
        在這裏插入圖片描述
        那麼以後在 hDC上繪製函數的話,只有 hRgn 指定的區域中的點纔會被繪畫,對裁剪區區域外的繪畫將會被忽略。同樣,Windows 會對選入DC的區域建立一個拷貝,如果以後不需要這個區域了,那麼在函數執行後,可以馬上用 DeleteObject函數將其刪除掉。
  3. 使用路徑

    1. 創建路徑

      1. 路徑不是GDI對象,它並沒有一個句柄,WIndows對每個DC在內部保存一個路徑,每次新開始建立一個路徑,原有的路徑就會被破壞掉。如果要建立一個陸行,可以使用 BeginPath函數:
        在這裏插入圖片描述

      2. 調用了這個函數以後,對 hDC 使用畫線函數所畫的線條都被會當做路徑記錄,使用畫線函數畫出來的線條可能是不連續的,比如多次調用的 LineTo函數,最後一點和開始一點不同,這時需要使用 CloseFigure 函數將路徑封閉起來:
        在這裏插入圖片描述
        CloseFigure 函數從 最後一點到第一個點畫一條直線把路徑封閉起來。Windows允許創建多個子路徑,封閉前面一條路徑以後,可以繼續“圈”出和前面路徑不相連的另一條路徑。

      3. 最後,使用 EndPath 函數結束創建路徑:
        在這裏插入圖片描述

      4. 舉例:

        如圖,示範了一次創建路徑的過程,在第1步調用BeginPath 和 第11步調用 EndPath之間,用 lineTo 函數和 Rectangle 畫出了包含兩個三角形和一個矩形區域,其中兩個三角形用 CloseFigure去封閉:
        在這裏插入圖片描述

    2. 使用路徑:

      創建了路徑以後,我們可以進行下面操作:

      1. 首先,對路徑進行畫線操作,或者對路徑圍起來的區域進行填充操作:
        在這裏插入圖片描述
        1. 函數介紹:
          1. 第一個函數沿着路徑用當前畫筆描繪線條。
          2. 第二個函數使用當前畫刷填充路徑圍起來的區域。
          3. 第三個函數既使用當前畫筆繪畫邊線也使用當前畫刷填充中間區域。
        2. 說明:當執行了任何一個函數的時候,路徑都會被破壞掉。實際上,這些函數的功能就相當於 7.2.3節中的畫線和填充函數,那麼爲什麼要這樣大動干戈呢?唯一的好處就是用這種方法可以操作很複雜的形狀,因爲定義路徑時可以使用任何畫線函數,包括畫弧與畫貝塞爾曲線函數等,而用普通的填充函數是無法填充出一個由貝塞爾曲線圍成的區域的。
      2. 路徑的另一個用途是定義一個複雜形狀的區域,可以使用下面的函數將路徑轉換爲區域:
        在這裏插入圖片描述
        這個可以用來定義形狀複雜的多的區域。同樣,執行了PathToRegion函數以後,原有的路徑定義就會被破壞掉。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章