title: System.InvalidOperationException: Object is currently in use elsewhere
body: <p>I seem to be getting this error when trying to draw on a panel. Im no expert in C# so hopefully someone here can help me with this. Thanks in advance.</p>
  
  <p>The stack trace shows,</p>
  
  <p>at System.Drawing.Graphics.set_Transform(Matrix value) at Victoria.Robotics.Marvin.Teleoperation.MainForm.DrawXYAxis(Graphics g) in C:\Users\kasunt\Microsoft Robotics Dev Studio 2008 R3\Marvin\Teleoperation\MainForm.cs:line 2173 at Victoria.Robotics.Marvin.Teleoperation.MainForm.envMap_Paint(Object sender, PaintEventArgs e) in C:\Users\kasunt\Microsoft Robotics Dev Studio 2008 R3\Marvin\Teleoperation\MainForm.cs:line 2143 at System.Windows.Forms.Control.OnPaint(PaintEventArgs e) at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs) at System.Windows.Forms.Control.WmPaint(Message&amp; m) at System.Windows.Forms.Control.WndProc(Message&amp; m) at System.Windows.Forms.ScrollableControl.WndProc(Message&amp; m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&amp; m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&amp; m) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)</p>
  
  <p>The code is below. Error seems to occur when setting the transform, </p>
  
  <pre><code>    private void envMap_Paint(object sender, PaintEventArgs e)
      {
          DrawXYAxis(e.Graphics);
      }
  
      /// &lt;summary&gt;
      /// Helper to draw the XY axis and plot the map
      /// &lt;/summary&gt;
      public void DrawXYAxis(Graphics g)
      {
          Rectangle rect = envMap.ClientRectangle;
  
          myPen = new Pen(Color.Black, 1);
          g.PageUnit = GraphicsUnit.Millimeter;
          g.PageScale = 0.1F;
          IntPtr hdc = g.GetHdc();
          int hMemDC = hdc.ToInt32();
  
          // Reverse the axis of the drawing surface
          Matrix mx = new Matrix(1, 0, 0, -1, 0, envMap.ClientSize.Height * 2);
          g.Transform = mx;
          g.TranslateTransform(50, 100, MatrixOrder.Append);
  
          // For drawing X - AXIS
          g.DrawLine(myPen, 0, 0, (2 * rect.Right - 60), 0);
          // For drawing Y - AXIS
          g.DrawLine(myPen, 0, 0, 0, 2 * rect.Bottom);
  
          // For drawing Arrow on X-AXIS
          g.DrawLine(myPen, (2 * rect.Right - 60) - 15, 8, (2 * rect.Right - 60), 0);
          g.DrawLine(myPen, (2 * rect.Right - 60), 0, (2 * rect.Right - 60) - 15, -8);
  
          // For drawing Arrow on Y-AXIS
          g.DrawLine(myPen, 8, 2 * rect.Bottom - 15, 0, 2 * rect.Bottom);
          g.DrawLine(myPen, 0, 2 * rect.Bottom, -8, 2 * rect.Bottom - 15);
  
          // Save the state to restore later
          GraphicsState state = g.Save();
  
          // Create a matrix to offset the text to the desired position and flip it the
          // right way up again
          Matrix mx2 = new Matrix(1, 0, 0, -1, 0, 0);
          Matrix mx1 = mx.Clone();
          mx1.Multiply(mx2);
          g.Transform = mx1;
          SolidBrush drawBrush = new SolidBrush(Color.Black);
          Font drawFont = new Font("Microsoft Sans Serif", 9, FontStyle.Bold);
          StringFormat sF = new StringFormat(StringFormatFlags.NoClip);
          sF.Alignment = StringAlignment.Center;
          g.DrawString("X", drawFont, drawBrush, (2 * rect.Right - 40), -2 * Font.Height, sF);
          g.DrawString("Y", drawFont, drawBrush, -40, -(2 * rect.Height + 2 * Font.Height), sF);
  
          // Restore state
          g.Restore(state);
  
          drawFont = new Font("Microsoft Sans Serif", 7);
  
          // Drawing Tick Marks and Labels
          // NOTE THE LABELS ON THE AXES WILL CHANGE TO REFFECT THE REAL POSITION OF THE ROBOT....
          myPen.Dispose();
     }
  </code></pre>
  
  <p>Line #2173,</p>
  
  <pre><code>        g.Transform = mx;
  </code></pre>
  
  <p>Line #2143,</p>
  
  <pre><code>        DrawXYAxis(e.Graphics);
  </code></pre>