Problem bei der initialisierung des hpen
-
guten abend,
ich würde gerne ein paar einfache formen in mein window zeichnen, leider habe ich probleme bei der erstellung eines hpen in der wm_paint. kann mir jemand von euch weiterhelfen? kann leider nicht viel mit der fehlermeldung anfangen, da ich gerade erst mit c++ angefangen habe.mein bisheriger code:
case WM_PAINT: PAINTSTRUCT ps; HDC hDC; // Handle des Device Context anfordern hDC = BeginPaint(hWnd,&ps); // drei neue Stift mit verschiedenen Farben und // Strichstärken erzeugen HPEN PenRed = CreatePen(PS_SOLID,3,RGB(255,0,0)); HPEN PenGreen = CreatePen(PS_SOLID,2,RGB(0,255,0)); HPEN PenBlue = CreatePen(PS_SOLID,1,RGB(0,0,255)); // den ersten Stift wählen und zwei Ellipsen zeichnen SelectObject(hDC,PenBlue); Ellipse(hDC,60,5,340,250); Ellipse(hDC,150,190,250,210); // den zweiten Stift wählen und zwei Rechtecke zeichnen SelectObject(hDC,PenGreen); Rectangle(hDC,110,40,160,80); Rectangle(hDC,240,40,290,80); // den dritten Stift wählen und drei Striche zeichnen SelectObject(hDC,PenRed); MoveToEx(hDC,200,120,NULL); LineTo(hDC,180,150); LineTo(hDC,220,150); LineTo(hDC,200,120); // die Stifte müssen wieder gelöscht werden DeleteObject(PenRed); DeleteObject(PenGreen); DeleteObject(PenBlue); // mitteilen, dass die Zeichenoperationen abgeschlossen sind EndPaint(hWnd,&ps); return 0; break;fehlermeldung:
error C2360: initialization of 'PenBlue' is skipped by 'case' label
vielen dank und einen schönen abend noch.
-
Das Problem tritt auf, wenn man solche Konstrukte baut:
// Sei T irgendein Typ switch(foo) { case 1: T t(0); break; case 2: // Die Variable t existiert hier zwar, ist aber nicht initialisiert // Dieses Verhalten ist so unsicher, dass du einen Fehler bekommst break; }Lösung: Zieh Variablen die du in allen cases brauchst aus dem switch heraus. Für Variablen die nur innerhalb eines cases gebraucht werden, machst du einen neuen Scope auf.
-
Bei solchen Fehlermeldungen hilft es manchmal die Hilfe aufzurufen bzw. nach dem Fehler zu googeln. Oft bietet Microsoft gleich einen passenden Hinweis zur Lösung.
Z.B.: http://msdn.microsoft.com/de-de/library/61af7cx3(VS.80).aspx
Sollte den Fehler eigentlich auch beseitigen.
-
super vielen dank. ich hab die pens vor den switch gepackt und auch erst dahinter gelöscht. alles super. vielen dank für die schnelle hilfe. und danke für den link zur hilfe, da muss ich wohl öfter reingucken
, ist ja ganz gut erklärt.
-
Für lokale Variablen nur innerhalb eines case ist (wie SeppJ schon schrieb) ein eigener Scope besser, d.h.
case WM_PAINT: { // <- Scope-Anfang // Handle des Device Context anfordern HDC hDC = BeginPaint(hWnd,&ps); ... return 0; // kein break mehr nötig (s. P.S.) } // <- Scope-EndeP.S.: Du brauchst auch nur entweder 'break' oder 'return' am Ende der case-Anweisung anzugeben.
-
danke, dann werde ich das mal aufräumen.