Schließen-Button eines MDI-Kindfensters deaktivieren

Veröffentlicht: 24. Feb 2002 | Aktualisiert: 16. Jun 2004

Von Mathias Schiffer

Um den Schließen-Button eines MDI-Kindfensters zu entfernen, könnten Sie dessen Fensterstil WS_SYSMENU (und damit das Systemmenü) des betroffenen Fensters entfernen. Ein (vorgesehener) Randeffekt dabei ist jedoch, dass mit dieser Änderung ebenso die Schaltflächen für das Minimieren und das Maximieren entfernt werden. Ein besserer Weg, das Schließen für den Anwender zu unterbinden, ist das Entfernen des Menüpunkts "Schließen" des Systemmenüs, wodurch der Schließen-Button ausgegraut und damit unbedienbar wird.

Hierfür können Sie in Reaktion auf WM_CREATE eines MDI Kindfensters (abgeleitet von CMDIChildWnd) den Button mit folgendem Code deaktivieren:

CMenu *pSysMenu = GetSystemMenu(FALSE); 
ASSERT(pSysMenu != NULL); 
VERIFY(pSysMenu->RemoveMenu(SC_CLOSE, MF_BYCOMMAND));

Ein weiterer Umstand ist zu berücksichtigen: Wird dieses Fenster maximiert (womit die Buttons in der Titelleiste in das Menü des MDI-Fensters aufgenommen werden), wird der Schließen-Button zwar ebenfalls ausgegraut angezeigt, der Anwender kann ihn aber dennoch betätigen, um das Kindfenster zu schließen.

Um diesen Umstand zu berücksichtigen, können Sie den Versand des Systemkommandos SC_CLOSE an das MDI-Fenster unterdrücken. Verwenden Sie dafür den Handler OnSysCommand:

// CChildFrame ist abgeleitet von CMDIChildWnd: 
void CChildFrame::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
  if(nID == SC_CLOSE) 
    return; 
  CMDIChildWnd::OnSysCommand(nID, lParam); 
}