Visual C++ WM_XY



  • Hallihallo,

    ich habe eine Resource-Dialogbox als Hauptfenster.
    Diese Dialogbox enthält ein mehrzeiliges Textfeld, welches ich ständig aktualisieren und möglicherweise dann eben auch ändern möchte.
    Das geht ja relativ einfach mit GetDlgItemText() und SetDlgItemText(), mir ist jedoch nicht klar, wie ich es nun ständig aktualisieren kann.
    Ich dachte da an ein WM_-case bei switch(msg), welches standardmäßig durchgeführt wird ohne direkt aufgerufen worden zu sein, also so etwas wie "WM_DEFAULT".

    Gibt es sowas oder hat jemand eine andere Idee wie ich mein Textfeld aktualisieren kann?

    lg Max



  • Warum ständig aktualisieren?

    Aber ok. Auf die schnelle nur das:

    Timer, Intervall einstellen, UpdateWindow() bzw. Invalidate aufs Edit.

    grüssle 🙂



  • Smitty schrieb:

    Warum ständig aktualisieren?

    Aber ok. Auf die schnelle nur das:

    Timer, Intervall einstellen, UpdateWindow() bzw. Invalidate aufs Edit.

    grüssle 🙂

    Ich glaub das brauchst du nicht mal. Leg eine Membervariable an, ändere deren Wert und rufe UpdateData(false) auf. Den Rest dürfte das Editfeld selber machen. UpdateWindow kann unschönes Flackern erzeugen wenn die Aktualisierungszeiten relativ klein werden.
    Ansonsten das mit dem Timer würde ich auch so machen.


  • Mod

    Wenn zwischendrin, die Messageloop an die Reihe kommt, (du also einfach über einen Timer arbeitest), dann musst Du gar nichts machen. Nur ein gewisses Flackern wird sich nicht vermeiden lassen. Evtl. lässt sich das mit einem direkten UpdateWndow, nach SetWindowText in der Timerroutine etwas eingrenzen.

    EDIT: Habe ich vergessen. Wenn Du Text hinzufügst solltest Du in jedem Fall ReplaceSel verwenden!



  • MaDsTyLe schrieb:

    ...
    Diese Dialogbox enthält ein mehrzeiliges Textfeld, welches ich ständig aktualisieren und möglicherweise dann eben auch ändern möchte...

    lg Max

    hi ihr zwei,

    ja ne - is klar. Das ständig aktualisieren hat mich etwas verwirrt. Steht nicht dabei, in welchen Abständen.

    grüssle 🙂



  • Martin Richter schrieb:

    Wenn zwischendrin, die Messageloop an die Reihe kommt, (du also einfach über einen Timer arbeitest), dann musst Du gar nichts machen. Nur ein gewisses Flackern wird sich nicht vermeiden lassen. Evtl. lässt sich das mit einem direkten UpdateWndow, nach SetWindowText in der Timerroutine etwas eingrenzen.

    EDIT: Habe ich vergessen. Wenn Du Text hinzufügst solltest Du in jedem Fall ReplaceSel verwenden!

    Das sollte der Fall sein, sonst hat das mit dem Timer keinen Sinn. Ich hab da in einem Beispiel Messwerte, die sich alle 100 ms updaten. Mit dem reinen UpdateData funktioniert das recht gut, den Rest macht ja das Anwendungsgerüst.

    Smitty schrieb:

    MaDsTyLe schrieb:

    ...
    Diese Dialogbox enthält ein mehrzeiliges Textfeld, welches ich ständig aktualisieren und möglicherweise dann eben auch ändern möchte...

    lg Max

    hi ihr zwei,

    ja ne - is klar. Das ständig aktualisieren hat mich etwas verwirrt. Steht nicht dabei, in welchen Abständen.

    grüssle 🙂

    Ich denke kürzere Zeiten machen keinen Sinn. Ist ja nur Text. So schnell ist kein Auge.



  • Vielen Dank für Eure Antworten!

    Leider habe noch nie mit einem Timer gearbeitet.

    Also es geht darum über einen socket auf Daten zu warten und jedes Mal, wenn neue Daten vorhanden sind, diese im Textfeld anzuzeigen.

    Auf jeden Fall wäre es nett, wenn mir jemand einen Link geben könnte, wo ich was über den Timer, bzw UpdateWindow() lesen kann.

    @Martin: ReplaceSel?

    lg Max



  • Die Lösung mit dem Timer läuft letztlich darauf hinaus, daß du zyklisch abfragen müsstest, ob sich etwas geändert hat - wie erkennst du denn bisher, ob Daten da sind?



  • Naja ganz einfach:

    char Text[10000] = "";
    char Buffer[256] = "";
    
    recv(Socket,Buffer,256,0);
    
    GetDlgItemText(hDlg,TEXT_WINDOW,Text);
    
    if (Buffer[0] != '\0') SetDlgItemText(hDlg,TEXT_WINDOW,Merge(Text,Buffer));
    
    Buffer[0] = '\0'; //Zurücksetzen
    

    Merge() macht nichts anderes als sprintf_s(result,"%s\r\n%s",Text,Buffer) und dann natürlich return result.

    Aber ich weiß eben nicht, wie ich das jetzt immer wieder durchführen lassen kann.

    lg Max


Anmelden zum Antworten