Home Course Index << Prev PDF Version of this Page C5 Code Comments

Course 2DCis: 2D-Computer Graphics with C#
Chapter C5: The Complete Code of the Controls Project


Copyright © by V. Miszalok, last update: 2011-09-13

Copy all this code into an empty Form1.cs of a new Windows Application C#-project controls1 and clear Form1.Designer.cs and Program.cs.

using System;
using System.Drawing;
using System.Windows.Forms;

public class Form1 : Form
{ [STAThread] static void Main() { Application.Run( new Form1() ); }
  const Int32 nButtons = 3, nTrackBars = 3, nCheckBoxes = 3, nRadioButtons = 3;
  Button  [] button   = new Button[nButtons];
  TrackBar[] trackbar = new TrackBar[nTrackBars];
  Label   [] label    = new Label[nTrackBars];
  CheckBox[] checkbox = new CheckBox[nCheckBoxes];
  static RadioButton[] radiobutton = new RadioButton[nRadioButtons];
  static Color linecolor = Color.Black;
  static Pen pen = new Pen( linecolor, 1 );
  static Panel panel = new Panel();
  static Graphics g;
  static Random r = new Random();
  Timer myTimer = new Timer();

  public Form1()
  { BackColor  = Color.White;
    Text       = "GUI";
    Int32 i;
    for ( i=0; i < nButtons; i++ )
    { button[i] = new Button(); Controls.Add( button[i] );
      button[i].Click += new EventHandler( button_handler );
    }
    button[0].Text = "Start";
    button[1].Text = "Stop";
    button[2].Text = "Clear";
    for ( i=0; i < nTrackBars; i++ )
    { trackbar[i] = new TrackBar(); Controls.Add( trackbar[i] );
      label   [i] = new Label();    Controls.Add( label[i] );
      trackbar[i].AutoSize = false;
      trackbar[i].TickStyle = TickStyle.None;
      trackbar[i].ValueChanged += new EventHandler( trackbar_handler );
      label   [i].TextAlign = ContentAlignment.TopCenter;
    }
    trackbar[0].Name = label[0].Text = "TimerInterval";
    trackbar[1].Name = label[1].Text = "PenThickness";
    trackbar[2].Name = label[2].Text = "Brightness";
    trackbar[0].Minimum = 13; trackbar[0].Maximum = 1000;
    trackbar[1].Minimum =  1; trackbar[1].Maximum =   20;
    trackbar[2].Minimum =  0; trackbar[2].Maximum =  255;
    for ( i=0; i < nCheckBoxes; i++ )
    { checkbox[i] = new CheckBox(); Controls.Add( checkbox[i] );
      checkbox[i].TextAlign = ContentAlignment.MiddleCenter;
      checkbox[i].Click += new EventHandler( checkbox_handler );
    }
    checkbox[0].Text = "Red";
    checkbox[1].Text = "Green";
    checkbox[2].Text = "Blue";
    for ( i=0; i < nRadioButtons; i++ )
    { radiobutton[i] = new RadioButton(); Controls.Add( radiobutton[i] );
      radiobutton[i].TextAlign = ContentAlignment.MiddleCenter;
    }
    radiobutton[0].Text = "Lines"; radiobutton[0].Checked = true;
    radiobutton[1].Text = "Rectangles";
    radiobutton[2].Text = "Ellipses";

    foreach ( Control c in Controls )
    { c.BackColor = Color.Gray;
      if ( c.Text == "" ) c.Text = "nothing";
    }
    Controls.Add( panel ); //Put a drawing space on Form1
    myTimer.Tick += new EventHandler( OnTimer );
    myTimer.Interval = 1;
    Width  = 800; Height = 600;
  }
  protected override void OnResize( EventArgs e )
  { Int32 w = ClientRectangle.Width / 5;
    Int32 h = ClientRectangle.Height / (Controls.Count-1);
    Int32 i, top = 1;
    for ( i=0; i < Controls.Count-1; i++ )
    { Controls[i].Top    = top;
      Controls[i].Left   = 2;
      Controls[i].Width  = w;
      Controls[i].Height = h - 2;
      top += h;
    }
    for ( i=0; i < nTrackBars; i++ ) trackbar[i].Height = h;
    panel.Location = new Point( w+2, 0 );
    panel.Size = new Size( ClientRectangle.Width-panel.Location.X, ClientRectangle.Height );
    g = panel.CreateGraphics();
    g.Clear( SystemColors.Window );
  }
  protected void button_handler( object sender, System.EventArgs e )
  { switch( ((Button)sender).Text )
    { case "Start": myTimer.Start(); break;
      case "Stop" : myTimer.Stop(); break;
      case "Clear": g.Clear( SystemColors.Window ); break;
    }
  }
  protected void trackbar_handler( object sender, System.EventArgs e )
  { Int32 value = ((TrackBar)sender).Value;
    switch( ((TrackBar)sender).Name )
    { case "TimerInterval":
           myTimer.Interval = value;
           label[0].Text = "TimerInterval = " + value.ToString(); break;
      case "PenThickness":
           pen.Width = value;
           label[1].Text = "PenThickness = " + value.ToString(); break;
      case "Brightness":
           label[2].Text = "Brightness = " + value.ToString();
           checkbox_handler( sender, e ); break; //call checkbox_handler
    }
  }
  protected void checkbox_handler( object sender, System.EventArgs e )
  { Int32 v;
    if ( sender == trackbar[2] ) v = trackbar[2].Value; //call from "Brightness"
    else                         v = trackbar[2].Value = 255; //call from CheckBox
    linecolor = Color.Black; //start color
    if ( checkbox[0].Checked ) linecolor = Color.FromArgb( v,0,0 );
    if ( checkbox[1].Checked ) linecolor = Color.FromArgb( linecolor.R,v,0 );
    if ( checkbox[2].Checked ) linecolor = Color.FromArgb( linecolor.R,linecolor.G,v );
    //If all checkboxes are empty, the linecolor remains black. Replace it by gray.
    if ( linecolor == Color.Black && v > 0 ) linecolor = Color.FromArgb( v,v,v );
    pen.Color = linecolor;
  }
  protected static void OnTimer( Object myObject, EventArgs myEventArgs )
  { Int32 w = r.Next( panel.Width/2 ), h = r.Next( panel.Height/2 );
    Int32 x = r.Next( panel.Width-w ), y = r.Next( panel.Height-h );
         if ( radiobutton[0].Checked ) g.DrawLine     ( pen, x, y, x+w, y+h );
    else if ( radiobutton[1].Checked ) g.DrawRectangle( pen, x, y,  w,   h  );
    else if ( radiobutton[2].Checked ) g.DrawEllipse  ( pen, x, y,  w,   h  );
  }

}