Delphi GDI對象之剪切區域


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

運行該程序時,將會看到僅有一部分位圖顯示出來,如下圖:

image

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;
重新執行該程序,這時,位圖被限制在一個圓周區域內,如下圖:

image

 

我們再來試試其他類型的裁剪區。代碼如下:

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數組定義的點創建一個區域。

image

 

可使用所想要的點數,不必指定封閉點,因為區域自動將起點與終點連接起來,重新運行運行看看得到是什么圖形。如下定義:

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;

image

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM