domenica 29 marzo 2015

MFC: CPropertySheet e WM_CLOSE


Se vi siete imbattuti nella spiacevole situazione di dover intercettare il click sul pulsante di chiusura del menu di sistema di una PropertySheet (la classica X, per intenderci che si trova sulla barra del titolo) vi sarete accorti che questo evento non viene notificato usando il classico messaggio:

WM_CLOSE()
Un semplice escamotage per ottenere lo stesso identico risultato è quello di sfruttare i messaggi notificati tramite
WM_SYSCOMMAND
. Il parametro nID, infatti, assume il valore della costante
SC_CLOSE
proprio quando l'utente sta per chiudere la finestra. Per gestire la cosa ed eventualmente impedire la chiusura della finestra basterà scrivere una propria funzione che valuti se ci sono i presupposti per chiudere senza danni (ad esempio ci sono cose da salvare) e poi intercettare il giusto nID del messaggio
WM_SYSCOMMAND
. Ecco un piccolo esempio:

void CMyPropSheet::OnSysCommand(UINT nID, LPARAM lParam) 
{
 if (nID == SC_CLOSE)
 {
       OnClose();
 }
 else
 {
      CPropertySheet::OnSysCommand(nID, lParam);
 }
}

void CMyPropSheet::OnClose()
{
 if (!CanIClose())
      AfxMessageBox(_T("You cannot close me because.........."));
 else
      CPropertySheet::OnClose();
}