程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> GDI+中的圓角矩形

GDI+中的圓角矩形

編輯:關於VC++

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

本文配套源碼

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved