关于使用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("&Auml;ú&micro;&Auml;&Ecirc;&yacute;&frac34;&Yacute;&frac14;&macr;&sup2;&raquo;&acute;&aelig;&Ocirc;&Uacute;&iexcl;&pound;");
}
//&sup2;é&Otilde;&Ograve;×&icirc;&acute;ó&micro;&Auml;&Ecirc;&yacute;&frac34;&Yacute;
for(i = 0;i<=iCount - 1;i++)
{
iTempNum = ds.Tables[strName].Rows[0][i].ToString();
if(iMaxValue <= Convert.ToInt32(iTempNum))
{
iMaxValue = Convert.ToInt32(iTempNum);
}

//&iquest;&ordf;&Ecirc;&frac14;±é&Agrave;ú&Ecirc;&yacute;&frac34;&Yacute;&micro;&atilde;&Otilde;ó,&frac12;&laquo;&Otilde;&Ucirc;&Iuml;&szlig;&micro;&Auml;&micro;&atilde;&Otilde;ó&raquo;&aelig;&Ouml;&AElig;&micro;&frac12;&Iacute;&frac14;&Iuml;&ntilde;&Ouml;&ETH;
for(i = 0;i<=iCount - 1;i++)
{
//&frac14;&AElig;&Euml;&atilde;&frac12;&laquo;&Ecirc;&yacute;&frac34;&Yacute;&raquo;&aelig;&Ouml;&AElig;&micro;&frac12;&Iacute;&frac14;&AElig;&not;&Ouml;&ETH;&micro;&Auml;±&Egrave;&Agrave;&yacute;
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; //&raquo;&aelig;&Ouml;&AElig;&ETH;é&Iuml;&szlig;&pound;&not;±ê&Atilde;÷×&oslash;±ê
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("&Euml;&Icirc;&Igrave;&aring;",7),new SolidBrush(Color.Black),2,Ypoint.Y);
//&micro;&Atilde;&micro;&frac12;&Aacute;&ETH;&Atilde;&ucirc;
strColName = ds.Tables[strName].Columns[i].ColumnName;
strColName = strColName.Substring(strColName.Length - 5,5);
MyGraphic.DrawString(strColName,new Font("&Euml;&Icirc;&Igrave;&aring;",7),new SolidBrush(Color.Black),Xpoint.X,Xpoint.Y); } 
      
//&raquo;&aelig;&Ouml;&AElig;&Ccedil;ú&Iuml;&szlig;&pound;&not;x,y&Ouml;á&micro;&Auml;&Iuml;&szlig;&para;&Icirc;
MyGraphic.DrawLine(BackPen,XpointS,XpointE);
MyGraphic.DrawLine(BackPen,YpointS,YpointE);
MyGraphic.DrawLine(BackPen,XpointE.X-4,XpointE.Y,XpointE.X,XpointE.Y-8);    //&raquo;&aelig;&Ouml;&AElig;&frac14;&yacute;&Iacute;·
MyGraphic.DrawLine(BackPen,XpointE.X+4,XpointE.Y,XpointE.X,XpointE.Y-8);    //&raquo;&aelig;&Ouml;&AElig;&frac14;&yacute;&Iacute;·
MyGraphic.DrawLine(BackPen,XpointE.X-4,XpointE.Y,XpointE.X+4,XpointE.Y);    //&raquo;&aelig;&Ouml;&AElig;&frac14;&yacute;&Iacute;·
MyGraphic.DrawString(strXDesc,new Font("&Euml;&Icirc;&Igrave;&aring;",7),new SolidBrush(Color.Red),XpointE.X,0);   //&raquo;&aelig;&Ouml;&AElig;×&oslash;±ê&Icirc;&Auml;×&Ouml;
MyGraphic.DrawLine(BackPen,YpointE.X,YpointE.Y-4,YpointE.X+8,YpointE.Y);    //&raquo;&aelig;&Ouml;&AElig;&frac14;&yacute;&Iacute;·
MyGraphic.DrawLine(BackPen,YpointE.X,YpointE.Y+4,YpointE.X+8,YpointE.Y);    //&raquo;&aelig;&Ouml;&AElig;&frac14;&yacute;&Iacute;·
MyGraphic.DrawLine(BackPen,YpointE.X,YpointE.Y-4,YpointE.X,YpointE.Y+4);    //&raquo;&aelig;&Ouml;&AElig;&frac14;&yacute;&Iacute;·
                MyGraphic.DrawString(strYDesc,new Font("&Euml;&Icirc;&Igrave;&aring;",7),new SolidBrush(Color.Red),YpointE.X,YpointE.Y);   //&raquo;&aelig;&Ouml;&AElig;×&oslash;±ê&Icirc;&Auml;×&Ouml; //&raquo;&aelig;&Ouml;&AElig;&Ccedil;ú&Iuml;&szlig;
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[],如果存在,在图层上绘制一个正方形的小实体块。标明位置。
至于上下文菜单,你可以定义指定的点弹出指定右键菜单。
我就是用这种方法写了一个公共类,现在使用的还不错。