剪切區域(Clipping Regions)
Regions是屏幕的一部分,它可用於控制繪圖的那部分畫布。TCanvas類具有ClipRect屬性,但這個屬性只是只讀的,要改變裁減區,必須使用Windows API,仍以前面的例子為例,並加以修改來說明裁剪區是如何工作的,下面是代碼:
var Bitmap: TBitmap; Rgn: HRGN; { long型} begin ClearCanvas; { 清除當前畫布的內容} Bitmap := TBitmap.Create; Bitmap.LoadFromFile('handshak.bmp'); Rgn := CreateRectRgn(50, 50, 250, 250); SelectClipRgn(Canvas.Handle, Rgn); Canvas.Draw(0, 0, Bitmap); Bitmap.Free; end;
運行該程序時,將會看到僅有一部分位圖顯示出來,如下圖:
SelectClipRgn函數設置畫布的裁剪區為由坐標(50, 50, 250, 250)確定的矩形。位圖仍然被繪制在它以前的位置上,但是現在僅有一部分位圖(由裁剪區所定義的)可見,在裁剪區之外的部分都被略去。
裁剪區不一定是規則的,仍以前面的例子為例並將它更加有缺,刪除創建規則區域的CreateRectRgn函數,用下面的代碼代替:
var Bitmap: TBitmap; Rgn: HRGN; { long型} begin ClearCanvas; { 清除當前畫布的內容} Bitmap := TBitmap.Create; Bitmap.LoadFromFile('handshak.bmp'); Rgn := CreateEllipticRgn(30, 30, 250, 250); { 圓形區域} SelectClipRgn(Canvas.Handle, Rgn); Canvas.Draw(0, 0, Bitmap); Bitmap.Free; end;重新執行該程序,這時,位圖被限制在一個圓周區域內,如下圖:
我們再來試試其他類型的裁剪區。代碼如下:
const Points: array[0..3] of TPoint = ((X:160; Y:0), (X:0; Y:160), (X:160; Y:320), (X:320; Y:160)); var Bitmap: TBitmap; Rgn: HRGN; { long型} begin ClearCanvas; { 清除當前畫布的內容} Bitmap := TBitmap.Create; Bitmap.LoadFromFile('handshak.bmp'); Rgn := CreatePolygonRgn(Points, 4, ALTERNATE); { 菱形區域} SelectClipRgn(Canvas.Handle, Rgn); Canvas.Draw(0, 0, Bitmap); Bitmap.Free; end;這次使用的菱形區域。程序中Points數組定義創建該菱形區域的點,CreatePolygonRgn函數根據Points數組定義的點創建一個區域。
可使用所想要的點數,不必指定封閉點,因為區域自動將起點與終點連接起來,重新運行運行看看得到是什么圖形。如下定義:
const Points: array[0..11] of TPoint = ((X:0; Y:0), (X:120; Y:0), (X:120; Y:60), (X:180; Y:60), (X:180; Y:120), (X:120; Y:120), (X:120; Y:180), (X:0; Y:180), (X:0; Y:120), (X:60; Y:120), (X:60; Y:60), (X:0; Y:60)); var Bitmap: TBitmap; Rgn: HRGN; { long型} begin ClearCanvas; { 清除當前畫布的內容} Bitmap := TBitmap.Create; Bitmap.LoadFromFile('handshak.bmp'); Rgn := CreatePolygonRgn(Points, 12, ALTERNATE); { 菱形區域} SelectClipRgn(Canvas.Handle, Rgn); Canvas.Draw(0, 0, Bitmap); Bitmap.Free; end;
Note
這個程序也顯示出如何初始化一組const記錄。其程序代碼如下:
const Points: array[0..3] of TPoint = ((X:160; Y:0), (X:0; Y:160), (X:160; Y:320), (X:320; Y:160));TPoint有兩個字段:X和Y。注意列出字段名,后跟冒號和賦給該字段的值(例如: X:80),也請注意X和Y字段均被賦值且被括號括住,這里出現了四組,因為該Points數組有4個元素。這時定義和初始化一組const記錄的唯一方法。
處理一些繪圖操作時裁剪區可能非常有用,用戶可能不需要經常使用裁剪區,但是當需要使用時裁剪區便是非常有價值的。
以上代碼均在Delphi7中測試通過,示例代碼下載:GDI之位圖與調色板.rar