关于使用GDI+的绘图问题
我给你一个函数,是使用纯GDI+画出的曲线表格,应该能解决你的画图问题
//»æÖƱí¸ñ£¨ÕÛÏßͼ£©
public virtual void DrawChart(System.Data.DataSet ds,string strName,ref System.IO.MemoryStream objIMG)
{
System.Drawing.Bitmap objBitbmp = new Bitmap(iIMGWith,iIMGHight);
System.IO.MemoryStream objIMGstream = new MemoryStream();
try
{
System.Drawing.Graphics MyGraphic = Graphics.FromImage(objBitbmp);
System.Drawing.Pen myPen = new Pen(new SolidBrush(Color.Blue));
System.Drawing.Pen BackPen = new Pen(new SolidBrush(Color.Black),2);
System.Drawing.Pen FloatPen = new Pen(new SolidBrush(Color.Red),1);
//¶¨Òå»­±ÊΪÐéÏß
float[] myfloat = {3,3};
FloatPen.DashPattern = myfloat;
System.Drawing.Point Xpoint = new Point(0,0);
System.Drawing.Point Ypoint = new Point(0,0);
string strColName; //»æÖƱ³¾°Í¸Ã÷
MyGraphic.FillRectangle(new SolidBrush(Color.FromArgb(255,Color.Yellow)),0,0,300,200); //µÃµ½Êý¾ÝÓжàÉÙÁÐ
int iCount = ds.Tables[strName].Columns.Count;
int iMaxValue = 0;
int i,iTemp;
string iTempNum;
int ix = 20;
int iy = iIMGHight - 20;
Point[] objPoint = new Point[iCount]; //³õʼ»¯×ø±êϵ
PointF XpointS = new PointF(ix,iy);
PointF XpointE = new PointF(ix,20);
PointF YpointS = new PointF(ix,iy);
PointF YpointE = new PointF(iIMGWith - ix,iy);
if (ds.Tables[strName].Rows.Count < 1)
{
throw new Exception("ÄúµÄÊý¾Ý¼¯²»´æÔÚ¡£");
}
//²éÕÒ×î´óµÄÊý¾Ý
for(i = 0;i<=iCount - 1;i++)
{
iTempNum = ds.Tables[strName].Rows[0][i].ToString();
if(iMaxValue <= Convert.ToInt32(iTempNum))
{
iMaxValue = Convert.ToInt32(iTempNum);
}
}
//¿ªÊ¼±éÀúÊý¾ÝµãÕó,½«ÕÛÏߵĵãÕó»æÖƵ½Í¼ÏñÖÐ
for(i = 0;i<=iCount - 1;i++)
{
//¼ÆË㽫Êý¾Ý»æÖƵ½Í¼Æ¬ÖеıÈÀý
iTemp = (int)ds.Tables[strName].Rows[0][i];
iy = (int)(((float)iTemp/(float)iMaxValue) * 160);
if(iy == 0)
{
iy = 20;
}
objPoint[i].X = ix;
objPoint[i].Y = iIMGHight - 20 - iy;
ix = ix + 50; //»æÖÆÐéÏߣ¬±êÃ÷×ø±ê
Xpoint.X = objPoint[i].X;
Xpoint.Y = iIMGHight - 20;
MyGraphic.DrawLine(FloatPen,objPoint[i],Xpoint);
Ypoint.X = 20;
Ypoint.Y = objPoint[i].Y;
MyGraphic.DrawLine(FloatPen,objPoint[i],Ypoint);
MyGraphic.DrawString(ds.Tables[strName].Rows[0][i].ToString(),new Font("ËÎÌå",7),new SolidBrush(Color.Black),2,Ypoint.Y);
//µÃµ½ÁÐÃû
strColName = ds.Tables[strName].Columns[i].ColumnName;
strColName = strColName.Substring(strColName.Length - 5,5);
MyGraphic.DrawString(strColName,new Font("ËÎÌå",7),new SolidBrush(Color.Black),Xpoint.X,Xpoint.Y); }
//»æÖÆÇúÏߣ¬x,yÖáµÄÏ߶Î
MyGraphic.DrawLine(BackPen,XpointS,XpointE);
MyGraphic.DrawLine(BackPen,YpointS,YpointE);
MyGraphic.DrawLine(BackPen,XpointE.X-4,XpointE.Y,XpointE.X,XpointE.Y-8); //»æÖƼýÍ·
MyGraphic.DrawLine(BackPen,XpointE.X+4,XpointE.Y,XpointE.X,XpointE.Y-8); //»æÖƼýÍ·
MyGraphic.DrawLine(BackPen,XpointE.X-4,XpointE.Y,XpointE.X+4,XpointE.Y); //»æÖƼýÍ·
MyGraphic.DrawString(strXDesc,new Font("ËÎÌå",7),new SolidBrush(Color.Red),XpointE.X,0); //»æÖÆ×ø±êÎÄ×Ö
MyGraphic.DrawLine(BackPen,YpointE.X,YpointE.Y-4,YpointE.X+8,YpointE.Y); //»æÖƼýÍ·
MyGraphic.DrawLine(BackPen,YpointE.X,YpointE.Y+4,YpointE.X+8,YpointE.Y); //»æÖƼýÍ·
MyGraphic.DrawLine(BackPen,YpointE.X,YpointE.Y-4,YpointE.X,YpointE.Y+4); //»æÖƼýÍ·
MyGraphic.DrawString(strYDesc,new Font("ËÎÌå",7),new SolidBrush(Color.Red),YpointE.X,YpointE.Y); //»æÖÆ×ø±êÎÄ×Ö //»æÖÆÇúÏß
if(objPoint.Length > 1)
{
MyGraphic.DrawLines(myPen,objPoint);
}
else
{
}
objBitbmp.Save(objIMGstream,ImageFormat.Gif);
objIMGstream.Position = 0;
objIMG = objIMGstream;
}
catch(System.Exception ex)
{
strError = ex.Message.ToString();
objIMG = objIMGstream;
}
finally
{
objBitbmp.Dispose();
}
}关于在图形上判断焦点的动作,我是这样坐的。
当你画图的时候会有一个point[]数组。把这个数组保存下来,在MouseDown事件中判断是否鼠标属于这个point,然后比较是否存在于point[],如果存在,在图层上绘制一个正方形的小实体块。标明位置。
至于上下文菜单,你可以定义指定的点弹出指定右键菜单。
我就是用这种方法写了一个公共类,现在使用的还不错。
我给你一个函数,是使用纯GDI+画出的曲线表格,应该能解决你的画图问题
//»æÖƱí¸ñ£¨ÕÛÏßͼ£©
public virtual void DrawChart(System.Data.DataSet ds,string strName,ref System.IO.MemoryStream objIMG)
{
System.Drawing.Bitmap objBitbmp = new Bitmap(iIMGWith,iIMGHight);
System.IO.MemoryStream objIMGstream = new MemoryStream();
try
{
System.Drawing.Graphics MyGraphic = Graphics.FromImage(objBitbmp);
System.Drawing.Pen myPen = new Pen(new SolidBrush(Color.Blue));
System.Drawing.Pen BackPen = new Pen(new SolidBrush(Color.Black),2);
System.Drawing.Pen FloatPen = new Pen(new SolidBrush(Color.Red),1);
//¶¨Òå»­±ÊΪÐéÏß
float[] myfloat = {3,3};
FloatPen.DashPattern = myfloat;
System.Drawing.Point Xpoint = new Point(0,0);
System.Drawing.Point Ypoint = new Point(0,0);
string strColName; //»æÖƱ³¾°Í¸Ã÷
MyGraphic.FillRectangle(new SolidBrush(Color.FromArgb(255,Color.Yellow)),0,0,300,200); //µÃµ½Êý¾ÝÓжàÉÙÁÐ
int iCount = ds.Tables[strName].Columns.Count;
int iMaxValue = 0;
int i,iTemp;
string iTempNum;
int ix = 20;
int iy = iIMGHight - 20;
Point[] objPoint = new Point[iCount]; //³õʼ»¯×ø±êϵ
PointF XpointS = new PointF(ix,iy);
PointF XpointE = new PointF(ix,20);
PointF YpointS = new PointF(ix,iy);
PointF YpointE = new PointF(iIMGWith - ix,iy);
if (ds.Tables[strName].Rows.Count < 1)
{
throw new Exception("ÄúµÄÊý¾Ý¼¯²»´æÔÚ¡£");
}
//²éÕÒ×î´óµÄÊý¾Ý
for(i = 0;i<=iCount - 1;i++)
{
iTempNum = ds.Tables[strName].Rows[0][i].ToString();
if(iMaxValue <= Convert.ToInt32(iTempNum))
{
iMaxValue = Convert.ToInt32(iTempNum);
}
}
//¿ªÊ¼±éÀúÊý¾ÝµãÕó,½«ÕÛÏߵĵãÕó»æÖƵ½Í¼ÏñÖÐ
for(i = 0;i<=iCount - 1;i++)
{
//¼ÆË㽫Êý¾Ý»æÖƵ½Í¼Æ¬ÖеıÈÀý
iTemp = (int)ds.Tables[strName].Rows[0][i];
iy = (int)(((float)iTemp/(float)iMaxValue) * 160);
if(iy == 0)
{
iy = 20;
}
objPoint[i].X = ix;
objPoint[i].Y = iIMGHight - 20 - iy;
ix = ix + 50; //»æÖÆÐéÏߣ¬±êÃ÷×ø±ê
Xpoint.X = objPoint[i].X;
Xpoint.Y = iIMGHight - 20;
MyGraphic.DrawLine(FloatPen,objPoint[i],Xpoint);
Ypoint.X = 20;
Ypoint.Y = objPoint[i].Y;
MyGraphic.DrawLine(FloatPen,objPoint[i],Ypoint);
MyGraphic.DrawString(ds.Tables[strName].Rows[0][i].ToString(),new Font("ËÎÌå",7),new SolidBrush(Color.Black),2,Ypoint.Y);
//µÃµ½ÁÐÃû
strColName = ds.Tables[strName].Columns[i].ColumnName;
strColName = strColName.Substring(strColName.Length - 5,5);
MyGraphic.DrawString(strColName,new Font("ËÎÌå",7),new SolidBrush(Color.Black),Xpoint.X,Xpoint.Y); }
//»æÖÆÇúÏߣ¬x,yÖáµÄÏ߶Î
MyGraphic.DrawLine(BackPen,XpointS,XpointE);
MyGraphic.DrawLine(BackPen,YpointS,YpointE);
MyGraphic.DrawLine(BackPen,XpointE.X-4,XpointE.Y,XpointE.X,XpointE.Y-8); //»æÖƼýÍ·
MyGraphic.DrawLine(BackPen,XpointE.X+4,XpointE.Y,XpointE.X,XpointE.Y-8); //»æÖƼýÍ·
MyGraphic.DrawLine(BackPen,XpointE.X-4,XpointE.Y,XpointE.X+4,XpointE.Y); //»æÖƼýÍ·
MyGraphic.DrawString(strXDesc,new Font("ËÎÌå",7),new SolidBrush(Color.Red),XpointE.X,0); //»æÖÆ×ø±êÎÄ×Ö
MyGraphic.DrawLine(BackPen,YpointE.X,YpointE.Y-4,YpointE.X+8,YpointE.Y); //»æÖƼýÍ·
MyGraphic.DrawLine(BackPen,YpointE.X,YpointE.Y+4,YpointE.X+8,YpointE.Y); //»æÖƼýÍ·
MyGraphic.DrawLine(BackPen,YpointE.X,YpointE.Y-4,YpointE.X,YpointE.Y+4); //»æÖƼýÍ·
MyGraphic.DrawString(strYDesc,new Font("ËÎÌå",7),new SolidBrush(Color.Red),YpointE.X,YpointE.Y); //»æÖÆ×ø±êÎÄ×Ö //»æÖÆÇúÏß
if(objPoint.Length > 1)
{
MyGraphic.DrawLines(myPen,objPoint);
}
else
{
}
objBitbmp.Save(objIMGstream,ImageFormat.Gif);
objIMGstream.Position = 0;
objIMG = objIMGstream;
}
catch(System.Exception ex)
{
strError = ex.Message.ToString();
objIMG = objIMGstream;
}
finally
{
objBitbmp.Dispose();
}
}关于在图形上判断焦点的动作,我是这样坐的。
当你画图的时候会有一个point[]数组。把这个数组保存下来,在MouseDown事件中判断是否鼠标属于这个point,然后比较是否存在于point[],如果存在,在图层上绘制一个正方形的小实体块。标明位置。
至于上下文菜单,你可以定义指定的点弹出指定右键菜单。
我就是用这种方法写了一个公共类,现在使用的还不错。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货