Zum Inhalt springen

Darstellungsfehler des Dialogfeldes


Narf!

Empfohlene Beiträge

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du könntest (mal wieder rolleyes.gif) 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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :rolleyes:

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...