Newsgroup: it.comp.programmare.win32
Titolo: MessageBox e CreateDialog

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

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.
 

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

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