Wie erzwinge ich Neuzeichnung des Hintergrunds eines EDITs?



  • EDIT: Doppelpost



  • Du solltest besser UpdateWindow(hwnd) verwenden um das Neuzeichnen eines Controls zu erzwingen.

    Warum nicht InvalidateRect?



  • Danke für die Frage.

    Der Zweck von InvalidateRect ist eigentlich der, dass es einen bestimmten Bereich im Fenster für ungültig erklärt. Wenn man den WM_PAINT Handler schlau programmiert hat, so wird nur jenes Rechteck bemalt, das zuvor von InvalidateRect für ungültig erklärt wurde (es werden natürlich mehrere Bereiche bemalt wenn InvalidateRect mehrmals aufgerufen wurde). UpdateWindow() hingegen veranlasst den Clientbereich des Fensters komplett neuzeichnen zu lassen, was man aber auch mit InvalidateRect(NULL, TRUE/FALSE) erreichen kann.



  • Das ist aber noch nicht alles, denn zu InvalidateRect steht auch noch folgendes:

    If you do not want the application to wait until the application's message queue has no other messages, use the UpdateWindow function to force the WM_PAINT message to be sent immediately. If there is any invalid part of the client area, UpdateWindow sends the WM_PAINT message for the specified window directly to the window procedure.



  • Erstens danke für die Antworten.
    Mein Problem mit dem Edit hatte ich auch vor 2 Monaten als ich mein erstes WINAPI-Programm schireb. Aber später habe ichs gelöst. Auch damals habe ich nirgends Hilfe finden können. Nun kann ich mich überhaupt cniht erinnern was die Lösung war da ich nach dem durchlesen von 1 WINAPI-Büchlein und dem kleinen texteditor bis vor ein paar tage nichts programmiet habe...

    Das Problem ist folgendes:

    Es kommt NUR dann der Schmiereffekt (weil der Hintergrund nicht repainted wird) wenn der Style ES_MULTILINE aktiv ist. Ansonsten nicht.
    Einer von euch wird doch irgendwann mal einen Editor geschrieben haben oder sonst wie ES_MULTILINE gestestet haben, sodass vielleicht jmd. die Lösung kennt.

    mal sehn...



  • Stell uns einen *minimalen* Quelltext zur Verfügung der das Problem zeigt.



  • Der minimale Quelltext:

    HWND hMain, hPath; //hMain ist Programmfenster
    TCHAR buffer[300]=TEXT("No local file has been selected.");
    //hPath ist der Handle des EDITS
    
    hPath = CreateWindow(TEXT("EDIT"), 
                         path,
                         WS_VISIBLE|WS_CHILD|BS_NOTIFY|ES_CENTER|WS_BORDER|ES_MULTILINE,// Der Fenster-Stil 
                         x_path, y_path, 308, 54,// Die Fenster-Abmessungen 
                         hMain,//Mutterfenster
                         reinterpret_cast<HMENU>(id_path),// ID 
                         hInstance,// Die Programminstanz 
                         NULL);
    


  • Hm, danke flenders. Ich war in der Annahme gegangen, dass UpdateWindow() nicht nur eine WM_PAINT Nachricht erzwingen würde sondern auch den gesamten Clientbereich invalidieren würde.

    Also vergisst wieder am besten alles was ich gesagt habe 🙄
    Um es (hoffentlich zum letzten mal) klarzustellen:

    InvalidateRect ruft man auf um einen Rechteck-Bereich des Clientfensters für ungültig zu erklären. Wenn man statt einem Rechteck NULL angibt, wird der gesamte Clientbereich als ungültig markiert.

    Mit UpdateWindow() bewirkt man, dass Windows sofort eine WM_PAINT Nachricht generiert anstatt zu warten bis es keine anderen Nachrichten mehr in der Nachrichtenschleife gibt.

    🙂



  • BS_NOTIFY

    Dein ernst?



  • ...? schrieb:

    BS_NOTIFY

    Dein ernst?

    lool.. ich ahbe beim erstellen des quellcodes erst mal den code für einen button gemacht und dann diesen 12 mal kopiert um alle steuerelemente zu erstellen und ahbe anshcließend jeweils die parameter der funktionen verändert..
    Aber schon dumm dass ich nen button-syle fürs edit-control eingesetzt ahbe..

    mal sehn ob der Fehler davon veursacht wurde...



  • Mist! Es hat sich nichts geändert.
    Solange ich ES_MULTILINE einsetze kommt der Fehler.

    Ist das vielleicht ein WINAPI-Bug?!?



  • Hallo Tolga, kannst du den Quelltext so posten, das ich ihn einfach in einen Compiler schmeißen kann? Also komplett, aber minimal.



  • Schon ok. Danke für deine Hilfe.

    Ich habe das problem umgangen und so ist es ehh schöner als es geworden wäre, wenn der fehler im edit nciht wäre.

    Die Sache hat sich erledigt. Sobald ich mein jetziges projekt fertig ahbe (dauert nen Monat) werde ich mit dem Crypto-Editor anfangen und dann werde ich ein mehrzeiliges EDIT sicher benutzen.

    Ich werde mich wahrscheinlich in nem Monat wieder an euch wenden.

    Cu all.


Anmelden zum Antworten