MDI Anwendung darin hintern, neue Menüleiste zu laden

Thopeto

Erfahrenes Mitglied
Hallo

Ich möchte verhindern, das in meine MDI Anwendung eine Menüleiste geladen wird. Es wird ja immer anfangs die Menüleiste IDR _MAINFRAME und beim öffnen eines neues Dokument auf die IDR_SAMPLEFRAME gewechselt...wie kann ich beides unterbinden?! das eine menüleiste erstellt wird und das eine neue beim öffnen eine doks erstellt wird

EDIT: gibt es eine möglichkeit, eine MDI Anwendung ohne Menüleiste zu erstellen. Toolbar und Statustbar brauch ich, aber die MEnüleiste muss weg

gruß
Thorsten
 
Zuletzt bearbeitet:
sagen wir mal so, wenn ich ein neues dokument öffne, dann zeigt er die IDR_SAMPLETYPE...aber das soll er unterbinden.
 
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.
 
wow danke

ich hab ja ein menu selbst erstellt, will aber das neu laden des menüs verhindern. darum

ein menü hab ich ja.

wie meinst du das mit den Minimieren, Maximieren und schließ buttons?!
meinst du die, die dann ganz rechts auf der menübar sind?!

EDIT: hab es mal nach deiner Anleitung gemacht, irgendwie net bei mir...:confused:
 
Zuletzt bearbeitet:
Zurück