剪切區域(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




