Zwei Fragen zum Zeichnen



  • Vor kurzem habe ich mal mit WinApi Programmierung angefangen. Um das zu testen habe ich einfach ein Programm geschrieben, das ein Rechteck zeichnet. Dazu zwei Fragen:
    Kann ich die Farbe des Rechtecks ändern, also Rahmen und Füllfarbe?
    Wie kann ich mehrere Rechtecke zeichnen? Bei WM_LBUTTONDOWN wird die Mausposition in zwei globalen Variablen gespeichert und bei WM_LBUTTONUP mit den Variablen und der aktuellen Position das Rechteck geszeichnet. Das funktioniert aber nur einmal. Der Debugger bleibt jedes mal bei Rectangle() stehen, aber es wird halt nur beim ersten mal gezeichnet.



  • Hi Dussel,

    Dussel schrieb:

    Kann ich die Farbe des Rechtecks ändern, also Rahmen und Füllfarbe?

    Klar, das geht.

    Dussel schrieb:

    Wie kann ich mehrere Rechtecke zeichnen?

    Wo ist das Problem ? (Ich weiß ja nicht wie dein bisheriger Ansatz aussieht 😉 .)

    Dussel schrieb:

    Bei WM_LBUTTONDOWN wird die Mausposition in zwei globalen Variablen gespeichert und bei WM_LBUTTONUP mit den Variablen und der aktuellen Position das Rechteck geszeichnet. Das funktioniert aber nur einmal. Der Debugger bleibt jedes mal bei Rectangle() stehen, aber es wird halt nur beim ersten mal gezeichnet.

    Zeig mal den Code...Was sagt dir denn der Debugger, ... ➡ Access-Violation ?

    PS: Globale Varialben sollte man nach Möglichkeite vermeiden 💡 .



  • Ok, war ungenau:
    Zu den globalen Variablen: Habe gerade im Buch das Schlüsselwort static gefunden.
    Quelltext habe ich gerade nicht hier sieht aber in der callback (der Nachrichtenfunktion) so aus:

    PAINTSTRUCT ps;
    HDC hDC;
    switch(message){
    case WM_LBUTTONDOWN:
    x=LOWORD(lParam);
    y=HIWORD(lParam);
    retun 0;
    case WM_LBUTTONUP:
    hDC=beginPaint(hWnd,&ps);
    Rectangle(hDC,x,y,LOWORD(lParam),HIWORD(lParam));
    EndPaint(hWnd,&ps);
    return 0;
    }
    

    Bin jetzt mit LOWORD und HIWORD nicht sicher, kann umgekehrt sein und statt lParam auch wParam.
    Der Debugger gibt keinen Fehler aus, ich wollte nur wissen, ob beim zweiten Mal die Funktion Rectangle noch aufgerufen wird, weil der dann halt nichts mehr zeichnet. Ich glaube man müsste das Fenster irgendwie aktualisieren.
    Dann noch: Wie ändert man denn die Farben?



  • Also man sollte BeginPaint/EndPaint sowieso NUR unter WM_PAINT aufrufen 😉 .



  • Also:

    static int xa,xe,ya,ye;
    switch(message){
    case WM_LBUTTONDOWN:
    xa=LOWORD(lParam);
    ya=HIWORD(lParam);
    return 0;
    case WM_LBUTTONUP:
    xe=LOWROD(lParam);
    ye=HIWORD(lParam);
    return 0;
    case WM_PAINT:
    hDC=BeginPaint(hWnd,&ps);
    Rectangle(hWnd,xa,ya,xe,ye);
    EndPaint(hWnd,&ps);
    return 0;
    }
    

    oder wie? Wird dann das fenster aktualisiert?



  • Dussel schrieb:

    Wird dann das fenster aktualisiert?

    Via InvalidateRect.

    Aber wenn Du während der Mausbewegung was Zeichnen willst, ist es eine der wenigen Ausnahmen, wo man mal direkt zeichen sollte... Dann sollte man GetDC verwenden.
    Siehe:
    http://www.codeproject.com/gdi/paint_beginner.asp



  • Ok, danke, werde mal rumprobieren


Anmelden zum Antworten