Just create a C# WinForm Project,
Name the form "FormMain" and add a button "buttonRun".
Use the code below then you can test it.
Main idea is:
Draw some image on a bitmap first, then "paste" the bitmap on the graphics of the form.
This will reduce the "flicking" of the window.
Code: ==================================
Name the form "FormMain" and add a button "buttonRun".
Use the code below then you can test it.
Main idea is:
Draw some image on a bitmap first, then "paste" the bitmap on the graphics of the form.
This will reduce the "flicking" of the window.
Code: ==================================
public partial class FormMain : Form
{
bool isDrawing = false;
Bitmap gBmp = null;
Graphics gGraphImg = null;
// this variables are just for the Curve
int gX = 350, gY = 200;
int offX = 180, offY = 100;
public FormMain()
{
InitializeComponent();
CreateBitmapAndGraphic();
}
// gBmp & gGraph will be created, when the form is initialized or resized.
private void CreateBitmapAndGraphic()
{
if (gBmp != null)
{
gBmp.Dispose(); // Dispose it to prevent memory usage too high, when redraw too many times.
}
gBmp = new Bitmap(this.Width, this.Height);
if (gGraphImg != null)
{
gGraphImg.Dispose(); // Dispose it to prevent memory usage too high, when redraw too many times.
}
gGraphImg = Graphics.FromImage(gBmp);
}
// Draw two images in a bitmap
private Bitmap DrawCurveInBitmap()
{
// gBmp & gGraph will be created, when the form is initialized or resized.
gGraphImg.Clear(this.BackColor);
// Draw Image 1 =======================================
Rectangle rectangle = new Rectangle(50, 100, 150, 150);
gGraphImg.DrawRectangle(System.Drawing.Pens.Red, rectangle);
gGraphImg.DrawEllipse(System.Drawing.Pens.Black, rectangle);
// Draw Image 2 =======================================
// Create pens.
Pen orangePen = new Pen(Color.Orange, 2);
Pen greenPen = new Pen(Color.Green, 3);
// Create points that define curve.
// the point6 will be moved by the mouse!
Point point1 = new Point(50 + offX, 50 + offY);
Point point2 = new Point(100 + offX, 25 + offY);
Point point3 = new Point(200 + offX, 5 + offY);
Point point4 = new Point(250 + offX, 50 + offY);
Point point5 = new Point(300 + offX, 100 + offY);
//Point point6 = new Point(350 + offX, 200 + offY);
Point point6 = new Point(gX + offX, gY + offY);
Point point7 = new Point(250 + offX, 250 + offY);
Point[] curvePoints = { point1, point2, point3, point4, point5, point6, point7 };
// Draw lines between original points to screen.
gGraphImg.DrawLines(orangePen, curvePoints);
// Draw curve to screen.
gGraphImg.DrawCurve(greenPen, curvePoints);
return gBmp;
}
// The Draw function, which will be called by event functions.
private void DrawImages()
{
Graphics graphics = this.CreateGraphics(); // when resized, the graphics must renew, so, create it each time
// to make it flicker-free
// 1. draw the image in a bitmap, which is done in the function DrawCurveInBitmap
// 2. then draw the bitmap on the graphics of the form once.
graphics.DrawImage(DrawCurveInBitmap(), 0, 0);
// graphics.Dispose(); // Dispose it to prevent memory usage too high. After test, it's not necessary.
}
// click the buttonRun to set the point6 to a constant position
private void buttonRun_Click(object sender, EventArgs e)
{
// set point6 to a posistion
gX = 350;
gY = 200;
DrawImages();
}
// form resize and redraw
private void FormMain_Resize(object sender, EventArgs e)
{
CreateBitmapAndGraphic();
DrawImages();
}
// mouse click and redraw, point6 will be set to the tip of mouse
private void FormMain_MouseDown(object sender, MouseEventArgs e)
{
isDrawing = true;
gX = e.X - offX;
gY = e.Y - offY;
DrawImages();
}
// mouse down and move will redraw, point6 will follow the mouse's movement
private void FormMain_MouseMove(object sender, MouseEventArgs e)
{
if (isDrawing)
{
gX = e.X - offX;
gY = e.Y - offY;
DrawImages();
}
}
// toggle the mouse off.
private void FormMain_MouseUp(object sender, MouseEventArgs e)
{
isDrawing = false;
}
}
Comments