GDI Objekte wieder entfernen...



  • Oder etwas neues drüber malen 😉



  • marsupilami1 schrieb:

    nicht zeichnen & refreshen? lol

    wie meinst du das?

    wie kann ich denn etwas gezeichnetes auf einmal nicht zeichnen?
    gibts da ne funktion oda so?

    und wie tu ich refreshen?



  • Invalidate



  • oaky jetzt hab ich ein neues problem damit.

    ich möchte nach einem klick auf einen button, das alles weg ist und neue sachen gezeichnet werden. nur werden die dann nicht gezeichnet, es wird nur alles gelöscht.

    hier ein Codeschnipsel:

    if(LOWORD(wParam) >= 32 && LOWORD(wParam) <= 59 )
    {
            InvalidateRect(hWnd, NULL, TRUE);
    
    	logBrush.lbStyle = BS_HOLLOW;
    
    	hPen = CreatePen(PS_SOLID, 2, RGB(0,0,0));
    	hBrush = CreateBrushIndirect(&logBrush);
    	SelectObject(hdc, hPen);
    	SelectObject(hdc, hBrush);
    
    	Rectangle(hdc, 263, 102, 444, 300);
    
    	DeleteObject(hPen);
    	DeleteObject(hBrush);			
    }
    

    Info: nicht das ihr auf die idee kommt, das GetDC/ReleaseDC fehlt, das ist weiter oben und unten.



  • Zeichen tut man immer in WM_PAINT!!!



  • Jochen Kalmbach schrieb:

    Zeichen tut man immer in WM_PAINT!!!

    1. Frage: Warum?

    2. Frage: Dann ist doch das Rechteck schon gezeichnet bevor ich den button drücke?



  • 1. Weil das genzeichnet sonst z.B: verschwindet, wenn Du das Fenster Minimierst/maximierst oder mit einem anderen Fenster kurz überdeckt wird

    2. WAS Du in WM_PAINT zeichnest ist ja Dir überlassen; Du kannst dort auch erst ein Rechteck zeichnen wenn irgendwelche andere Bedingungen erfüllt wurden (z.B. Button gedrückt)



  • Jochen Kalmbach schrieb:

    1. Weil das genzeichnet sonst z.B: verschwindet, wenn Du das Fenster Minimierst/maximierst oder mit einem anderen Fenster kurz überdeckt wird

    2. WAS Du in WM_PAINT zeichnest ist ja Dir überlassen; Du kannst dort auch erst ein Rechteck zeichnen wenn irgendwelche andere Bedingungen erfüllt wurden (z.B. Button gedrückt)

    zu 1. Du hast recht! 🙂

    zu 2. wenn ich z.B. das schreibe passiert garnix in WM_PAINT:

    if(LOWORD(wParam) >= 32 && LOWORD(wParam) <= 59 )
    {
    	logBrush.lbStyle = BS_HOLLOW;
    
    	hPen = CreatePen(PS_SOLID, 2, RGB(0,0,0));
    	hBrush = CreateBrushIndirect(&logBrush);
    	SelectObject(hdc, hPen);
    	SelectObject(hdc, hBrush);
    	Rectangle(hdc, 263, 102, 444, 300);
    	DeleteObject(hPen);
    	DeleteObject(hBrush);			
    }
    


  • Bitte lies die Doku zu WM_PAINT...
    Du musst BeginPaint/EndPaint verwenden....



  • hmm.. finde da nix darüber 😞

    und BeginPaint/EndPaint is ja auch dabei. geht aba trozdem net


  • Mod

    Dann erkläre mal was der Quatch mit dieser Prüfung soll:

    if(LOWORD(wParam) >= 32 && LOWORD(wParam) <= 59 )
    {
    

    In WM_PAINT hat so etwas sicherlich ncihts zu suchen!

    Ansonsten zeige uns Deinen ganzen Code für WM_PAINT...



  • also,
    das soll bedeuten, das wenn ein button mit einer ID zwischen 32 und 59 gedrückt wird.
    das in der schleife gemacht werden soll. in WM_COMMAND hat das so funktioniert.
    in WM_PAINT sieht es jetzt so aus:

    case WM_PAINT:
           hdc = BeginPaint(hWnd, &ps);
    
           if(LOWORD(wParam) >= 32 && LOWORD(wParam) <= 59 )
           {
    	logBrush.lbStyle = BS_HOLLOW;
    
    	hPen = CreatePen(PS_SOLID, 2, RGB(0,0,0));
    	hBrush = CreateBrushIndirect(&logBrush);
    	SelectObject(hdc, hPen);
    	SelectObject(hdc, hBrush);
    
    	Rectangle(hdc, 263, 102, 444, 300);
    
    	DeleteObject(hPen);
    	DeleteObject(hBrush);		
           }
    
           EndPaint(hWnd, &ps);
           break;
    


  • Hmm.... was für eine Bedeutung hat den wParam in WM_PAINT!?



  • Jochen Kalmbach schrieb:

    Hmm.... was für eine Bedeutung hat den wParam in WM_PAINT!?

    ja das wird da garnicht benutzt 😞

    mit switch(message) gehts auch nicht.



  • okay. habe alles verstanden.

    noch eine frage zu InvalidateRect.

    ich brauche einen Pointer auf eine RECT-Struktur.

    wenn die variable von RECT rect ist, dann ist doch rect der Pointer oder?
    nur wenn ich das einsetzte wird der Fehler:

    "rect" nicht mit "const rect" kompatibel oder so ähnlich.



  • &rect



  • metapoint2011 schrieb:

    "rect" nicht mit "const rect" kompatibel oder so ähnlich.

    Ist es eigentlich zuviel verlangt, wenigstens die genauen Fehlermeldungen zu posten?
    Hintergrund: Wenn du die Fehlermeldung genau gelesen und dir eventuell ein paar Gedanken darüber gemacht hättest, wäre dein Post wohl überflüssig.
    InvalidateRect erwartet einen Zeiger auf eine RECT-Struktur, das const garantiert, dass die Member dieser Struktur nicht verändert werden.

    Was du wahrscheinlich machst:

    RECT rect;
    // Member setzen
    InvalidateRect(hwnd, rect, 0); // &rect wäre richtig
    

  • Mod

    Man kann auch einfach NULL übergeben. Dann wird das ganze Fenster neu gezeichnet.



  • ja das stimmt. nur dann tut jedesmal das ganze fenster so zucken..

    alle zahlen, das sind auch alles selbstgezeichnete buttons. das ist nämlich ein terminkalender.

    wenn ich z.b einen timer mach mit ner uhr, dann tut das jede sekunde so flackern.

    auf jeden fall gehts mit &rect.



  • Dann musst du dir double buffering angucken.


Anmelden zum Antworten