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.
