Autor Beitrag
brainkopf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 57

Win XP; Win 7
C# (VS 2005/2008)
BeitragVerfasst: Di 07.07.09 11:07 
Hi,
ich muss für die Berufsschule gerade ein kleines Programm schreiben.
Ich habe eine PictureBox und einen Timer. Pro Intervall des Timers werden Linien auf die PictureBox gezeichnet.
Soweit so gut, der Lehrer meinte jetzt aber, wir sollen das erfolgreiche Zeichnen mit einer bool Funktion überprüfen.

Nur wie soll ich das machen? Hab sowas noch nie gemacht und der Lehrer ist extrem inkompetent.

Vielen Dank schon mal im voraus!

Gruß
brainkopf
JasonDelife
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81

Windows 7 Professional
C# (Visual Studio 2008 Professional), Java (NetBeans IDE 6.7)
BeitragVerfasst: Di 07.07.09 15:12 
Wenn das zeichnen nicht erfolgreich ist, so wird in (On)Paint(...) eine Exception geworfen.
Das heißt, du kannst ein bool-Member "paintSuccessful" machen und in (On)Paint(...) setzt du ihn als letzte Anweisung des try-Blocks auf true und im catch-Block auf false.
Aber wozu das ganze eigentlich?

Grüße, JasonDelife.
brainkopf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 57

Win XP; Win 7
C# (VS 2005/2008)
BeitragVerfasst: Di 07.07.09 15:41 
Danke erstmal, aber
das hab ich noch nicht so ganz verstanden.

Ich zeichne mit:

ausblenden C#-Quelltext
1:
2:
3:
Graphics gr = Graphics.FromHwnd(linien_pictureBox.Handle);
Pen p1 = new Pen(Color.FromArgb(first_color, second_color, third_color), 1);
gr.DrawLine(p1, x_middle, y_middle, ix, 0);


Das ist im Timer_Tick drin.

Laut Lehrer muss das aber in eine bool Funktion.
Nur wie soll das Funktionieren?
Im Timer dann mit try und catch die bool Funktion aufrufen?

Wozu das ganze? Ich hab keine Ahnung, finde diese Abfrage nach erfolgreichem Zeichnen selbst sinnlos.

Gruß
JasonDelife
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81

Windows 7 Professional
C# (Visual Studio 2008 Professional), Java (NetBeans IDE 6.7)
BeitragVerfasst: Di 07.07.09 15:51 
So geht das:
ausblenden 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:
private bool Draw() {
 bool succes;
 Graphics gr;
 Pen p1;
 try {
  //gr = Graphics.FromHwnd(linien_pictureBox.Handle);
  // BESSER:
  gr = linien_pictureBox.CreateGraphics();
  p1 = new Pen(Color.FromArgb(first_color, second_color, third_color), 1);
  gr.DrawLine(p1, x_middle, y_middle, ix, 0);
  succes = true// Alles ok. Evtl. noch ein if(), wenn was anderes geprüft werden muss.
 } catch { // Wenn irgendwas schiefgeht
  succes = false// wird succes auf false gesetzt
 } finally {
  // Die Ressourcen des Stiftes freigeben
  p1.Dispose();
  // IMMER AUSSERHALB VON (ON)PAINT GRAPHICS.DISPOSE() AUFRUFEN!!!
  // Sonst werden die Ressourcen nicht rechtzeiting freigegeben.
  gr.Dispose();
 }
 return succes; // Gib den Erfolgsstatus zurück
}

private void timer1_Tick(...) {
 bool ok = Draw();
 if(ok) /* Tue was */;
 else /* Tue was anderes */;
}


Grüße, JasonDelife.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 07.07.09 16:19 
Sorry, aber das ist alles ganz großer Blödsinn.

Das Zeichnen sollte nur im Paint-Event der PictureBox geschehen und ein Neuzeichnen wird mittels 'PictureBox.Invalidate()' angestossen.
Und im Paint-Event sollte mittels e.Graphics gezeichnet werden (und KEIN CreateGraphics() verwendet werden!!!)

Und das Überprüfen ergibt überhaupt keinen Sinn, denn das Zeichnen macht Windows dann automatisch...

Hier ein sehr gutes Tutorial zum Thema "Zeichnen": www.mycsharp.de/wbb2...d.php?threadid=21782
JasonDelife
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81

Windows 7 Professional
C# (Visual Studio 2008 Professional), Java (NetBeans IDE 6.7)
BeitragVerfasst: Di 07.07.09 16:39 
@Th69
Ja, du hast recht. Das habe ich völlig übersehen. :(
Und das mit dem bool ist auch Schwachsinn.

Also hier die bessere Lösung:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
private linien_pictureBox_Paint(object sender, paintEventArgs e) {
 Graphics gr = e.Graphics;
 Pen p1 = new Pen(Color.FromArgb(first_color, second_color, third_color), 1);
 gr.DrawLine(p1, x_middle, y_middle, ix, 0);
 // In Paint kein Dispose()
}

private void timer1_Tick(object sender, EventArgs e) {
 linien_pictureBox.Invalidate();
}


Grüße, JasonDelife.
brainkopf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 57

Win XP; Win 7
C# (VS 2005/2008)
BeitragVerfasst: Di 07.07.09 16:53 
Ich weiß dass das mit dem bool der größte Schwachsinn ist, den man sich vorstellen kann,
aber Vorgabe ist nun mal leider Vorgabe... leider :/
JasonDelife
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81

Windows 7 Professional
C# (Visual Studio 2008 Professional), Java (NetBeans IDE 6.7)
BeitragVerfasst: Di 07.07.09 17:10 
Stimmt. Normalerweise ist es auch so, dass das Zeichnen glattläuft. Und wenn nicht, dann wird eine Exception geschmissen. Aber das ist selten und wenn, dann meistens nicht wegen des Zeichnens sondern wegen einer falschen Berechnung innherahlb von Paint.
Was genau ist denn gemaint mit "überprüfen"?
1. Ob es gezeichnent wurde?
2. Ob die Linie noch innerhalb des sichtabren Bereiches ist?
Denn eigentlich lässt sich nichts so richtig überprüfen, was mit dem Zeichnen direkt zu tun hat (außer 2).

Grüße, JasonDelife.
brainkopf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 57

Win XP; Win 7
C# (VS 2005/2008)
BeitragVerfasst: Di 07.07.09 19:12 
Wie ich das verstanden habe, soll geprüft werden, ob alles richtig gezeichnet wurde.
Im Arbeitsauftrag steht "Funktion bool zeichne(...)"

Da bool ja immer true oder false ist, muss ja irgendwas überprüft werden.
Falls nichts überprüft werden sollte, wärs ja dumm ein bool zu nehmen.
InCoBra
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 43



BeitragVerfasst: Do 09.07.09 15:28 
Naja, also du könntest entweder gucken, ob eine Exception ausgelöst wird oder, was ich für völligen Schwachsinn halte, du könntest hinterher die Pixel, die beim Zeichnen verändert wurden (werden sollten), überprüfen. Aber frag doch nochmal wegen der Vorgabe nach, weil ich sehe, wie die meisten anderen hier auch, nicht wirklich einen Sinn darin...

Gruß