Zum Inhalt springen

MFC: Dialog im Vordergrund, aber nicht modal


Technician

Empfohlene Beiträge

Hallo,

wenn ich mit DoModal ein Dialogfeld anzeigen lasse, so ist dies innerhalb der Anwendung immer im Vordergrund (da ja nichts anderes angeklickt werden kann, bis das Dialogfeld geschlossen wird).

Nun möchte ich aber folgendes erreichen:

das Dialogfeld soll sich stets im Vordergrund befinden, aber man soll trotzdem etwas anderes in der Anwendung anklicken können.

(exakt so wie der Suchen-Dialog in Word - da kann man auch, während das Dialogfeld geöffnet ist, in den Text klicken, ohne dass das Dialogfeld verschwindet).

Ich hoffe, ihr könnt mir da weiterhelfen!

Grüße,

Technician

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Technician

:confused:

wie ich aus der MSDN entnehme, erstelle ich damit auch wieder einen modalen Dialog?!

"CDialog::InitModalIndirect

Call this member function to initialize a modal dialog object using a dialog-box template that you construct in memory."

Was ist mit CDialog::Create? Laut MSDN wird damit ein nichtmodaler Dialog erstellt,

nur weiß ich nicht ob er damit auch direkt dargestellt wird. Wenn nicht könntest

du ihn ja mit ShowWindow() darstellen und immer wenn er in den Hintergrund

gerät, wieder hervor hohlen.

Gruß

Guybrush

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

Originally posted by 007ski

hast Du die beide Methoden versucht ???

funktioniert es ??

ich hab jetzt mal folgendes gemacht:

SearchTreeDialog std;

std.Create(IDD_SEARCHTREEDIALOG, this);

std.ShowWindow(SW_SHOW);

Ergebnis: ich seh das Dialogfeld ganz kurz aufflackern, dann verschwindet es wieder

:confused:

Woran liegt das?

Gruß,

Technician

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Technician

Hallo,

ich hab jetzt mal folgendes gemacht:

SearchTreeDialog std;

std.Create(IDD_SEARCHTREEDIALOG, this);

std.ShowWindow(SW_SHOW);

Ergebnis: ich seh das Dialogfeld ganz kurz aufflackern, dann verschwindet es wieder

:confused:

Woran liegt das?

Gruß,

Technician


SearchTeeeDialg *std = new SearchTeeeDialg(this);
std->Create(SearchTeeeDialg::IDD);
std->ShowWindow(SW_SHOW);
[/PHP]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Guybrush Threepwood

Was ist denn SearchTreeDialog für eine Klasse?

Es handelt sich um einen ganz normalen Dialog, mit (derzeit) noch keiner weiteren Funktionalität.

Originally posted by Guybrush Threepwood

Ist der Dialog dann irgendwo im Hintergrund oder wird er geschlossen?

Der Dialog befindet sich nicht im Hintergrund - wird also geschlossen.

Das passiert auch, wenn bei den Dialog-Eigenschaften "Systemmodal" ausgewählt ist (was ich jetzt testweise mal gemach habe) :confused:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Technician

Der Dialog befindet sich nicht im Hintergrund - wird also geschlossen.

Das passiert auch, wenn bei den Dialog-Eigenschaften "Systemmodal" ausgewählt ist (was ich jetzt testweise mal gemach habe) :confused:

Tritt irgendwo ein Fehler auf? Oder könnte es evtl an dem Dialog selber liegen?

Sind da vielleicht irgendwelche Common Controls drin ohne das sie initialisiert

wurden?

Link zu diesem Kommentar
Auf anderen Seiten teilen

ja, das funktioniert jetzt:

//das hier geht

SearchTreeDialog *std = new SearchTreeDialog(this);

std->Create(SearchTreeDialog::IDD);

std->ShowWindow(SW_SHOW);

/*

//und den code hatte ich zuerst drin - das hat nicht funktioniert!

SearchTreeDialog std;

std.Create(IDD_SEARCHTREEDIALOG, this);

std.ShowWindow(SW_SHOW);

*/

