Re: Probleme mit modalem Dialog

26/07/2010 - 14:18 von Peter Mairhofer | Report spam
Hi Thorsten!

Danke für deine Antwort! Leider spinnt der Thunderbird gerade, deswegen
kann ich nicht quoten (lese deine Antwort gerade aus google groups).

Nein, ich meine wirklich *Titelleiste*! Also wie du in der Definition
meines Dialogs sehen konntest sollte dort "Settings" stehen. Tut es aber
nicht. Die Leiste (also die blaue Leiste mit dem X und so) ist leer.
Dort ist nur das X drauf, aber keine Schrift. Auch làsst sich der Dialog
beim Klick auf ebendiese Leiste nicht verschieben!

Die Sache mit den Window-Handles ist natürlich mal ein heisser Tipp. Es
ist so: Es gibt das Hauptfenster der Anwendung. Wenn man dort auf
"Plugins" klickt erscheint ein Dialog mit der Liste der Plugins. Und
dort kann man zu den Einstellungen der Plugins kommen (dort wo ich dann
meinen Dialog aufrufe).

Ich habe bisher das HWND des *Hauptfensters* der Anwendung genommen. Nun
habe ich testweise das Fenster mit der Liste der Plugins (!) mit
FindWindow gesucht und dieses HWND der DialogBox Funktion übergeben.

Das Ergebnis verbessert sich:
1.) Der Dialog erscheint nun modal
2.) Die Titelleiste bleibt immer "blau"
3.) Ein Aktivieren des Hauptfensters ist nicht mehr möglich

Allerdings: Nachwievor kein Titel, kein Verschieben und das schlimmste:
Nachwievor kann eine MessageBox nicht bestàtigt werden.

Das ist die Window Procedure:

INT_PTR CALLBACK SettingsWindowProc(HWND hwndDlg, UINT uMsg, WPARAM
wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG:
break;
case WM_COMMAND:
if(wParam == IDOK)
{
MessageBox(hwndDlg, "muh", "mah", 0);
EndDialog(hwndDlg, 0);
}
if(wParam == IDCANCEL)
EndDialog(hwndDlg, 0);
}
return DefWindowProc(hwndDlg, uMsg, wParam, lParam);
}

Wenn ich auf OK klicke dann kommt wie gesagt die Dialogbox "muh" aber
ich kann das OK einfach nicht bestàtigen! Hab auch bereits versucht NULL
oder die HWND des Hauptfensters der Anwendung zu verwenden. Aber das
Ergebnis bleibt das gleiche...

LG
Peter
 

Lesen sie die antworten

#1 Thorsten Albers
26/07/2010 - 15:21 | Warnen spam
Peter Mairhofer schrieb im Beitrag
<i2jue6$t71$...
INT_PTR CALLBACK SettingsWindowProc(HWND hwndDlg, UINT uMsg, WPARAM
wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG:
break;
case WM_COMMAND:
if(wParam == IDOK)
{
MessageBox(hwndDlg, "muh", "mah", 0);
EndDialog(hwndDlg, 0);
}
if(wParam == IDCANCEL)



Hier gehört ein "else if" hin (Paste'n'Copy-Fehler?), ist aber nicht von
Bedeutung.

EndDialog(hwndDlg, 0);
}
return DefWindowProc(hwndDlg, uMsg, wParam, lParam);



Du hast hier eine DialogBox-Prozedur, keine 'normale' Fenster-Prozedur. Der
Aufruf einer 'DefWindowProc()' ist nicht möglich, weil es für Deinen Dialog
eine solche in dem Sinne eigentlich gar nicht gibt. Die üblichen
Fensternachrichten für den Dialog werden von Windows verwaltet (samt einer
eigenen Nachrichtenschleife), die DialogBox-Prozedur dient nur dazu, auf
bestimmte Ereignisse zu reagieren, die abhàngig sind von der individuellen
DialogBox-Vorlage, also vor allem auf Schaltflàchen-Clicks.
Auf WM_INITDIALOG hin solltest Du also z.B. einfach TRUE zurückgeben, auf
WM_COMMAND hin TRUE oder FALSE.

Thorsten Albers

albers (a) uni-freiburg.de

Ähnliche fragen