Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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

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

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

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]

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:

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?

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

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

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.

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:

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

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.

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.

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.

Man lernt nie aus :)

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.