bsp;= Color.White; Font myFont = new Font("Arial", 10); this.DrawChart(g, r, myBackColor, myForeColor, myFont, chartData); return newBitmap; } public void DrawChart(Graphics g, Rectangle r, Color backColor, Color foreColor, Font baseFont, ChartData chartData) { this.chartData = chartData; this.g = g; this.r = r; this.backColor = backColor; this.foreColor = foreColor; this.baseFont = baseFont; this.legendFont = new Font(baseFont.FontFamily, (baseFont.Size * 2/3), baseFont.Style | FontStyle.Bold); g.SmoothingMode = SmoothingMode.AntiAlias; CalculateChartDimensions(); DrawBackground(); InternalDrawChart() ; }
private void CalculateChartDimensions() { right = r.Width - 5; top = 5 * baseFont.Size ; bottom = r.Height - baseFont.Size * 2; tickCount = chartData.YMin ; yCount = (chartData.YMax-chartData.YMin) / chartData.YTickSize ; hspacing = (bottom-top) / yCount; vspacing = (right) / chartData.XAxisTitles.Length; //Left depends on width of text - for simplicities sake assume that largest yvalue is the biggest //Take into account the first X Axis title float maxYTextSize = g.MeasureString(chartData.YMax.ToString(), baseFont).Width; float firstXTitle = g.MeasureString(chartData.XAxisTitles[0], baseFont).Width; left = (maxYTextSize > firstXTitle) ? maxYTextSize : firstXTitle ; left = r.X + left + 5 ; //Calculate size of legend box float maxLegendWidth = 0 ; float maxLegendHeight = 0 ; //Work out size of biggest legend foreach (ChartLine cl in chartData.Lines) { float currentWidth = g.MeasureString(cl.Title, legendFont).Width; float currentHeight = g.MeasureString(cl.Title, legendFont).Height; maxLegendWidth = (maxLegendWidth > currentWidth) ? maxLegendWidth : currentWidth ; maxLegendHeight = (maxLegendHeight > currentHeight) ? maxLegendHeight : currentHeight ; } legendRect = new RectangleF(r.X+2, r.Y+2, maxLegendWidth + 25 + 5, ((maxLegendHeight+2)*chartData.Lines.Count) + 3) ; } private void DrawBackground() { LinearGradientBrush b = new LinearGradientBrush(r, Color.SteelBlue, backColor,LinearGradientMode.Horizontal); g.FillRectangle(b, r); b.Dispose(); } private void InternalDrawChart() { DrawGrid() ; foreach (ChartLine cl in chartData.Lines) { DrawLine(cl); } DrawLegend() ; //Draw time on chart string timeString = "Generated:" + DateTime.Now.ToLongTimeString() ; SizeF textsize = g.MeasureString(timeString,baseFont); g.DrawString(timeString, baseFont, new SolidBrush(foreColor), r.Width - textsize.Width - 5, textsize.Height * 2 / 3) ; } private void DrawGrid() { Pen gridPen = new Pen(chartData.GridColor) ;
//Vertical - include tick desc''''s if (chartData.ShowVGridLines) { for (int i = 0 ; (vspacing * i) < right; i++) { float x = left + (vspacing *i); string desc = chartData.XAxisTitles[i]; g.DrawLine(gridPen, x,top,x,bottom +(baseFont.Size*1/3)); SizeF textsize = g.MeasureString(desc,baseFont); g.DrawString(desc, baseFont, new SolidBrush(chartData.GridColor), x-(textsize.Width/2), bottom + (baseFont.Size*2/3)) ;  上一页 [1] [2] [3] [4] [5] 下一页 |