Danke :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Guybrush Threepwood

Naja, für mich ist das aber jetzt nicht so logisch warum das funktioniert und das

andere nicht. Kann mir das mal einer erklären?

Es funktioniert so und so, allerdings die erste Methode ist viel besser ;))

Warum beim Technician es nicht funktioniert hat ist das, dass er sich

SearchTreeDialog bestimmt lokal deklariert hat und nicht global

Link zu diesem Kommentar
Auf anderen Seiten teilen

Genauso ist es. Technician hat in ihrem ersten Versuch eine lokale Instanz der Dialogklasse angelegt. Die wird aber - wie jede andere Autovariable auch - zerstört, sobald ihr Gültigkeitsbereich verlassen wird. Und damit wird auch der Dialog wieder geschlossen. Dies kann man z.B. verhindern, indem man die Instanz mit new erzeugt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Klotzkopp

Genauso ist es. Technician hat in ihrem ersten Versuch eine lokale Instanz der Dialogklasse angelegt. Die wird aber - wie jede andere Autovariable auch - zerstört, sobald ihr Gültigkeitsbereich verlassen wird. Und damit wird auch der Dialog wieder geschlossen. Dies kann man z.B. verhindern, indem man die Instanz mit new erzeugt.

Es macht aber doch keinen unterschied ob ich einen Zeiger oder eine normale

Variable lokal definiere. Nach dem verlassen des Güligkeitsbereichs sind doch

beide ungültig.:confused:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Guybrush Threepwood

Es macht aber doch keinen unterschied ob ich einen Zeiger oder eine normale

Variable lokal definiere. Nach dem verlassen des Güligkeitsbereichs sind doch

beide ungültig.:confused:

Das denke ich auch...

Warum

SearchTreeDialog std;

std.DoModal();

mit einer lokalen Variable funktioniert, ist mir klar:

Der Gültigkeitsbereich kann ja nicht verlassen werden, solange der Dialog noch geöffnet ist. (nach DoModal geht's erst weiter, wenn der Dialog geschlossen wurde)

Nur der Unterschied, warum das mit dem Create mit einem Zeiger, aber nicht mit einer "normalen" Variablen "ordnungsgemäß" funktioniert, ist mir ganz und gar nicht klar!

Grüße,

Technician

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Technician

Nur der Unterschied, warum das mit dem Create mit einem Zeiger, aber nicht mit einer "normalen" Variablen "ordnungsgemäß" funktioniert, ist mir ganz und gar nicht klar!

Das einzige was ich mir noch denken könnte wäre das bei einer "normalen" Variable

beim Verlassen des Gültigkeitsbereichs automatisch der Destruktor aufgerufen

wird, woduch der Dialog beendet wurde. Den Zeiger muß man ja selber

wieder mit delete freigeben, wodurch der Destruktor aufgerufen wird.

Da der Zeiger aber nicht gelöscht wird, bleibt der Dialog offen, der Zeiger

wird ungültig und es ist kein Bezug zu dem offenen Dialog mehr vorhanden, das

würde aber bedeuten das das äußerst unsauber ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Guybrush Threepwood

Da der Zeiger aber nicht gelöscht wird, bleibt der Dialog offen, der Zeiger

wird ungültig und es ist kein Bezug zu dem offenen Dialog mehr vorhanden, das

würde aber bedeuten das das äußerst unsauber ist.

Richtig. Ich sagte ja auch nur "z.B." ;)

Normalerweise würde man den Zeiger als Member einer anderen Klasse deklarieren, so dass man später auch noch auf den Dialog zugreifen kann, und ihn, wenn man ihn nicht mehr braucht, freigeben kann.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Klotzkopp

Richtig. Ich sagte ja auch nur "z.B." ;)

Normalerweise würde man den Zeiger als Member einer anderen Klasse deklarieren, so dass man später auch noch auf den Dialog zugreifen kann, und ihn, wenn man ihn nicht mehr braucht, freigeben kann.

Ok, dann ist mir alles klar.

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