Problem bei Zeichnen von Komponente



  • Hallo,

    ich fange gerade an mit C++ und habe mich jetzt ein das erste Dialog-basierte Programm mit der WinAPI gewagt.

    Soweit klappt alles ganz gut, einzig ein Problem habe ich:

    Und zwar möchte ich ein Diagramm zeichnen. Um das zu erledigen habe ich einfach eine Label-Komponente auf dem Dialog platziert, in dessen Zeichen-Bereich ich zeichnen möchte.

    Das klappt auch ganz gut, jedoch NUR wenn ich das direkt während der Nachrichtenbehandlung von WM_PAINT in der CALLBACK-Methode meines Dialoges mache.

    Jedoch soll zunächst durch eine Benutzereingabe (Button - also WM_COMMAND) das Zeichnen ausgelöst werden.

    Und genau da liegt das Problem. Egal was ich versuche, ich kann außerhalb von WM_PAINT nicht auf der Komponente zeichnen. Und auch wenn ich den Zeichen-Code innerhalb von WM_PAINT platziere und über eine globale Variable vom Typ Bool überprüfe, ob der Button bereits ausgelöst wurde, klappt es nicht.

    Wie kann ich am Ende der Ereignisprozedur meines Buttons die Komponente bzw den ganzen Dialog dazu anregen, sich neu zu zeichnen??

    Ich habe es schon mit UpdateWindow(..), SendMessage(hDlg, WM_PAINT,wParam, lParam) und vieles mehr versucht, klappt jedoch alles nicht.

    Mein Zeichencode sieht etwa so aus:

    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hDlg,&ps);
    
    LineTo(hdc,100,100);
    
    EndPaint(hDlg,&ps);
    

    hDlg ist dabei das Handle des Dialogs, bzw. ich habe es auch schon mit dem Handle der Komponente das ich über GetDialogItem(..) bekomme, versucht.

    Vielen Dank für die Hilfe
    Mfg



  • Du sollst auch nicht außerhalb von WM_PAINT zeichnen.
    Du kannst eine globale/statische Variable anlegen wie bool zeichnen = false;

    Wenn man auf den Knopf drückt setzt Du die Variable auf true und rufst Invalidate (o.ä.) auf, dadurch wird neugezeichnet.

    In WM_PAINT überprüfst Du die oben angelegte Varaible, falls true zeichnest Du ansonsten nicht.



  • Danke schonmal für die Antwort.

    Ich habe gerade mal nachgeforscht, es scheint mir das Invalidate() eine Funktion der MFC ist, oder?

    Ich arbeite aber ohne die MFC, d.h. die Funktion steht mir nicht zur Verfügung.

    Gibt es keine ähnliche Methode, die auch ein Neuzeichnen auslöst?

    Wie gesagt, ich habe es schon mit SendMessage(.., WM_PAINT ..) oder UpdateWindow() versucht, klappt aber alles nicht.

    Mfg



  • Ok, hab gedacht in WinAPI heißt es auch Invalidate.
    Dann nimm RedrawWindow.



  • Danke, das hat geklappt!

    MFG


Anmelden zum Antworten