Das geht, man muss aber an ein paar Stellen reinhacken:
Einmal innerhalb InitInstance, nach erstellen des MainFrame ein GetTopLevelFrame()->SetMenu( NULL ) um das Menü zu zappen.
MFC wechselt bei jedem Document-Wechsel das Menü. An der Stelle muss man sich ebenfalls reinhängen:
Das habe ich mal gemacht, ziemlich aufwendig: Ich habe mir eine Hilfs-Klasse von CWnd abgeleitet, und dann
HWND hwnd = ((CMDIFrameWnd*)GetTopLevelFrame())->m_hWndMDIClient;
Dieses hwnd habe ich mit der Hilfsklasse ge-SubClass-ed. Dadurch erhalte ich einige der Nachrichten, die ich brauche (neues MDI Menü setzen, Aktives Dokument gewechselt). Die WindowProc von der Hilfsklasse sah so aus:
Code:
LRESULT CGRMenuBarHelper::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if ( message == WM_MDISETMENU )
{
// ein neues Menu soll gesetzt werden, wParam ist ein HMENU Handle
if ( wParam == NULL )
{
// ein Default-Menü nehmen (wenn kein Dokument mehr da)
wParam = (WPARAM)m_pMenuBar->m_hMenuDefault;
}
if ( wParam != NULL )
{
// dieses Menu soll jetzt gesetzt werden, hier das eigene reinhängen und NULL weitergeben
// ggf. (HMENU)wParam für eigene Zwecke parsen
wParam = NULL;
}
}
else if ( message == WM_MDIGETACTIVE )
{
// das aktive Dokument wird abgefragt
LRESULT lRes = CWnd::WindowProc(message, wParam, lParam);
HWND hwndActive = (HWND)lRes;
return lRes;
}
else if ( message == WM_DESTROY )
{
UnsubclassWindow();
}
LRESULT lRes = CWnd::WindowProc(message, wParam, lParam);
return lRes;
}
Anmerkungen:
Ich habe bei meinem Rumgehacke das MFC-Menu durch eine eigene MenuBar-Klasse ersetzt. Deshalb siehst du da an ein paar Stellen, dass ich das HMENU von MFC übernehme (habe ich dann später selbst ausgewertet).
Wenn du den Menübar komplett weglässt, werden die gefakten Minimieren/Maximieren/Close-Buttons bei maximiertem View nicht mehr angezeigt (die sind im Menubar!).
Zusätzlich, es gibt ja eigentlich eine Nachricht, die bei MFC anzeigt, dass ein neues Dokument aktiviert worden ist. Dummerweise kommt die aber nicht, wenn das letzte Dokument geschlossen wurde! Deshalb habe ich mich bei WM_MDIGETACTIVE reingehängt, dann bekomme ich auch mit, wenn kein Dokument mehr da ist. Die Message wird von MFC selbst aufgerufen.