Autor Beitrag
tobi_2k6
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 20.05.13 17:20 
Hallo!

Wir programmieren ein Programm, welches Verbrauchsdaten in ein Kennfeld von Microsoft Excel einliest.
Nun haben wir folgendes Problem: Wir möchten gerne die x,y- Achsen unseres Koordinatensystems beschriften
aber es kommt immer ein GDI+ Fehler .. verstehe nicht was hier falsch ist. Hier mal der Teil des Codes der Probleme
macht:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
Font f = new Font("Verdana"0.07f);
Brush u = new SolidBrush(Color.Black);
String aux = "0/0";

StringFormat hdi = new StringFormat();

hdi.Alignment = StringAlignment.Far; //horizontale Ausrichtung
hdi.LineAlignment = StringAlignment.Center; //vertikale Ausrichtung

z.DrawString(aux, f, u, new Point(00), hdi);

hdi.Alignment = StringAlignment.Center; //horizontale Ausrichtung
hdi.LineAlignment = StringAlignment.Near; //vertikale Ausrichtung

for (x = 1000; x <= scaleX * 500; x += 500)
    z.DrawString(x.ToString(), f, u, new PointF(x, 0.03f), hdi);


Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 20.05.13 17:37 
Du solltest den Fehler auch benennen und nicht nur sagen das einer Auftritt.
z ist ein Graphics Object und du bist in einem Draw Event?
tobi_2k6 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 20.05.13 17:41 
Wie meinst du das ? Es öffnet sich nur ein
Fenster wenn das Programm schon läuft in dem steht:

Fehler beim Zeichnen in die Bitmap:

Allgemeiner Fehler in GDI+.

und ja ich zeichne in eine Bitmap
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 20.05.13 17:51 
Läßt sich das Problem nicht beim debuggen nachstellen so das du einen StackTrace bekommst damit du uns zumindest sagen kannst bei welcher Methode das genau auftritt?
tobi_2k6 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 20.05.13 17:54 
Zitat:
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities\11.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.HostingProcess.Utilities.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities.Sync\11.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.HostingProcess.Utilities.Sync.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.Debugger.Runtime\11.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.Debugger.Runtime.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Users\Tobi\Documents\Projekt_3_Verbrauchskennfeld(3)\Projekt_3_Verbrauchskennfeld\Projekt_3_Verbrauchskennfeld\bin\Debug\Projekt_3_Verbrauchskennfeld.vshost.exe" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Xml.Linq\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.Linq.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Data.DataSetExtensions\v4.0_4.0.0.0__b77a5c561934e089\System.Data.DataSetExtensions.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\Microsoft.CSharp\v4.0_4.0.0.0__b03f5f7f11d50a3a\Microsoft.CSharp.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_32\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Deployment\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Deployment.dll" geladen
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
Der Thread 'vshost.NotifyLoad' (0x8b34) hat mit Code 0 (0x0) geendet.
Der Thread '<Kein Name>' (0x8a4c) hat mit Code 0 (0x0) geendet.
Der Thread 'vshost.LoadReference' (0x8fe0) hat mit Code 0 (0x0) geendet.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Users\Tobi\Documents\Projekt_3_Verbrauchskennfeld(3)\Projekt_3_Verbrauchskennfeld\Projekt_3_Verbrauchskennfeld\bin\Debug\Projekt_3_Verbrauchskennfeld.exe" geladen, Symbole geladen.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Excel\14.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll" geladen
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\assembly\GAC_MSIL\office\14.0.0.0__71e9bce111e9429c\office.dll" geladen
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Dynamic\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Dynamic.dll" geladen
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "Anonymously Hosted DynamicMethods Assembly" geladen
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Drawing.resources\v4.0_4.0.0.0_de_b03f5f7f11d50a3a\System.Drawing.resources.dll" geladen
Eine Ausnahme (erste Chance) des Typs "System.Runtime.InteropServices.ExternalException" ist in System.Drawing.dll aufgetreten.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_de_b77a5c561934e089\mscorlib.resources.dll" geladen
Der Thread 'vshost.RunParkingWindow' (0x8574) hat mit Code 0 (0x0) geendet.
Der Thread '<Kein Name>' (0x9064) hat mit Code 0 (0x0) geendet.
Das Programm "[34852] Projekt_3_Verbrauchskennfeld.vshost.exe: Verwaltet (v4.0.30319)" wurde mit Code 0 (0x0) beendet.

das steht im debugging fenster kannst du damit etwas anfangen?

Moderiert von user profile iconTh69: Quote-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 20.05.13 18:03 
Nein. Da ist das Programm ja schon beendet und du bist am Problem vorbeigeschossen.

