C#中GDI+繪制圓弧及圓角矩形等比縮放的繪制_第1頁
C#中GDI+繪制圓弧及圓角矩形等比縮放的繪制_第2頁
C#中GDI+繪制圓弧及圓角矩形等比縮放的繪制_第3頁
C#中GDI+繪制圓弧及圓角矩形等比縮放的繪制_第4頁
C#中GDI+繪制圓弧及圓角矩形等比縮放的繪制_第5頁
已閱讀5頁,還剩2頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第C#中GDI+繪制圓弧及圓角矩形等比縮放的繪制目錄理解圓弧繪制從圓弧到繪制圓角長方體如何實現等比縮放繪制圓角矩形按固定比例計算縮放矩形的嘗試(不推薦)通過Inflate()方法縮放矩形

理解圓弧繪制

GDI+中對于圓弧的繪制,是以給定的長方形(System.Drawing.Rectangle結構)為邊界繪制的橢圓的一部分形成的圓弧。繪制的圓弧的中心為長方形內切橢圓的圓心(如果是正方形,則正方形的中心是內切圓的圓心)

Graphics對象的DrawArc()方法用于繪制圓弧線段;GraphicsPath對象的AddArc()方法用于繪制圓弧路徑。

以DrawArc為例,參數為:DrawArc(System.Drawing.Penpen,System.Drawing.Rectanglerect,floatstartAngle,floatsweepAngle),繪制一段弧線,它表示Rectangle結構指定的橢圓的一部分。

pen為畫筆對象。rect包含圓弧的長方體結構。startAngle圓弧繪制的開始角度。sweepAngle從startAngle角度到弧線的結束點沿順時針方向度量的角(以度為單位),即從startAngle開始繪制弧線轉動的角度。

新建Winform項目GDIForArc,測試和演示弧形繪制的效果。

直接看下面的代碼,分別繪制矩形對應的四個角的弧形(1/4圓),可以很直觀的看到圓弧的繪制及與長方體的關系:

protectedoverridevoidOnPaint(PaintEventArgse)

Graphicsg=e.Graphics;

Penpn=newPen(Color.Blue,5);

Rectanglerect=newRectangle(50,50,150,150);

g.DrawRectangle(pn,rect);

Rectanglerect2=newRectangle(300,50,150,350);

g.DrawRectangle(pn,rect2);

//紅色0-90deg的圓弧

pn.Color=RedColor;

g.DrawArc(pn,rect,0,90);

g.DrawArc(pn,rect2,0,90);

//黑色90-180deg的圓弧

pn.Color=BalckColor;

g.DrawArc(pn,rect,90,90);

g.DrawArc(pn,rect2,90,90);

//綠色180-270deg的圓弧

pn.Color=GreenColor;

g.DrawArc(pn,rect,180,90);

g.DrawArc(pn,rect2,180,90);

//粉色270-360deg的圓弧

pn.Color=HotPink;

g.DrawArc(pn,rect,270,90);

g.DrawArc(pn,rect2,270,90);

}

從圓弧到繪制圓角長方體

GDI+中繪圖系統中順時針方向為旋轉正方向,水平向右方向為x軸正方向,垂直向下為y軸正方向。

通過Rectangle結構內的四個圓弧,可以組合成四個圓角,從而可以進一步實現圓角長方體、圓形等圖形。

如下,是使用這個方式繪制的圓角矩形。

需要注意的點:

線條連接時的1像素問題,很多時候會出現1像素的間隔,并沒有完全閉合連接,需要額外處理Pen.LineJoin指定線條連接點的模式

//繪制圓角矩形

pn.Color=Color.MediumVioletRed;

//指定連接處的連接點

pn.LineJoin=LineJoin.Round;

RectangleroundRect=newRectangle(500,50,150,80);

varradius=20;

varR=radius*2;

RectanglearcRect=newRectangle(roundRect.X,roundRect.Y,R,R);

//左上角

g.DrawArc(pn,arcRect,180,90);

//右上角

arcRect.X=roundRect.Right-R;

g.DrawArc(pn,arcRect,270,90);

//右下角

arcRect.Y=roundRect.Bottom-R;

g.DrawArc(pn,arcRect,0,90);

//左下角

arcRect.X=roundRect.Left;

