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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

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

理解圓弧繪制

GDI+中對(duì)于圓弧的繪制,是以給定的長(zhǎng)方形(System.Drawing.Rectangle結(jié)構(gòu))為邊界繪制的橢圓的一部分形成的圓弧。繪制的圓弧的中心為長(zhǎng)方形內(nèi)切橢圓的圓心(如果是正方形,則正方形的中心是內(nèi)切圓的圓心)

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

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

pen為畫筆對(duì)象。rect包含圓弧的長(zhǎng)方體結(jié)構(gòu)。startAngle圓弧繪制的開始角度。sweepAngle從startAngle角度到弧線的結(jié)束點(diǎn)沿順時(shí)針方向度量的角(以度為單位),即從startAngle開始繪制弧線轉(zhuǎn)動(dòng)的角度。

新建Winform項(xiàng)目GDIForArc,測(cè)試和演示弧形繪制的效果。

直接看下面的代碼,分別繪制矩形對(duì)應(yīng)的四個(gè)角的弧形(1/4圓),可以很直觀的看到圓弧的繪制及與長(zhǎng)方體的關(guān)系:

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);

}

從圓弧到繪制圓角長(zhǎng)方體

GDI+中繪圖系統(tǒng)中順時(shí)針方向?yàn)樾D(zhuǎn)正方向,水平向右方向?yàn)閤軸正方向,垂直向下為y軸正方向。

通過Rectangle結(jié)構(gòu)內(nèi)的四個(gè)圓弧,可以組合成四個(gè)圓角,從而可以進(jìn)一步實(shí)現(xiàn)圓角長(zhǎng)方體、圓形等圖形。

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

需要注意的點(diǎn):

線條連接時(shí)的1像素問題,很多時(shí)候會(huì)出現(xiàn)1像素的間隔,并沒有完全閉合連接,需要額外處理Pen.LineJoin指定線條連接點(diǎn)的模式

//繪制圓角矩形

pn.Color=Color.MediumVioletRed;

//指定連接處的連接點(diǎn)

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單獨(dú)繪制線條,需要處理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

如何實(shí)現(xiàn)等比縮放繪制圓角矩形

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

根據(jù)上面繪制矩形的思路,想著同樣實(shí)現(xiàn)一個(gè)按照等比縮放繪制內(nèi)部圓角矩形的方式。主要思路是,指定一個(gè)縮放比例,讓外部的矩形寬高、位置、圓角繪制的半徑、直徑等對(duì)應(yīng)等比縮放并計(jì)算其值。

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

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

////等比縮放,繪制內(nèi)層圓角矩形

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

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

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

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

通過Inflate()方法縮放矩形

溫馨提示

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

評(píng)論

0/150

提交評(píng)論