public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Task.Factory.StartNew(() => {
Form form = new Form();
form.StartPosition = FormStartPosition.CenterScreen;
form.Width = 500;
form.Height = 500;
Button button = new Button();
form.Controls.Add(button);
button.Location = new Point(0, 0);
button.Width = 50;
button.Height = 20;
button.Click += new EventHandler(button_Test_Click);
form.ShowDialog();
//或
//Application.Run(form)
// the Application.DoEvents (); wake-up form
//form.Show ();
});
}
private void button_Test_Click(object sender, EventArgs e)
{
Thread.Sleep(10000);
}
Bitmap bit=new Bitmap(800,500);
private void button2_Click(object sender, EventArgs e)
{
SetParameter(this.pictureBox1, bit, 20, 400, 250);
DrawPosition(60, 60);
}
public void DrawPosition(int x,int y)
{
BufferedGraphicsContext current=BufferedGraphicsManager.Current;
BufferedGraphics bg;
bg=current.Allocate(_PictureBOx.CreateGraphics(),_PictureBOx.DisplayRectangle);
Graphics g=bg.Graphics;
g.FillRectangle(Brushes.Black, new Rectangle(0, 0, _PictureBOx.Width, _PictureBOx.Height));
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
//标准坐标图
Pen pen=new Pen(Color.Red,1);
g.DrawLine(pen, new Point(GetX(0), GetY(_CenterY)), new Point(GetX(_bitMap.Width), GetY(_CenterY)));
for (int i = 0; i < 10;i++ )//横线
{
g.DrawLine(pen ,new Point(GetX(i*_CenterX/10+_CenterX),GetY(_CenterY)),new Point(GetX(i*_CenterX/10+_CenterX),GetY(_CenterY)-5));
g.DrawLine(pen, new Point(GetX(_CenterX-i * _CenterX / 10), GetY(_CenterY)), new Point(GetX(_CenterX - i * _CenterX / 10), GetY(_CenterY) - 5));
}
g.DrawLine(pen, new Point(GetX(_CenterX), GetY(0)), new Point(GetX(_CenterX), GetY(_bitMap.Height)));
for (int i = 0; i < 10; i++)//纵线
{
g.DrawLine(pen, new Point(GetX(_CenterX), GetY(_CenterY + i * _CenterY / 10)), new Point(GetX(_CenterX) + 5, GetY(_CenterY+i * _CenterY / 10)));
g.DrawLine(pen, new Point(GetX(_CenterX), GetY(_CenterY - i * _CenterY / 10)), new Point(GetX(_CenterX) + 5, GetY(_CenterY - i * _CenterY / 10)));
}
int elliValue = _CenterX / 4;
int pad = 29;
int coefficient = 0;
for(int i=0;i<3;i++)//圆
{
coefficient = Convert.ToInt32(pad / 2*i);
g.DrawEllipse(pen, new Rectangle(GetX(_CenterX - elliValue * i) + coefficient, GetY(_CenterY - elliValue * i) + coefficient, elliValue * i - coefficient, elliValue * i - coefficient));
}
int tempWidth = 3;
int tempOffset = 25;
g.DrawLine (pen, new Point (GetX (_CenterX) - tempWidth, Tide (_CenterY) - tempWidth), new Point (GetX (_CenterX) - tempWidth, Tide (_CenterY) - tempOffset)); //纵上左
g. DrawLine (pen, new Point (GetX (_CenterX) - tempWidth, tide (_CenterY) + tempWidth), new Point (GetX (_CenterX) - tempWidth, tide (_CenterY) + tempOffset)); //纵下左
g.DrawLine ( pen, new Point (GetX (_CenterX) + tempWidth, tide (_CenterY) - tempWidth), new Point (GetX (_CenterX) + tempWidth, tide (_CenterY) - tempOffset)); //纵上右
g.DrawLine (pen, new Point (GetX (_CenterX) + tempWidth, tide (_CenterY) + tempWidth), new Point (GetX (_CenterX) + tempWidth, tide (_CenterY) + tempOffset)); //纵下右
g.DrawLine (pen, new Point (GetX (_CenterX) - tempWidth, Tide (_CenterY) - tempWidth), new Point (GetX (_CenterX) - tempOffset, Tide (_CenterY) - tempWidth)); //横上左
g. DrawLine (pen, new Point (GetX (_CenterX) - tempWidth, tide (_CenterY) + tempWidth), new Point (GetX (_CenterX) - tempOffset, tide (_CenterY) + tempWidth)); //横下左
g.DrawLine ( pen, new Point (GetX (_CenterX) + tempWidth, tide (_CenterY) - tempWidth), new Point (GetX (_CenterX) + tempOffset, tide (_CenterY) - tempWidth)); //横上右
g.DrawLine (pen, new Point (GetX (_CenterX) + tempWidth, tide (_CenterY) + tempWidth), new Point (GetX (_CenterX) + tempOffset, tide (_CenterY) + tempWidth)); //横下右
//实时中心
Pen Pen 2 = new pen (Color.Green, 1);
g.DrawEllipse(pen2, new Rectangle(GetX(x) - 5, GetY(y) - 5, 10, 10));//画中心点
g.FillEllipse(Brushes.Green , new Rectangle(GetX(x) - 5, GetY(y) - 5, 10, 10));
g.DrawLine(pen2, new Point(GetX(x), GetY(y) - 20), new Point(GetX(x),GetY(y)+20));
g.DrawLine(pen2, new Point(GetX(x)-20, GetY(y) ), new Point(GetX(x)+20, GetY(y)));
bg.Render();
bg.Dispose();
}
int _Margin=20;
int _CenterX=400;
int _CenterY=250;
PictureBox _PictureBOx;
Bitmap _bitMap;
public void SetParameter(PictureBox pictureBOx,Bitmap bitmap,int margin, int centerX, int centerY)
{
_Margin = margin;
_CenterX = centerX;
_CenterY = centerY;
_PictureBOx = pictureBOx;
_bitMap = bitmap;
}
public int GetX(double x)
{
x = (x / _bitMap.Width) * (_PictureBOx.Width - 2 * _Margin) + _Margin;
return Convert.ToInt32(x);
}
public int GetY(double y)
{
y = (y / _bitMap.Height) * (_PictureBOx.Height - 2 * _Margin) + _Margin;
return Convert.ToInt32(y);
}
private void button3_Click(object sender, EventArgs e)
{
DrawPosition(Convert.ToInt32(textBox1.Text), Convert.ToInt32(textBox2.Text));
}
}