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.


  • Mod

    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-Ende
    

    P.S.: Du brauchst auch nur entweder 'break' oder 'return' am Ende der case-Anweisung anzugeben.



  • danke, dann werde ich das mal aufräumen.


Anmelden zum Antworten