return 0;



  • hallo zusammen,

    der folgende Code ist von msdn. Aber er funktioniert nur, wenn ich die "return 0L;" als Kommentar korrigiere. Wer kann mir detailliert erklären, was nach "return 0L;" dann passiert? dank vorher!

    RECT rc; 
    HDC hdc;
    PAINTSTRUCT ps;
    POINT aptPentagon[6] =
                {50,2, 98,35, 79,90, 21,90, 2,35, 50,2 },
          aptHexagon[7]  =
                {50,2, 93,25, 93,75, 50,98, 7,75, 7,25, 50,2 };
    POINT* ppt = aptPentagon;
    int cpt = 6;
    
        switch (message)
         {
          case WM_CHAR : 
            switch (wParam) 
             {
              case '5' :
                ppt = aptPentagon; 
                cpt = 6; 
                break; 
              case '6' :
                ppt = aptHexagon; 
                cpt = 7; 
                break; 
             }
            InvalidateRect(hwnd, NULL, TRUE);
    /***************************************************
            // return 0L;
    ***************************************************/
    
          case WM_PAINT :
            hdc = BeginPaint(hwnd, &ps);
    
            GetClientRect(hwnd, &rc); 
            SetMapMode(hdc, MM_ANISOTROPIC); 
            SetWindowExtEx(hdc, 100, 100, NULL); 
            SetViewportExtEx(hdc, rc.right, rc.bottom, NULL);
    
            Polyline(hdc, ppt, cpt); 
            EndPaint(hwnd, &ps);return 0;
         }
    


  • Hi, das

    return 0L;
    

    solltest du schon unkommentiert stehen lassen. Durch

    InvalidateRect (hwnd, NULL, TRUE) ;
    

    wird sowieso WM_PAINT geschickt und ein Fall Through ist hier unnötig bzw. es würde dann zweimal der WM_PAINT-Block ausgeführt werden.

    Was genau meinst du denn damit, dass es nicht funktioniert? Wird nichts gezeichnet auf Drücken von "5" oder "6"?

    MfG WilMen



  • dank für Antwort.

    wenn ich das "return 0L;" unkommentiert (original von msdn) stehen lasse, wird nichts gezeichnet auf Drücken von "5" oder "6".

    deshalb verstehe ich auch nicht, wieso funktioniert das InvalidateRect nicht.



  • damo schrieb:

    wieso funktioniert das InvalidateRect nicht

    Das InvalidateRect funktioniert schon korrekt.

    Aber das, was InvalidateRect macht, wird erst "sichtbar" wenn die Anwendung ein WM_PAINT verarbeitet.

    Probier mal folgendes :

    case WM_CHAR : 
      (...)
      InvalidateRect(hwnd, NULL, TRUE);
      UpdateWindow  (hwnd);            // <- ein WM_PAINT auslösen via UpdateWindow
      return 0L;                       // <- muß bleiben
    


  • @merker

    danke sehr, aber es geht wieder nicht...



  • Oh, Du mußt das "case WM_CHAR" noch in geschweifte Klammern setzen :

    case WM_CHAR : 
     { // <- !
       switch (wParam)
       {
        case '5' :
        (...)    
         break;       // <- sonst würde er hier schon aus der "switch (message)" springen
        case '6' :    //    und erreicht InvalidateRect gar nicht erst
        (...)
         break;       // <- oder hier
       }
    
       InvalidateRect(hwnd, NULL, TRUE);
       UpdateWindow  (hwnd);  
       return 0L; 
     } // <- !
    


  • haha, ich weiss jetzt, was die Probleme sind:

    POINT aptPentagon[6] =
                {50,2, 98,35, 79,90, 21,90, 2,35, 50,2 },
          aptHexagon[7]  =
                {50,2, 93,25, 93,75, 50,98, 7,75, 7,25, 50,2 };
    POINT *ppt = aptPentagon;
    int cpt = 6;
    

    die 3 Variablen müssen als global definiert werden!
    (hab früher nicht die komplette Codes gegeben, Entschuldigung!)

    Ansonst, obwohl das WndProc die WM_PAINT von InvalidateRect bekommt, werden die 3 Variablen wieder neu definiert/initialisiert! (also dass ppt immer auf aptPentagon zeigt & cpt immer gleich 6 ist)

    ich danke euch noch mal.



  • Oweh, beachte meinen zweiten Beitrag bloß nicht. Der ist völliger Blödsinn. 😮


Anmelden zum Antworten