Hi Experts,
Could you please help us in improving the spped of some graphics. I am attaching the sample code for your reference. We are drawing lines and then selecting them on a picturebox container using C#. The code is working fine but its a bit slow
Thanks for your time and effort in advance. The Code is below pasted.
Regards,
Sam
using
System;using
System.Collections.Generic;using
System.Collections;using
System.Text;using
System.Drawing;using
System.Drawing.Drawing2D;using
System.Windows.Forms;using
System.Threading;namespace
SkoltaskenApplication.Classes{
class LineFinal:PageEditing{
#region
Variable public Boolean m_Drawing; public Boolean FlgAddLine = false; // ' Buffer for erasing rubberband lines. private Bitmap m_BufferBitmap; private Bitmap BitMapOnSelect; public Graphics m_BufferGraphics; //' The mouse position. public Point m_Pos1; public Point m_Pos2; private Boolean FirstLineFlag = true; public PictureBox pictureBox1 = null; public MouseEventHandler mu = null; public MouseEventHandler mm = null; public MouseEventHandler md = null; public PaintEventHandler pp = null; private Pen myPen=null; private Image img; private Image backimg; private lineData[] ArrayLine; private Point MouseClickPosition; public Boolean FlagOnMouseMove = false; public string SKLAction="Selection";#endregion
#region
Constructor_Initialise public LineFinal(){} public LineFinal(string MouseMode) {SKLAction = MouseMode;
}
public void InitializeComponent(){
if (img == null){
img = (
Image)ImageSelected.Clone();backimg = (
Image)ImageSelected.Clone();}
this.mu = new MouseEventHandler(this.pictureBox1_MouseUp); this.mm = new MouseEventHandler(this.pictureBox1_MouseMove); this.md = new MouseEventHandler(this.pictureBox1_MouseDown); this.pp = new PaintEventHandler(this.pictureBox1_Paint); this.pictureBox1.MouseUp += this.mu; this.pictureBox1.MouseMove += this.mm; this.pictureBox1.MouseDown += this.md; this.pictureBox1.Paint += this.pp; this.pictureBox1.Image = img; this.pictureBox1.BackgroundImage = backimg;BitMapOnSelect =
new Bitmap(this.pictureBox1.Size.Width, this.pictureBox1.Size.Height, this.pictureBox1.CreateGraphics());m_BufferBitmap =
new Bitmap(this.pictureBox1.Size.Width, this.pictureBox1.Size.Height, this.pictureBox1.CreateGraphics());m_BufferGraphics =
Graphics.FromImage(m_BufferBitmap);m_Pos1 = PtPicturebox;
}
public void UnInitializeComponent(){
this.pictureBox1.MouseUp -= this.mu; this.pictureBox1.MouseMove += this.mm; this.pictureBox1.MouseDown -= this.md;mu =
null;md =
null;}
#endregion
#region
Events private void pictureBox1_MouseUp(object sender, MouseEventArgs e){
if (SKLAction == "Drawing"){
SKLAction =
"Selection";FirstLineFlag =
false; //' Draw the new line permanently on the buffer. //' Note that the points used by DrawReversibleLine //' are in screen coordinates so we need to use //' PointToClient to convert that to form coordinates.myPen =
new Pen(Color.Blue, 1);m_BufferGraphics =
Graphics.FromImage(m_BufferBitmap);m_BufferGraphics.DrawLine(myPen,
this.pictureBox1.PointToClient(m_Pos1), this.pictureBox1.PointToClient(m_Pos2)); //saving data in array lineData objLineData = new lineData();objLineData.start = m_Pos1;
objLineData.end = m_Pos2;
objLineData.LinePen = myPen;
objLineData.ActualSelected =
false;objLineData.Selected =
false;LineArray.Add(objLineData);
}
}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e){
// ' Do nothing if this isn't the left mouse button. if (e.Button != System.Windows.Forms.MouseButtons.Left) return ; //// ' Save the current mouse position.m_Pos1 = PtPicturebox;
m_Pos2 =
Control.MousePosition;ArrayLine = (
lineData[])LineArray.ToArray(typeof(lineData));LineArray.Clear();
for (int i = 0; i <= ArrayLine.Length -1; i++){
if (ArrayLine[i].Selected){
ArrayLine[i].ActualSelected =
true;}
LineArray.Add(ArrayLine[i]);
}
MouseClickPosition =
Control.MousePosition;}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e){
// ' Do nothing if we're not drawing. switch (SKLAction){
case "Drawing": //' Erase the previous line. if (FirstLineFlag == false){
ControlPaint.DrawReversibleLine(m_Pos1, m_Pos2, this.pictureBox1.BackColor);}
FirstLineFlag =
false; //' Save the new point.m_Pos2 =
Control.MousePosition; //' Draw the new line. ControlPaint.DrawReversibleLine(m_Pos1, m_Pos2, this.pictureBox1.BackColor); break ; case "Selection": //logic to draw seleted line in Selection Calulation like m,c,y etc y=mx+c logic is ther Selection objSelection = new Selection(Control.MousePosition);objSelection.GetSelection();
try
{
img = (
Image)ImageSelected.Clone(); this.pictureBox1.Image = img;m_BufferBitmap =
new Bitmap(this.pictureBox1.Size.Width, this.pictureBox1.Size.Height, this.pictureBox1.CreateGraphics());m_BufferGraphics =
Graphics.FromImage(m_BufferBitmap); foreach (lineData x in LineArray){
if (x.Selected){
myPen =
new Pen(Color.Yellow, 50);myPen.StartCap =
LineCap.Round;myPen.EndCap =
LineCap.Round;m_BufferGraphics.DrawLine(myPen,
this.pictureBox1.PointToClient(x.start), this.pictureBox1.PointToClient(x.end)); break;}
}
//logic to redraw line foreach (lineData x in LineArray){
m_BufferGraphics.DrawLine(x.LinePen,
this.pictureBox1.PointToClient(x.start), this.pictureBox1.PointToClient(x.end));}
}
catch (Exception ex){
}
break; case "Moving":
break;
}
}
// Redraw the form. private void pictureBox1_Paint(Object sender,PaintEventArgs e){
DrawForm(e.Graphics);
}
#endregion
#region
Method private void DrawForm(Graphics gr){
if (m_BufferBitmap != null){
gr.DrawImage(m_BufferBitmap, 0, 0);
}
}
private lineData GetSelctedLine(){
lineData objlineData = new lineData(); foreach (lineData x in LineArray){
if (x.ActualSelected){
objlineData.start = x.start;
objlineData.end = x.end;
objlineData.LinePen = x.LinePen;
objlineData.Selected = x.Selected;
objlineData.ActualSelected = x.ActualSelected;
}
}
return objlineData;}
public void DrawAfterDelete(){
Image Img=null; if (Img == null){
Img = (
Image)ImageSelected.Clone();}
this.pictureBox1.Image = Img;m_BufferGraphics =
Graphics.FromImage(m_BufferBitmap); foreach (lineData x in LineArray) // for (int i = 0; i <= ArrayLine.Length - 1; i++){
m_BufferGraphics.DrawLine(x.LinePen,
this.pictureBox1.PointToClient(x.start), this.pictureBox1.PointToClient(x.end));}
}
public void DrawWhileMoving(){
Image Img = null; if (Img == null){
Img = (
Image)ImageSelected.Clone();}
this.pictureBox1.Image = Img;m_BufferGraphics =
Graphics.FromImage(m_BufferBitmap); foreach (lineData x in LineArray) // for (int i = 0; i <= ArrayLine.Length - 1; i++){
m_BufferGraphics.DrawLine(x.LinePen,
this.pictureBox1.PointToClient(x.start), this.pictureBox1.PointToClient(x.end));}
}
#endregion
}
}
Mike HankeyPosted May 20, 2008, 1:28 PM
Looks like your trying to do most of the work in the MouseMove handler. The only thing that should be done there is updating of variables and issuing an Invalidate()
Hope this helps
Mike