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