Narf! Geschrieben 9. September 2004 Geschrieben 9. September 2004 Hallo an alle, ich habe ein Dialogfeld, in dem ich ein Static-Feld habe, was ständig Meldungen ausgeben soll. Mit SetDlgItemText(IDC_STATIC_xy, "Text") weise ich dem Feld den Text zu, aber es wird nicht aktualisiert, wenn ich das aus einer anderen Klasse mache: DlgKlasse.SetDlgItemText(IDC_STATIC_xy, "Text"); Ich habe es mit UpdateData(false/true) probiert, mit RedrawWindow, es hilft alles nichts. Weiterhin starte ich einen Prozess mit CreateProcess(). Wenn der beendet ist und sich das DOS-Fenster schliesst, bleibt auf meinem Dialog ein weißer Fleck, wo vorher das DOS-Fenster war. Auch hier halfen die o.g. Schritte nicht. Zitieren
FighterFigger Geschrieben 9. September 2004 Geschrieben 9. September 2004 Du kannst doch immer Variablen für Control und für Value bei Window-Objekten der MFC angeben ... so auch bei den Statics ... oder willst du das nicht? Dann legst du bei der Dialogklasse eine nette public Funktion an, die es dir erlaubt den Text zu ändern, indem sie den protected-Member (CString m_static_XY_Text) verändert. Nach UpdateData(false) sollte das eigentlich gehen. So bist du nicht von der Item-ID IDC_STATIC_xy abhängig, die vielleicht bei dir von Klasse zu Klasse unterschiedlich ist. Was den weißen Rest des Konsolen-Fensters angeht: schonmal Invalidate() versucht? Einfach auf das DialogObjekt anwenden. Zitieren
Narf! Geschrieben 9. September 2004 Autor Geschrieben 9. September 2004 Ich habe beide Variablen erstellt. Ich habe auch schon mit DlgKlasse.m_wStatic="Text", DlgKlasse.m_cStatic.SetDlgItemText() und UpdateData() gearbeitet, aber das selbe Ergebnis. Invalidate() probier ich mal. Zitieren
FighterFigger Geschrieben 9. September 2004 Geschrieben 9. September 2004 Kann es sein, daß du die Texte aus einer Funktion heraus ändern möchtest, die nicht so schnell beendet wird? Ein Dialog hat ja nur einen Thread (wenn ich das richtig sehe) und wenn du von dem aus eine Fuktion einer anderen Klasse startest, dann werden Aktualisierungen u.U. erst durchgeführt, wenn du wieder zurück bist und der Dialog Zeit hat, die Messages abzubauen. Vielleicht solltest du mal sagen, welche Klasse die Statics ändern möchte, wer das Objekt dieser Klasse erstellt, wer den Dialog erstalle ... sowas halt ... Zitieren
Narf! Geschrieben 10. September 2004 Autor Geschrieben 10. September 2004 Kann es sein, daß du die Texte aus einer Funktion heraus ändern möchtest, die nicht so schnell beendet wird? Ein Dialog hat ja nur einen Thread (wenn ich das richtig sehe) und wenn du von dem aus eine Fuktion einer anderen Klasse startest, dann werden Aktualisierungen u.U. erst durchgeführt, wenn du wieder zurück bist und der Dialog Zeit hat, die Messages abzubauen. Wenn dem so ist, wie kann ich dann eine Aktualisierung des Hauptdialogs erzwingen? Zitieren
Honkytonk Geschrieben 10. September 2004 Geschrieben 10. September 2004 Andere Frage: Hast du es mal mit der Eigenschaft SetWindowText des Static-Controls probiert? Gruß, Honky Zitieren
Narf! Geschrieben 10. September 2004 Autor Geschrieben 10. September 2004 Ja, auch diese Möglichkeit habe ich probiert. Zitieren
FighterFigger Geschrieben 10. September 2004 Geschrieben 10. September 2004 Du könntest (mal wieder ) deine Behandlungsfunktion in einen eigenen Thread auslagern. So blockierst du nicht den Thread des Dialogs, der sich dann sofort um die Aktualisierung kümmern kann. Allerdings weiß ich echt nicht 100%ig, ob das das Problem ist, schließlich sollte RedrawWindow doch die Mal-Funktionen aufrufen, und nicht nur eine Message schicken - oder? Wird denn der Dialog am Ende deiner Funktion - also wenn die Anwendung Idle ist (oder zumindest der Thread des Dialogs) ... wird dann der Dialog aktualisiert? Sorry - anderes fällt mir nicht ein. Zitieren
Narf! Geschrieben 10. September 2004 Autor Geschrieben 10. September 2004 Wenn die Funktionen beendet sind, wird der Dialog wieder aktualisiert und die letzten Werte angezeigt. Ich versuche gerade einen Thread mit UpdateData(false) zu starten. Mal sehen. Zitieren
Narf! Geschrieben 10. September 2004 Autor Geschrieben 10. September 2004 Das mit dem Thread funktioniert nicht: Die Funktion: void C[Program]Dlg::Aktualisieren() { UpdateData(false); }//end void C[Program]Dlg::Aktualisieren(void) Der Aufruf: DWORD IDAktualisieren; HANDLE hAktualisieren; hAktualisieren=CreateThread(NULL, 0, Aktualisieren, NULL, 0, &IDAktualisieren); Fehlermeldung: - Konvertierung des Parameters 3 von 'void (void) ' in 'LPTHREAD_START_ROUTINE' nicht möglich - Keine Funktion mit diesem Namen im Gültigkeitsbereich stimmt mit dem Zieltyp überein Die Funktion Aktualisieren ist definitiv vorhanden. Zitieren
FighterFigger Geschrieben 10. September 2004 Geschrieben 10. September 2004 Also - es geht mir nicht darum, den Aktualisierungsaufruf auszulagern. Du hast eine langwierige Funktion, die den Thread des Dialogs blockiert. Diese Funktion will den Dialog während der Arbeit verändern, die Aktualisierung wird aber erst nach der Funktion durchgeführt, wenn der Thread des Dialogs wieder Zeit für seinen Dialog hat, weil er nichtmehr deine Funktion beackert Also: Du packst deine komplette langwierige Funktion in einen eigenen Thread, während dessen Ausführung sich der Dialog beinahe langweilt. Ab und zu bekommt er dann von diesem zweiten Thread eine Meldung, daß er sich aktualisieren soll, und das tut er prompt - hat ja sonst nix mehr zu machen. --- Damit man bequem einen Thread machen kann schreibt man sich entweder eine globale Funktion *bibber* oder macht seine Methode static. Denn für den neuen Thread soll die Funktion nicht von einem speziellen Objekt abhängen. Benötigte Daten (wie deinen Dialog) kann man dann als Pointer übergeben - man könnte auch einen Funktionspointer zu einer Callback-Funktion übergeben - das wäre nicht dumm ... Wichtig ist - die Funktion benötigt folgende Signatur: UINT MyControllingFunction(LPVOID pParam); ... entweder global oder als static member ... dann sollte es gehen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.