Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

MessageBox e CreateDialog

13 views
Skip to first unread message

Franco

unread,
Nov 27, 2013, 5:57:28 AM11/27/13
to
Salve,
premetto che pur essendo programmatore C/C++ da decenni, ho sempre
lavorato in ambienti x e rarissime volte in windows, e spesso usando
framewors come mfc e qt, ma adesso avrei la necessitᅵ di scrivere un
programma per eseguire compiti semplici, e vorrei lavorare a livello un
po' piᅵ basso.
Ho praticamente scritto tutto il codice creando finestra e controlli con
le funzioni CreateWindow/CreateWindowEx e tutto ᅵ andato per il meglio,
ma quando ho provato ad usare un file di risorse e la funzione
CreateDialog, ho notato immediatamente una cosa abbastanza anomala:
nonostante la dialog si apra correttamente, ogni chiamata a MessageBox,
apre la finestra di messaggio ma poi ᅵ impossibile richiuderla, sembra
non attiva e non funziona il tasto OK.
Qualcuno saprebbe darmi una indicazione?

Di seguito riporto un estratto del file .rc

LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_DIALOG1 DIALOG 0, 0, 186, 95
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION
| WS_VISIBLE | WS_POPUP | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "Ms Shell Dlg"
{
ecc. ecc.
}

Ringrazio anticipatamente

Franco

unread,
Nov 27, 2013, 6:15:09 AM11/27/13
to
Aggiornamento:

togliendo
return DefWindowProc (hwnd, message, wParam, lParam);

la cosa sembra funzionare, e se non ho capito male, le dialog hanno la
propria gestione per l'inoltro dei messaggi di default.

acc

unread,
Nov 27, 2013, 6:46:32 AM11/27/13
to
Il 27/11/2013 11.57, Franco ha scritto:

> ma quando ho provato ad usare un file di risorse e la funzione
> CreateDialog, ho notato immediatamente una cosa abbastanza anomala:
> nonostante la dialog si apra correttamente, ogni chiamata a MessageBox,
> apre la finestra di messaggio ma poi ᅵ impossibile richiuderla, sembra
> non attiva e non funziona il tasto OK.
> Qualcuno saprebbe darmi una indicazione?
>
> Di seguito riporto un estratto del file .rc
>
> LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
> IDD_DIALOG1 DIALOG 0, 0, 186, 95
> STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION
> | WS_VISIBLE | WS_POPUP | WS_SYSMENU
> CAPTION "Dialog"
> FONT 8, "Ms Shell Dlg"
> {
> ecc. ecc.
> }

La dialog devi chiuderla tu nella rispettiva dialog procedure, ad esempio:

INT_PTR CALLBACK Dialog1Proc(HWND hdlg, UINT msg, WPARAM wparam, LPARAM
lparam) {
switch (msg) {
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
switch (LOWORD(wparam)) {
case IDOK:
// eventuale codice per OK
// ...
//
EndDialog(hdlg,IDOK);
return TRUE;
case IDCANCEL:
// eventuale codice per CANCEL
// ...
//
EndDialog(hdlg,IDCANCEL);
return TRUE;
}
}
return FALSE;
}

Tieni presente che una dialog procedure e' simile a quella di una
window, ma con queste differenze:
- devi tornare TRUE se hai elaborato il messaggio
- non devi chiamare la DefWindowProc() per i messaggi che non gestisci

La dialog procedure deve essere passata come parametro quando crei la
dialog, nel nostro esempio:

DialogBox(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_DIALOG1),GetActiveWindow(),(DLGPROC)Dialog1Proc);

Franco

unread,
Nov 27, 2013, 6:51:35 AM11/27/13
to
Intanto grazie mille per la veloce risposta.

> La dialog devi chiuderla tu nella rispettiva dialog procedure, ad
esempio:

Il vero problema in realtᅵ era che non potevo chiudere la MessageBox, ma
mi hai dato comunque la soluzione nelle righe seguenti.

> Tieni presente che una dialog procedure e' simile a quella di una
> window, ma con queste differenze:
> - devi tornare TRUE se hai elaborato il messaggio
> - non devi chiamare la DefWindowProc() per i messaggi che non gestisci

Ed ᅵ proprio quest'ultima condizione che mi era sfuggita, infatti,
togliendo la DefWindowProc ha iniziato a funzionare perfettamente.

Ancora grazie.
Buona giornata
0 new messages