Stell mal Visual Studio so ein das es bei Exceptions immer sofort hält. Den Dialog findest du im Menu unter Debug/Exceptions. Dort mal bei den CLR Exception den Thrown haken setzen. Danach sollte (hoffentlich) die IDE dort halten wo das Problem auftritt von da aus läßt sich der Fehlergrund vielleicht weiter eingrenzen.

Edit : Ansonsten änder mal den Font auf was Windows typisches wie Tahoma und mach den Font größer. Bin bei der Font Klasse nicht ganz auf dem laufenden was der von dir verwendete Konstruktor da als Größeneinheit schluckt. 0.07 erscheint mir aber in jedem Größensystem irgendwie sehr klein.
tobi_2k6 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 20.05.13 18:10 
so ich bin das ganze jz mal nach der reihe durchgegangen:
ausblenden C#-Quelltext
1:
z.DrawString(aux, f, u, new Point(00), hdi);					

bei dieser Zeile springt das Prog zur Fehlermeldung.

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
tobi_2k6 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 20.05.13 18:19 
So jz hab ich die Schrift geändert und dicker gestellt jetzt kommt der Fehler nicht mehr
aber es wird nichts gezeichnet
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 20.05.13 18:22 
Dann zeig und den umgebenden Code insbesondere den woher z genau kommt.
tobi_2k6 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 20.05.13 18:27 
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
namespace Projekt_3_Verbrauchskennfeld
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //Bitmap erzeugen
            bmp = new Bitmap(pic.ClientSize.Width, pic.ClientSize.Height);
            z = Graphics.FromImage(bmp);
        }

        //------------------------------------------------------------------------------------------------------------------------------------
        //------------------------------------------------------------------------------------------------------------------------------------
        // Variablen
        //------------------------------------------------------------------------------------------------------------------------------------
        //------------------------------------------------------------------------------------------------------------------------------------


        int[] drehzahl;
        double[] drehmoment;
        double[] verbrauch;
        
        double minX;
        double maxX;
        double minY;
        double maxY;
        int scaleX;
        int scaleY;

        bool loaded = false;

        Bitmap bmp;
        Graphics z;



        //------------------------------------------------------------------------------------------------------------------------------------
        //------------------------------------------------------------------------------------------------------------------------------------
        // Methoden
        //------------------------------------------------------------------------------------------------------------------------------------
        //------------------------------------------------------------------------------------------------------------------------------------


        /// <summary>
        /// Daten aus Excel Datei laden und in Datenfelder schreiben
        /// </summary>
        private void LoadData()
        {
            try
            {
                //Filter und Startverzeichnis setzen
                ofd.Filter = "Exceldatei|*.xlsx";
                ofd.InitialDirectory = Application.StartupPath;

                //Formatierungshinweis für die Exceldatei anzeigen
                MessageBox.Show("Excel-Datei bitte wie folgt formatieren:\n1. Spalte: Verbrauch\n2. Spalte: Drehmoment\n3. Spalte: Drehzahl\n\n1. Zeile: Bezeichnung\n2. Zeile: Einheiten\nab 3. Zeile: Werte");

                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    Excel.Application xlApp;      //Excel starten
                    Excel.Workbook xlWorkBook;   // Dokument anlegen
                    Excel.Worksheet xlWorkSheet; // Blatt anlagen
                    object misValue = System.Reflection.Missing.Value;

                    xlApp = new Excel.Application();
                    xlWorkBook = xlApp.Workbooks.Open(ofd.FileName, 0true5,
                        """"true,
                        Microsoft.Office.Interop.Excel.XlPlatform.xlWindows,
                        "\t"falsefalse0true10);

                    xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);  //Zugriff auf erstes Sheet

                    //Letzte Zeile suchen, in der Werte eingetragen sind
                    Excel.Range lastRow;
                    lastRow = xlWorkSheet.get_Range("A1").get_End(Excel.XlDirection.xlDown);

                    //Datenfelder erzeugen
                    drehzahl = new int[lastRow.Row - 2];
                    drehmoment = new double[lastRow.Row - 2];
                    verbrauch = new double[lastRow.Row - 2];

                    //Daten in Datenfelder schreiben
                    for (int i = 3; i <= lastRow.Row; i++)
                    {
                        verbrauch[i - 3] = xlWorkSheet.get_Range("A" + i.ToString(),
                            "A" + i.ToString()).Value2;
                        drehmoment[i - 3] = xlWorkSheet.get_Range("B" + i.ToString(),
                            "B" + i.ToString()).Value2;
                        drehzahl[i - 3] = Convert.ToInt32(xlWorkSheet.get_Range("C" + i.ToString(),
                            "C" + i.ToString()).Value2);
                    }

                    xlWorkBook.Close(true, misValue, misValue);
                    xlApp.Quit();

                    releaseObject(xlWorkSheet);
                    releaseObject(xlWorkBook);
                    releaseObject(xlApp);

                    //Daten wurden geladen
                    MessageBox.Show("Daten wurden erfolgreich geladen!");
                    loaded = true;

                    pic.Invalidate();

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Fehler beim Laden der Daten:\n\n" + ex.Message);
            }
        }


        /// <summary>
        /// Achsen, Gitter und Datenpunkte in Bitmap zeichnen
        /// </summary>
        private void InBitmapZeichnen()
        {
            try
            {
                //Skalierung für X und Y Achse berechnen (z.B. bei 4860 / 500 = 9 (Integer) + 1 = 10) 10 * 500 = 5000 --> Maximalwert (Achsenlänge)
                scaleX = drehzahl.Max() / 500 + 1;
                scaleY = (int)drehmoment.Max() / 10 + 1;

                //Minimal- und Maximalwerte für die Matrix berechnen (X-Richtung: Achsenlänge +- 500, Y-Richtung: Achsenlänge +- 30
                minX = -500;
                maxX = scaleX * 500 + 500;
                minY = -30;
                maxY = scaleY * 10 + 30;

                //Breite und Höhe der Matrix
                double breite = maxX - minX;
                double hoehe = maxY - minY;

                //Skalierung für die Strichstärken bzw. Breiten/Höhen beim Zeichnen
                float mxscale = bmp.Width / (float)breite;
                float myscale = bmp.Height / (float)hoehe;

                z.Clear(pic.BackColor);
                z.SmoothingMode = SmoothingMode.AntiAlias;

                //Matrix erzeugen
                Matrix myMatrix = new Matrix();

                //Matrix skalieren
                myMatrix.Scale(bmp.Width / (float)breite,
                    bmp.Height / (float)hoehe);
                myMatrix.Translate((float)-minX, (float)-minY,
                    MatrixOrder.Prepend); //Nullpunkt positionieren

                //Matrix aufs Zeichnen anwenden
                z.Transform = myMatrix;

                //Achsen Zeichnen
                Pen pKoordx = new Pen(Color.Black, 1f / mxscale);
                Pen pKoordy = new Pen(Color.Black, 1f / myscale);
                z.DrawLine(pKoordy, 0, scaleY * 10, scaleX * 500, scaleY * 10);
                z.DrawLine(pKoordx, 000, scaleY * 10);

                //Teilung auf der X-Achse, Y-Achse
                Pen pKoord1y = new Pen(Color.Gray, (float)(0.5 / mxscale));
                Pen pKoord1x = new Pen(Color.Gray, (float)(0.5 / myscale));
                int x;
                for (x = 500; x <= scaleX * 500; x += 500)
                    z.DrawLine(pKoord1x, x, 0, x, scaleY * 10);

                for (x = 0; x < scaleY * 10; x += 10)
                    z.DrawLine(pKoord1y, 0, x, scaleX * 500, x);

                // ERROR
                //    //Beschriftung
                

                //Punkte einzeichnen
                SolidBrush b = new SolidBrush(Color.Red);
                int dfLenght = drehzahl.Length;
                for (int i = 0; i < dfLenght; i++)
                {
                    z.FillEllipse(b, (float)drehzahl[i] - 3 / mxscale, scaleY * 10 - ((float)drehmoment[i] + 3 / myscale), 6 / mxscale, 6 / myscale);
                }

                Font f = new Font("Tahoma"0.7f);
                Brush u = new SolidBrush(Color.Black);
                String aux = "0/0";

                StringFormat hdi = new StringFormat();

                hdi.Alignment = StringAlignment.Far; //horizontale Ausrichtung
                hdi.LineAlignment = StringAlignment.Center; //vertikale Ausrichtung

                z.DrawString(aux, f, u, new Point(00), hdi);

                hdi.Alignment = StringAlignment.Center; //horizontale Ausrichtung
                hdi.LineAlignment = StringAlignment.Near; //vertikale Ausrichtung

                for (x = 200; x <= scaleX * 300; x += 300)
                    z.DrawString(x.ToString(), f, u, new PointF(x, 0.7f), hdi);
            }


Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 21.05.13 09:28 
Hallo tobi_2k6,

von wo rufst du denn die Methode InBitmapZeichnen() auf?

Du solltest statt der vielen Membervariablen besser lokale Variablen benutzen (sofern sinnvoll), dann kann man deinen Code auch besser verstehen (und statt z solltest du die Variable dann besser graphics nennen).
Außerdem mußt du die GDI-Objekte (Pen, Brush, etc.) auch wieder disposen, d.h. benutze dafür am besten die using-Anweisung:
ausblenden C#-Quelltext
1:
2:
3:
4:
using (Pen p = new Pen(...))
{

}

Hierbei wird (auch im Falle einer Exception) automatisch Dispose am Ende des Blocks aufgerufen.
Zuviele (aktive) GDI-Objekte können nämlich einen "Not enough Handle"-Fehler erzeugen.