g.DrawArc(pn,arcRect,90,90);

#region單獨繪制線條,需要處理1像素間隔問題,且連接處不平滑

g.DrawLine(pn,roundRect.X+radius,roundRect.Y,roundRect.Right-radius+1,roundRect.Y);

g.DrawLine(pn,roundRect.Right,roundRect.Y+radius,roundRect.Right,roundRect.Bottom-radius+1);

g.DrawLine(pn,roundRect.Right-radius+1,roundRect.Bottom,roundRect.Left+radius,roundRect.Bottom);

g.DrawLine(pn,roundRect.Left,roundRect.Bottom-radius+1,roundRect.Left,roundRect.Y+radius);

#endregion

如何實現等比縮放繪制圓角矩形

按固定比例計算縮放矩形的嘗試(不推薦)

根據上面繪制矩形的思路,想著同樣實現一個按照等比縮放繪制內部圓角矩形的方式。主要思路是,指定一個縮放比例,讓外部的矩形寬高、位置、圓角繪制的半徑、直徑等對應等比縮放并計算其值。

然后就是圓角矩形的繪制思路。

#region等比縮放的繪制圓角矩形

////等比縮放,繪制內層圓角矩形

varscale=0.8f;

varradiusScale=radius*scale;

varRScale=radiusScale*2;

varinnerRoundRect=newRectangleF(roundRect.X+(roundRect.Width-roundRect.Width*scale)/2,roundRect.Y+(roundRect.Height-roundRect.Height*scale)/2,roundRect.Width*scale,roundRect.Height*scale);

vararcRectScale=newRectangleF(innerRoundRect.X,innerRoundRect.Y,RScale,RScale);

//varscale=0.8f;

//varradiusScale=Convert.ToInt32(radius*scale);

//varRScale=radiusScale*2;

//varwidth=Convert.ToInt32(roundRect.Width*scale);

//varheight=Convert.ToInt32(roundRect.Height*scale);

//varinnerRoundRect=newRectangle(roundRect.X+(roundRect.Width-width)/2,roundRect.Y+(roundRect.Height-height)/2,width,height);

//vararcRectScale=newRectangle(innerRoundRect.X,innerRoundRect.Y,RScale,RScale);

pn.Color=Color.MediumPurple;

arcRectScale.X=innerRoundRect.X;

arcRectScale.Y=innerRoundRect.Y;

//左上角

g.DrawArc(pn,arcRectScale,180,90);

g.DrawLine(pn,innerRoundRect.X+radiusScale,innerRoundRect.Y,innerRoundRect.Right-radiusScale+1,innerRoundRect.Y);

//右上角

arcRectScale.X=innerRoundRect.Right-RScale;

g.DrawArc(pn,arcRectScale,270,90);

g.DrawLine(pn,innerRoundRect.Right,innerRoundRect.Y+radiusScale,innerRoundRect.Right,innerRoundRect.Bottom-radiusScale+1);

//右下角

arcRectScale.Y=innerRoundRect.Bottom-RScale;

g.DrawArc(pn,arcRectScale,0,90);

g.DrawLine(pn,innerRoundRect.Right-radiusScale+1,innerRoundRect.Bottom,innerRoundRect.Left+radiusScale,innerRoundRect.Bottom);

//左下角

arcRectScale.X=innerRoundRect.Left;

g.DrawArc(pn,arcRectScale,90,90);

g.DrawLine(pn,innerRoundRect.Left,innerRoundRect.Bottom-radiusScale+1,innerRoundRect.Left,innerRoundRect.Y+radiusScale);

#endregion

去掉外層圓角矩形的直線,效果如下:

直接計算比例的問題在于,由于矩形長寬大小的不同,計算出來內部(或外部)矩形的縮小或增大的量會不同,原則上,應該是長寬方向上縮小固定的量(類似邊框在長寬方向時,邊框的大小都是一樣的)。因此,最好取其中一個值。

縮小或增大的矩形的圓角半徑是否應該對應縮放?這是一直沒有很好處理的問題,如果縮小放大的變化不大,則沒有太大區別,如果比較大,圓角半徑最好保持不變(上例代碼為圓角半徑也跟著縮放的例子)

通過Inflate()方法縮放矩形

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論