《Windows程序設計》讀書筆記------------->>矩形、區域和剪裁

本節內容介紹了有關矩形和對這個矩形的一系列操作。

一個矩形其實就是一個RECT的結構 

typedef struct _RECT 
  LONG left; 
  LONG top; 
  LONG right; 
  LONG bottom; 
}
 RECT, *PRECT; 

這個結構就包含如下圖所示的1,2點的x和y座標:

一般情況下通過這個代碼所示範的方式進行設定:

rect.left          = xLeft ;        
rect.top           
= xTop ;
rect.right         
= xRight ;
rect.bottom        
= xBottom ;

不過呢,這樣很麻煩,下面一些函數有助於使用這個結構:

/*
SetRect函數用於設定矩形的座標,這個函數會要求左上和右下的座標以填充RECT結構。
*/

BOOL SetRect(
  LPRECT lprc, 
// rectangle
  int xLeft,   // left side
  int yTop,    // top side
  int xRight,  // right side
  int yBottom  // bottom side
);

---------------------------------------------------------------其他的函數------------------------------------------------------------------

/*
將矩形沿x軸和y軸移動幾個單元
*/
BOOL OffsetRect(
  LPRECT lprc,  
// rectangle
  int dx,       // horizontal offset
  int dy        // vertical offset
);

 

/*
InflateRect函數用於增加或減小矩形的高度或者寬度。其中dx會增加左右方向的大小,dy會增加上下方向的大小,而且dx和dy會受到符號的限制,如果他們爲負,那麼將會減小這個矩形。
*/
BOOL InflateRect(
  LPRECT lprc,  
// rectangle
  int dx,       // amount to adjust width
  int dy        // amount to adjust height
);

 

/*
SetRectEmpty函數用於將任何的矩形的座標大小設置爲0
*/
BOOL SetRectEmpty(
  LPRECT lprc   
// rectangle
);

 

/*
CopyRect函數用於將一個矩形複製到另外一個
*/
BOOL CopyRect(
  LPRECT lprcDst,      
// destination rectangle
  CONST RECT* lprcSrc  // source rectangle
);

 這個也可以簡單的通過DestRect = SrcRect ;來簡單的實現

/*
取得兩個矩形的交集
*/
BOOL IntersectRect(
  LPRECT lprcDst,        
// intersection buffer
  CONST RECT *lprcSrc1,  // first rectangle
  CONST RECT *lprcSrc2   // second rectangle
);

 

/*
取得兩個矩形的聯集,一個聯集就是一個包含了兩個矩形的最小矩形。
*/
BOOL UnionRect(
  LPRECT lprcDst,        
// destination rectangle
  CONST RECT *lprcSrc1,  // first rectangle
  CONST RECT *lprcSrc2   // second rectangle
);

 

/*
IsRectEmpty函數用於判斷矩形是否爲空,一個空的矩形就是不包含任何內容的矩形。也就是說,矩形的左邊比右邊大,或者上邊比下邊大。
*/

BOOL IsRectEmpty(
  CONST RECT 
*lprc   // rectangle
);

 

/*
PtInRect函數用於判斷點是否在一個矩形裏面,注意,如果一個點在矩形的左邊或者上邊上,那麼點就在矩形中,而如果在下邊或者右邊就認爲不在矩形裏面。
*/
BOOL PtInRect(
  CONST RECT 
*lprc,  // rectangle
  POINT pt           // point
);

 


 

然後就是教你怎麼使用PeekMessage函數拉。不過好久沒有動手了。。。錯另一個很白喫地方,建議認真看看書,都很重要!那個畫真的很快。。。。亂七八糟的看得,因爲沒有辦法解圖了,自己運行一下看吧。

http://dl2.csdn.net/down4/20070724/24231357954.rar

 


 

下面就是裁減區域的介紹,裁減區域我的理解就是像PS裏面那個選區,你可以對選區進行操作。選區保存HRGN這個句柄中。在與畫筆、畫刷和位圖一樣,剪裁區域是GDI對象,您應該呼叫DeleteObject來刪除您所建立的剪裁區域。這部分內容可以參照ms-help://MS.MSDNQTR.2003FEB.2052/gdi/regions_7ab7.htm

最簡單的剪裁區域是矩形,有兩種建立矩形的方法:

hRgn = CreateRectRgn (xLeft, yTop, xRight, yBottom) ;

或者

hRgn = CreateRectRgnIndirect (&rect) ;

您也可以建立橢圓剪裁區域:

hRgn = CreateEllipticRgn (xLeft, yTop, xRight, yBottom) ;

或者

hRgn = CreateEllipticRgnIndirect (&rect) ;

CreateRoundRectRgn建立圓角的矩形剪裁區域。

建立多邊形剪裁區域的函數類似於Polygon函數:

hRgn = CreatePolygonRgn (&point, iCount, iPolyFillMode) ;
操作兩個剪裁:
iRgnType = CombineRgn (hDestRgn, hSrcRgn1, hSrcRgn2, iCombine) ;
你可以通過設定iCombine來設定怎麼操作:

iCombine值

新剪裁區域

RGN_AND

兩個剪裁區域的公共部分

RGN_OR

兩個剪裁區域的全部

RGN_XOR

兩個剪裁區域的全部除去公共部分

RGN_DIFF

hSrcRgn1不在hSrcRgn2中的部分

RGN_COPY

hSrcRgn1的全部(忽略hSrcRgn2)

 從CombineRgn傳回的iRgnType值是下列之一:NULLREGION,表示得到一個空剪裁區域;SIMPLEREGION,
表示得到一個簡單的矩形、橢圓或者多邊形;COMPLEXREGION,表示多個矩形、橢圓或多邊形的組合;ERROR,
表示出錯了。
 

在您用完一個區域後,可以像刪除其它GDI對象那樣刪除它:

DeleteObject (hRgn) ;
 
嗯,你和我一樣,發現這個似乎沒有什麼用。。。其實,我發現矩形比裁減還要沒有用,裁減的(書商告訴了我的)唯一用處就是:
可以設定可以被繪畫的區域,通過將剪裁選入設備內容句柄,就可以限制畫畫的範圍了。函數是這個樣子的:
SelectObject (hdc, hRgn) ;
後面是一個例子,有時間就動動手吧~~
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章