2016-04-19 2 views
-1

Lassen Sie sich meine Frage beschreiben, wie unten:Wie aktualisiert man Listview und Edit zur gleichen Zeit, wenn man winapi (C++) benutzt?

  1. Ich habe ein Fenster mit CreateWindow, und dann schaffte auch ein Listview und EDIT Feld zu zeigen, etwas geschaffen; hListview ist der Griff des Listview und hEdit ist der Griff der EDIT-Box

  2. Vorerst mein Programm ist eine Single-Threaded-App;

  3. Ich habe 2 Funktionen ungültig SetListviewText(): anderen Wert Listview ‚s angegebene Element und subitem zuweisen (die Listview im Berichtsmodus);

    und void SetEditBoxText(): einen Text anfügen Box natürlich zu bearbeiten, zu, beide mit SendMessage();

  4. Beispiel aktualisiert wurden,

    SetEditBoxText(hEdit, "1111111111111111111111111111111."); 
    SetListviewText(hListview, "Description1",19); 
    Sleep(1000); 
    SetEditBoxText(hEdit, "2222222222222222222222222222222"); 
    SetListviewText(hListview, "Description2",20); 
    SetEditBoxText(hEdit, "33333333333333333333"); 
    Sleep(5000); 
    
  5. Frage,

    , warum ich Nur kann die EDIT Box Inhalt wie folgt:

    111111 (Listview Text aktualisieren jetzt nicht)

    ....... 1 Sekunde Verzögerung .........

    2222222222222 (Listview Text jetzt nicht aktualisieren)

    3333333333333333 (Listview Text jetzt nicht aktualisieren)

    ....... 5 Sekunden Verzögerung .........

    (Listview Text Update schließlich nach 6 Sekunden ..)

    Description1

    Description2

Warum mit EDIT Feld zusammen aktualisiert werden nicht den Text der Listenansicht können?

PS: Wenn ich nur Code in Button-Klick-Fall unterschreiben, ist es in Ordnung, es sofort zu zeigen.

SetListviewText(hListview, "Description2",20); 

Sollte ich mehrere Threads verwenden? Wenn ja, wie?

Vielen Dank im Voraus.

+2

Sie können 'Sleep()' nicht in einem GUI-Thread verwenden. Verwenden Sie stattdessen Timer. – andlabs

+0

SendMessage (hListview, LVM_UPDATE, index, 0) oder InvalidateRect – nariuji

+0

Warum ist es für Sie ein Problem, dass Bildschirmaktualisierungen nicht sofort durchgeführt werden, aber Windows mehrere Änderungen erfasst und alle auf einmal anzeigt? Rufen Sie Sleep() wirklich in einem GUI-Thread auf oder dient dies nur zu Demonstrationszwecken? Vielleicht möchten Sie lesen http://stackoverflow.com/questions/2325894/difference-between-invalidaterect-and-redrawwindow. –

Antwort

0

Wenn Sie den Text in den Steuerelementen ändern, werden sie "ungültig", was bedeutet, dass sie mit den neuen Werten neu gezeichnet werden müssen. Das Malen geschieht nur, wenn die Nachrichtenschleife läuft. Da Sie Sleep für den einzigen Thread verwenden, wird die Nachrichtenschleife nicht ausgeführt.

Sie können einen Zeitgeber einrichten, um die Werte zu bestimmten Zeiten zu ändern, und dann zur Nachrichtenschleife zurückkehren, um Ihre Aktualisierungen zu ermöglichen.

Wenn Sie auf dem Hauptthread schlafen müssen, aber Sie wollen, dass die Windows-up-Repaint trotzdem, können Sie UpdateWindow auf den Steuerelementen kurz vor dem Aufruf von Sleep aufrufen.

+0

danke für die Erklärung. versuchte die UpdateWindow() und InvalidateRect (hListview, NULL, FALSE), die erste ist in Ordnung, aber die zweite zeigen immer noch den Text nach einigen Sekunden Verzögerung. – NYwalker

+0

@Nywalker: Richtig. InvalidateRect ist wahrscheinlich, was das Steuerelement intern verwendet, um zu sagen, dass es neu streichen muss. Das Repaint selbst wird nicht ausgeführt, es sei denn, die Nachrichtenschleife läuft (oder jemand ruft UpdateWindow auf). –

+0

Danke für Ihre Hilfe. – NYwalker

0

Wenn Sie den Text des Bearbeitungssteuerelements oder den Elementtext im Listensteuerelement festlegen, werden diese Steuerelemente (oder ein Teil davon) ungültig. Wenn Windows das nächste Mal darum geht, sie zu malen, würden Sie den neuen Inhalt sehen. Wenn Sie die Änderung sofort beobachten möchten, rufen Sie einfach UpdateWindow() für beide Steuerelemente an.

+0

Vielen Dank, UpdateWindow() ist Arbeit. – NYwalker

Verwandte Themen