GDI+中的圓角矩形

原文出處:http://www.codeproject.com
源代碼:GDIPlusRoundedRect

  GDI+是對GDI的一個令人興奮的擴展,但由於某些原因,它沒有提供繪製圓角矩形的函數,雖然我們可以在GDI+中使用GDI中的函數,但這樣一來我們沒辦法在圓角矩形中使用GDI+中的紋理和透明色等新特性。怎麼辦?GDI+中有一個GraphicsPath 的類,我們可以用它構造各種形狀並且可用任何畫刷來填充這些形狀。本源碼中提供了一個可以加到任何工程中的函數,並用它來繪製了一個圓角矩形,矩形的遠郊程度可以通過一個滑動條來設置,函數如下:

GraphicsPath* MakeRoundRect(Point topLeft, Point bottomRight, INT percentageRounded)
{
	ASSERT (percentageRounded >= 1 && percentageRounded <= 100);

	INT left  = min(topLeft.X, bottomRight.X);
	INT right = max(topLeft.X, bottomRight.X);

	INT top    = min(topLeft.Y, bottomRight.Y);
	INT bottom = max(topLeft.Y, bottomRight.Y);

	INT offsetX = (right-left)*percentageRounded/100;  
	INT offsetY = (bottom-top)*percentageRounded/100;

	GraphicsPath pt;
	GraphicsPath * path = pt.Clone();

	path->AddArc(right-offsetX, top, offsetX, offsetY, 270, 90);
	path->AddArc(right-offsetX, bottom-offsetY, offsetX, offsetY, 0, 90);
	path->AddArc(left, bottom - offsetY, offsetX, offsetY, 90, 90);
	path->AddArc(left, top, offsetX, offsetY, 180, 90);
	path->AddLine(left + offsetX, top, right - offsetX/2, top);
	return path;
}
  一點有趣的東西需要在這裏說明,我一開始是用new來創建GaphicsPath對象的,但由於GDI+用了一些巧妙的方法阻止用new來創建GaphicsPath對象(試一試),我創建了一個局部的GaphicsPath變量,用它的Clone方法來生成GaphicsPath對象,我對此很困惑,爲了和GDI+中的其他的類一致,你通過指針創建GDI+對象時最好用GDI+中的方法代替new,我猜這樣做是用因爲其他的.NET語言沒有指針的緣故。
  這就是我要對這段代碼所要說的話,這段代碼有一個設計缺限——在函數中創建了一個對象,並由調用者來刪除,GDI+不允許我們返回一個路徑對象,只能用指針,我猜這與GDI+的"返回每個類的引用有關",但這只是猜,爲了好玩,你可以辦其他的東西加到這個路徑上——這會很有趣的。 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章