肯定要做控件~~你做的重绘闪是没有开双缓冲~
关键代码·~~
public CrossControl()
{
InitializeComponent();
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true);
this.BackColor = Color.Transparent;
}
protected override void OnPaint(PaintEventArgs e)
{
for (int i = 0; i < 1000; i++)
{
X_Data = i * 0.1;
Y_Data = X_Data * X_Data * X_Data;
}
this.DrawCompute();
Bitmap Bmp = new Bitmap(this.Width, this.Height);
Graphics g = Graphics.FromImage(Bmp);
g.Clear(this.BackColor);
DrawCross(g);
e.Graphics.DrawImage(Bmp, new Point(0, 0));
base.OnPaint(e);
}
private void DrawCross(Graphics g)
{
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed;
float E_X, E_Y;
E_X = MyP.X;
E_Y = MyP.Y;
// T_String=string.Format( "{0} = {1}{2}, {3} ={4}{5} ", e.X, e.Y);
float Data_eX, Data_eY;
Data_eX = Interpolation(0, Xst, this.Width-1, XEnd, E_X);
Data_eY = Interpolation(0, Yst, this.Height-1, YEnd, E_Y);
Data_eX = (int)(Data_eX * 1000) / 1000;
Data_eY = (int)(Data_eY * 1000) / 1000;
float a, b;
a = Data_eX;
b = Data_eY;
T_String = string.Format( "横轴 = {0}(m), 纵轴 ={1}(m) ", Data_eX, Data_eY);
SizeF mysize = new SizeF();
mysize = g.MeasureString(T_String, new Font( "宋体 ", 12f));
Pen p = new Pen(Color.Orange, 1);
p.DashStyle = DashStyle.DashDot;
g.DrawLine(p, E_X, 0, E_X, this.Height);
g.DrawLine(p, 0, E_Y, this.Width, E_Y);
//判断备注位置
if (E_X <= this.Width - 10 - mysize.Width && E_Y < mysize.Height + 10)
{//标注于右下
g.DrawRectangle(new Pen(Color.LightSeaGreen, 1), E_X + 5, E_Y+5, mysize.Width + 10, mysize.Height + 10);
g.DrawString(T_String, new Font( "宋体 ", 12f), new SolidBrush(Color.Red), E_X + 10, E_Y+10);
}
else if (E_X > this.Width - 10 - mysize.Width && E_Y <= this.Height - 10 - mysize.Height)
{//标注于左下
g.DrawRectangle(new Pen(Color.LightSeaGreen, 1), E_X-15-mysize.Width , E_Y + 5, mysize.Width + 10, mysize.Height + 10);
g.DrawString(T_String, new Font( "宋体 ", 12f), new SolidBrush(Color.Red), E_X - 10 - mysize.Width, E_Y + 10);
}
else if (E_X > this.Width - 10 - mysize.Width && E_Y > this.Height - 10 - mysize.Height)
{//标注于左上
g.DrawRectangle(new Pen(Color.LightSeaGreen, 1), E_X - 15 - mysize.Width, E_Y - 15-mysize.Height , mysize.Width + 10, mysize.Height + 10);
g.DrawString(T_String, new Font( "宋体 ", 12f), new SolidBrush(Color.Red), E_X - 10 - mysize.Width, E_Y - 10 - mysize.Height);
}
else
{//标注于右上
g.DrawRectangle(new Pen(Color.LightSeaGreen, 1), E_X + 5, E_Y - 15 - mysize.Height, mysize.Width + 10, mysize.Height + 10);
g.DrawString(T_String, new Font( "宋体 ", 12f), new SolidBrush(Color.Red), E_X + 10, E_Y - 10 - mysize.Height);
}
// this.Refresh();
Invalidate();
}
关键代码·~~
public CrossControl()
{
InitializeComponent();
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true);
this.BackColor = Color.Transparent;
}
protected override void OnPaint(PaintEventArgs e)
{
for (int i = 0; i < 1000; i++)
{
X_Data = i * 0.1;
Y_Data = X_Data * X_Data * X_Data;
}
this.DrawCompute();
Bitmap Bmp = new Bitmap(this.Width, this.Height);
Graphics g = Graphics.FromImage(Bmp);
g.Clear(this.BackColor);
DrawCross(g);
e.Graphics.DrawImage(Bmp, new Point(0, 0));
base.OnPaint(e);
}
private void DrawCross(Graphics g)
{
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed;
float E_X, E_Y;
E_X = MyP.X;
E_Y = MyP.Y;
// T_String=string.Format( "{0} = {1}{2}, {3} ={4}{5} ", e.X, e.Y);
float Data_eX, Data_eY;
Data_eX = Interpolation(0, Xst, this.Width-1, XEnd, E_X);
Data_eY = Interpolation(0, Yst, this.Height-1, YEnd, E_Y);
Data_eX = (int)(Data_eX * 1000) / 1000;
Data_eY = (int)(Data_eY * 1000) / 1000;
float a, b;
a = Data_eX;
b = Data_eY;
T_String = string.Format( "横轴 = {0}(m), 纵轴 ={1}(m) ", Data_eX, Data_eY);
SizeF mysize = new SizeF();
mysize = g.MeasureString(T_String, new Font( "宋体 ", 12f));
Pen p = new Pen(Color.Orange, 1);
p.DashStyle = DashStyle.DashDot;
g.DrawLine(p, E_X, 0, E_X, this.Height);
g.DrawLine(p, 0, E_Y, this.Width, E_Y);
//判断备注位置
if (E_X <= this.Width - 10 - mysize.Width && E_Y < mysize.Height + 10)
{//标注于右下
g.DrawRectangle(new Pen(Color.LightSeaGreen, 1), E_X + 5, E_Y+5, mysize.Width + 10, mysize.Height + 10);
g.DrawString(T_String, new Font( "宋体 ", 12f), new SolidBrush(Color.Red), E_X + 10, E_Y+10);
}
else if (E_X > this.Width - 10 - mysize.Width && E_Y <= this.Height - 10 - mysize.Height)
{//标注于左下
g.DrawRectangle(new Pen(Color.LightSeaGreen, 1), E_X-15-mysize.Width , E_Y + 5, mysize.Width + 10, mysize.Height + 10);
g.DrawString(T_String, new Font( "宋体 ", 12f), new SolidBrush(Color.Red), E_X - 10 - mysize.Width, E_Y + 10);
}
else if (E_X > this.Width - 10 - mysize.Width && E_Y > this.Height - 10 - mysize.Height)
{//标注于左上
g.DrawRectangle(new Pen(Color.LightSeaGreen, 1), E_X - 15 - mysize.Width, E_Y - 15-mysize.Height , mysize.Width + 10, mysize.Height + 10);
g.DrawString(T_String, new Font( "宋体 ", 12f), new SolidBrush(Color.Red), E_X - 10 - mysize.Width, E_Y - 10 - mysize.Height);
}
else
{//标注于右上
g.DrawRectangle(new Pen(Color.LightSeaGreen, 1), E_X + 5, E_Y - 15 - mysize.Height, mysize.Width + 10, mysize.Height + 10);
g.DrawString(T_String, new Font( "宋体 ", 12f), new SolidBrush(Color.Red), E_X + 10, E_Y - 10 - mysize.Height);
}
// this.Refresh();
Invalidate();
}