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+的"返回每個類的引用有關",但這只是猜,為了好玩,你可以辦其他的東西加到這個路徑上——這會很有趣的。
注:本作者熟悉C++/MFC,熟悉GDI/GDI+,英文文檔翻譯,接做文檔翻譯,小型系統開發,技術難題突破等,Email:[email protected],電話:13679278016
本文配套源碼