Probleme mit modalem Dialog

26/07/2010 - 00:02 von Peter Mairhofer | Report spam
Hi,

Ich bin dabei ein Plugin für ein Programm zu erstellen. Der
"Optionen"-Dialog für mein Plugin bereitet mir dabei aber etwas Sorgen.
Das Plugin (DLL) bekommt über eine Callbackfunktion mitgeteilt dass es
konfiguriert werden soll. In der Callbackfunktion starte ich den
"Optionen"-Dialog für mein Plugin. Zu diesem Zeitpunkt ist natürlich das
Hauptfenster des Programmes aktiv sowie ein zweites Fenster mit der
Liste aller Plugins. (Der Optionen-Dialog erscheint mit rechter
Maustaste-->Optionen auf ein Plugin in der Liste).

Ich weiss leider nicht genau wie ich es beschreiben soll, aber ich
versuche es einmal: Wenn ich meinen Einstellungsdialog aufrufe ist
dieser ganz normal im Vordergrund (blaue Titelleiste). Klicke ich dann
auf das im Hintergrund liegende Hauptfenster geht der Fokus meines
Dialogs verloren (d.h. die Titelleiste wird grau). Er bleibt allerdings
im Vordergrund. Das dürfte bei einem modalem Dialog ja schonmal nicht sein!

Das eigentliche Problem ist aber dass ich den Dialog durch durch einen
Klick auf ihn auch nicht mehr aktiv machen kann. Wechsle ich in ein
anderes Programm, so bleibt der Dialog zwar im Vordergrund, aber er wird
nicht mehr "aktiv" (blaue Titelleiste). Weiters ist auffàllig dass ich
den Dialog nicht verschieben kann und auch der Titel wird in der
Titelleiste nicht angezeigt, obwohl ich "Settings" als Titel angegeben
habe (siehe Definition unten)

Viel schlimmer noch: Wenn ich aus dem Dialog heraus eine MessageBox
ausführe komme ich gar nicht zur MessageBox! Es ist mir nicht möglich
diese zu bestàtigen, weder mit Maus, noch mit Tastatur.

Das ist die Definition des betreffenden Dialogs:

IDD_SETTINGS DIALOGEX 0, 0, 148, 90
STYLE DS_SYSMODAL | DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP |
WS_CAPTION | WS_SYSMENU
CAPTION "Settings"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "OK",IDOK,91,69,50,14
PUSHBUTTON "Cancel",IDCANCEL,7,69,50,14
[...]
END

Aufgerufen wird er ganz normal mit:

DialogBox(g_hDLL, MAKEINTRESOURCE(IDD_SETTINGS), hMain, SettingsWindowProc);

g_hDLL ist die HINSTANCE die an DllMain übergeben wird. hMain ist die
HWND des Hauptfensters des Hauptprogramms; allerdings bringt NULL keine
Änderungen.

Das hört sich jetzt ziemlich wirr an. Ich bin leider mit meinem Latein
am Ende und weiss gar nicht einmal wie ich das Problem beschreiben soll.

Für den Dialog habe ich auch schon alle möglichen Stile ausprobiert aber
es hat nichts wirklich gefruchtet.

Hat trotzdem irgendwer einen Tipp? Ist in der Definition des Dialogs
schlicht was falsch? Oder am Aufruf?


LG
Peter
 

Lesen sie die antworten

#1 Armin Zingler
26/07/2010 - 01:17 | Warnen spam
Am 26.07.2010 00:02, schrieb Peter Mairhofer:
STYLE DS_SYSMODAL | DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP |
WS_CAPTION | WS_SYSMENU



Ich bin jetzt nicht der große Spezi in dem Bereich, aber lies dir mal
den Kommentar zu DS_SYSMODAL durch:

http://msdn.microsoft.com/en-us/library/ff729172(VS.85).aspx

Ergo: Weglassen.
Dass der Dialog nicht modal ist: Ich kann mir nur vorstellen, dass die
Anwendung die Optionen-Dialoge für Plugins in einem eigenen (UI-)Thread
anzeigt. "Modal" ist threadspezifisch.

Armin

Ähnliche fragen