C# 数据库系统中使用GDI+绘制柱状图
在C#+SQL Server數(shù)據(jù)庫(kù)做系統(tǒng)中,通常需要對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行繪制圖形報(bào)表方便經(jīng)理查看,雖然有很多實(shí)用的水晶報(bào)表控件和圖表控件實(shí)現(xiàn)該功能,但我還是想講講如何使用GDI繪制簡(jiǎn)單的柱狀圖.(推薦大家不要手畫(huà),盡量使用已有控件函數(shù)繪制)
一.前言
我們?cè)谑褂肅#+SQL Server做的簡(jiǎn)單應(yīng)用系統(tǒng)是一個(gè)手機(jī)銷(xiāo)售的系統(tǒng),所以它有不同手機(jī)品牌和不同年份銷(xiāo)售手機(jī)的利潤(rùn)和數(shù)量的柱狀圖,方便公司經(jīng)理查看那個(gè)月和那種品牌手機(jī)銷(xiāo)售更好,方便進(jìn)貨增加企業(yè)利潤(rùn).其中它點(diǎn)擊"輸入年份",查看"2013"年的銷(xiāo)售柱狀圖數(shù)據(jù)如下所示:(其實(shí)效果還行)
二.繪制坐標(biāo)
下面就首先講述如何使用GDI+繪制簡(jiǎn)單的柱狀圖,首先上面圖中我定義為是靜態(tài)柱狀圖,因?yàn)樗黊(橫坐標(biāo))只有12個(gè)月份的數(shù)據(jù),不會(huì)改變,而后面講解的我定義的動(dòng)態(tài)柱狀圖會(huì)根據(jù)手機(jī)品牌動(dòng)態(tài)更新數(shù)據(jù)的,后面將介紹.
首先第一步需要繪制坐標(biāo),創(chuàng)建一個(gè)"C# Windows窗體應(yīng)用程序",添加一個(gè)簡(jiǎn)單的button.然后雙擊button,進(jìn)入button1_Click(object sender, EventArgs e)事件.添加如下代碼.
在private void button1_Click(object sender, EventArgs e)事件中增加"CreateTable();"代碼即可點(diǎn)按鈕時(shí)擊創(chuàng)建坐標(biāo),如圖:
它具體的坐標(biāo)如下圖所示,其中Rectangle(120, 20, 380, 300)對(duì)應(yīng)Rectangle(int x, int y, int width, int height)表示一個(gè)矩形對(duì)用起始位置和長(zhǎng)寬;使用graphic.DrawRectangle是繪制一個(gè)空心的矩形,而graphic.FillRectangle(畫(huà)刷,矩形)對(duì)矩形進(jìn)行填充.使用graphic.DrawLine(Pen,Point1,Point2)表示畫(huà)筆,起始坐標(biāo)xy,終止坐標(biāo)xy,是繪制直線,其中在繪制箭頭需要注意它的相應(yīng)坐標(biāo).其實(shí)在草稿紙上設(shè)計(jì)好在繪制,感覺(jué)還是很方便的.
注意:在C#中l(wèi)oad事件中是不能畫(huà)圖的,因?yàn)閃indows的GDI必須在擁有屏幕資源的時(shí)候才能有效,FormLoad時(shí)窗體還沒(méi)有繪圖資源,所以不能畫(huà)出.在窗體創(chuàng)建完成后如果再調(diào)用FormLoad時(shí)間就可以繪制圖形.所以我是在點(diǎn)擊按鈕時(shí)創(chuàng)建坐標(biāo).
三.靜態(tài)的柱狀圖
?下面是繪制靜態(tài)的柱狀圖,它的運(yùn)行效果如下圖所示,繪制了12個(gè)等高的柱狀圖:
它的源代碼如下,通過(guò)調(diào)用DrawTable()繪制靜態(tài)的圖形.為什么我定義它為靜態(tài)的后面將介紹:
//定義變量 Brush Bbrush = Brushes.Blue; //創(chuàng)建藍(lán)色畫(huà)刷 文字 Font myFont = new Font("黑體", 12); //創(chuàng)建字體 Font tFont = new Font("宋體", 8); //創(chuàng)建字體 顯示在直方圖上的數(shù)量 SolidBrush Wfill = new SolidBrush(Color.White); //定義單色畫(huà)刷用于填充圖形 //該函數(shù)用于繪制靜態(tài)報(bào)表 private void DrawTable() { //輸出文字graphic.DrawString("月份", myFont, Bbrush, new RectangleF(115, 280, 40, 40));graphic.DrawString("月份銷(xiāo)售數(shù)量", myFont, Bbrush, new RectangleF(260, 40, 200, 40));//繪制月份 12個(gè)for (int i = 1; i <= 12; i++){graphic.DrawString(i.ToString(), myFont, Bbrush, 155 + (i-1) * 26, 300); }//定義繪制柱狀圖坐標(biāo)|寬|高int x, y, width, heigh;x = 160; //X坐標(biāo)定值=160 Y軸的x坐標(biāo)為150width = 13; //width坐標(biāo)=(470-150)/(12*2)=13heigh = 200; //X軸y坐標(biāo)=300 heigh=200y = 100; //Y坐標(biāo) y=300-200 for (int i = 0; i < 12; i++){//填充圖形Rectangle rect = new Rectangle(x+i*26, y, width, heigh); graphic.FillRectangle(Wfill, rect); //顯示數(shù)量graphic.DrawString("100", tFont, Brushes.Yellow, x + i * 26, y - 15);} }這里的有幾個(gè)地方需要注意,其中26=(470-150)/12表示把X軸分成12個(gè)等分,其中每個(gè)等分寬為26,再在每個(gè)等分繪制一半13的白色矩形.如下圖:
?
四.動(dòng)態(tài)的柱狀圖
如果動(dòng)態(tài)顯示的柱狀圖,就是獲取數(shù)據(jù)庫(kù)中具體的數(shù)量,在進(jìn)行繪制圖形的基本過(guò)程為定義:int num[12]分別記錄12個(gè)月份中的銷(xiāo)售數(shù)量,在sumNum+=num[i];計(jì)算12個(gè)月總的銷(xiāo)售數(shù)量,通過(guò)百分比計(jì)算具體的每個(gè)月的高度,這樣的好處在于當(dāng)其中一個(gè)月的銷(xiāo)售數(shù)量很大時(shí),會(huì)出現(xiàn)那個(gè)矩形很高,超出界面范圍.
num[i]/sumNum=具體高度/總高度(其中總高度我們?cè)谏厦嬖O(shè)置為heigh=200)
同樣,如果在做品牌銷(xiāo)售業(yè)績(jī)時(shí),如下圖所示:
這是銷(xiāo)售3中品牌手機(jī)"諾基亞"、"三星"、"蘋(píng)果"的情況,如果想增加一個(gè)新的品牌"HTC"時(shí),這是就會(huì)顯示4條柱狀圖,因此也需要?jiǎng)討B(tài)的生成.我們已經(jīng)求出了它的總寬度為(470-150)=320,再通過(guò)320/具體的品牌數(shù)量,即可平均分配每個(gè)品牌的數(shù)量,再求出具體的坐標(biāo)即可.
分享文章:http://www.cnblogs.com/stg609/archive/2008/03/30/1129221.html
最后補(bǔ)充下獲取數(shù)據(jù)庫(kù)品牌的代碼:
總結(jié):回想起來(lái)使用GDI+繪制柱狀圖,確實(shí)很蛋疼,也就沒(méi)繼續(xù)貼上代碼了有具體的控件卻不用,但我還是希望該文章對(duì)那些不知道在做使用C#做系統(tǒng)中如何生成柱狀圖報(bào)表的有幫助(盡量使用已有的控件).
如果知道如何使用Dundas Chart for .NET\ReportViewer\FormCrystal等制作報(bào)表的就當(dāng)該文章簡(jiǎn)單幫助你回顧一些GDI+的知識(shí)吧!如果文章中有錯(cuò)誤或不足的地方,見(jiàn)諒!
(BY:Eastmount 2013-9-14 夜1點(diǎn)http://blog.csdn.net/eastmount/)
總結(jié)
以上是生活随笔為你收集整理的C# 数据库系统中使用GDI+绘制柱状图的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C# 数据库存储过程的讲解应用
- 下一篇: C# 基础知识 (三).主子对话框数值传