• ベストアンサー

メニュー等の動的な削除方法について

例えばクライアント領域をクリックすると、メニューバーやコマンドボタンを削除(非表示)し、クライアント領域のみにするにはどうすれば良いのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • darksky
  • ベストアンサー率66% (38/57)
回答No.1

どのような構成での質問かはわかりませんが、とりあえずMFC標準のSDI形式(ドキュメント~ビュー構成)での例です。 MDIやダイアログなどの場合は処理の仕方が全然違います。 まず、メニューやツールバーを管理しているのは、CFrameWndクラスの派生クラスになりますので、そのクラスにメニュー等を表示/非表示するための関数を定義します。 class CMainFrame : public CFrameWnd { public: void HideMenuBarAndToolBar(); void ShowMenuBarAndToolBar();         ・         ・         ・         ・ }; void CMainFrame::HideMenuBarAndToolBar() { CMenu* pMenu = GetMenu(); if(NULL == pMenu){ // // メニューとツールバー)が非表示の場合は何もしない。 // メニューが表示されているかの判断は、GetMenu()の戻り値がNULLではない場合とする。 return; } pMenu->DestroyMenu(); m_hMenuDefault = NULL; SetMenu(NULL); CControlBar* pBar = GetControlBar(ID_VIEW_TOOLBAR); if(pBar){ ShowControlBar(pBar, FALSE, FALSE); } } void CMainFrame::ShowMenuBarAndToolBar() { CMenu* pMenu = GetMenu(); if(pMenu){ // // メニューとツールバー)が表示の場合は何もしない。 return; } CMenu Menu; Menu.LoadMenu(IDR_MAINFRAME); m_hMenuDefault = Menu.Detach(); SetMenu(CMenu::FromHandle(m_hMenuDefault)); CControlBar* pBar = GetControlBar(ID_VIEW_TOOLBAR); if(pBar){ ShowControlBar(pBar, TRUE, FALSE); } } CDocument~CView構成の場合は、通常マウスイベントはCViewの方でしか取れないため、CViewクラスから派生したクラスでイベント処理を記述する。 その中で、CMainFrameクラスのメソッドを呼び出す。 CViewクラスからの派生クラスでMainFrm.hをインクルードする必要があるかも・・・ #include "MainFrm.h" // マウス左ダブルクリックの処理 void CXXXView::OnLButtonDblClk(UINT nFlags, CPoint point) { CView::OnLButtonDblClk(nFlags, point); CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd(); pMainWnd->HideMenuBarAndToolBar(); } // マウス右ダブルクリックの処理 void CXXXView::OnRButtonDblClk(UINT nFlags, CPoint point) { CView::OnRButtonDblClk(nFlags, point); CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd(); pMainWnd->ShowMenuBarAndToolBar(); }

VitaminBB
質問者

お礼

回答ありがとうございます。 回答通りでちゃんとできました。 最後にフレームも無くしてクライアント領域のみにしたいのですが可能なのでしょうか?

その他の回答 (2)

  • darksky
  • ベストアンサー率66% (38/57)
回答No.3

>やってみましたが、フレームは無くなりませんでした。 何も変化がなかったということでしょか。 WIN98の環境はありませんので確認はできませんので、スタイルのパラメータを変更してみてください。 ModifyStyle(0xFFFFFF, WS_OVERLAPPED); WS_OVERLAPPED以外の別の値をセットしてみてください。

VitaminBB
質問者

お礼

回答ありがとうございます。 教えていただいたコードでは、タイトルバーでの移動とXボタンでの終了が出来なくなりました。 以下のようにしたら、タイトルバーも消えましたが、フレームは無くなりません。 ************************** ModifyStyle(WS_BORDER | WS_CAPTION, 0 ); ModifyStyleEx( WS_EX_WINDOWEDGE |WS_EX_CLIENTEDGE, 0, SWP_FRAMECHANGED );

VitaminBB
質問者

補足

とりあえず以下でエッジも消えました。 LPCTSTR lpszClassName; CRect rect( 50, 50, 200, 100); HCURSOR hCursor = 0; DWORD dwStyle, dwExStyle; lpszClassName = AfxRegisterWndClass( CS_HREDRAW | CS_VREDRAW, hCursor); dwExStyle = WS_EX_WINDOWEDGE ;//| WS_EX_CLIENTEDGE;//エッジを無くす dwStyle = WS_VISIBLE | WS_POPUP ;//| WS_CAPTION ;//| WS_SYSMENU;// | WS_BORDER ;//| WS_THICKFRAME; CreateEx( dwExStyle, lpszClassName, _T("Test window"), dwStyle, rect, parent, NULL, NULL);//parent, NULL, NULL);

  • darksky
  • ベストアンサー率66% (38/57)
回答No.2

void CMainFrame::HideMenuBarAndToolBar() { CMenu* pMenu = GetMenu(); if(NULL == pMenu){ // // メニューとツールバー)が非表示の場合は何もしない。 // メニューが表示されているかの判断は、GetMenu()の戻り値がNULLではない場合とする。 return; } pMenu->DestroyMenu(); m_hMenuDefault = NULL; SetMenu(NULL); CControlBar* pBar = GetControlBar(ID_VIEW_TOOLBAR); if(pBar){ ShowControlBar(pBar, FALSE, FALSE); } CControlBar* pBar2 = GetControlBar(ID_VIEW_STATUS_BAR); if(pBar2 != NULL){ ShowControlBar(pBar2, FALSE, FALSE); } ModifyStyle(0xFFFFFF, WS_OVERLAPPED); } void CMainFrame::ShowMenuBarAndToolBar() { CMenu* pMenu = GetMenu(); if(pMenu){ // // メニューとツールバー)が表示の場合は何もしない。 return; } CMenu Menu; Menu.LoadMenu(IDR_MAINFRAME); m_hMenuDefault = Menu.Detach(); SetMenu(CMenu::FromHandle(m_hMenuDefault)); CControlBar* pBar = GetControlBar(ID_VIEW_TOOLBAR); if(pBar){ ShowControlBar(pBar, TRUE, FALSE); } CControlBar* pBar2 = GetControlBar(ID_VIEW_STATUS_BAR); if(pBar2 != NULL){ ShowControlBar(pBar2, TRUE, FALSE); } CRect rect; GetWindowRect(rect); ModifyStyle(0, WS_OVERLAPPEDWINDOW, TRUE); SetWindowPos(NULL, rect.left, rect.top, rect.Width() - 1, rect.Height() - 1, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); SetWindowPos(NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); Invalidate(); UpdateWindow(); }

VitaminBB
質問者

お礼

回答ありがとうございます。 環境を書き忘れていました。 環境 WIN98 VC++6.0 MFC SDIにて やってみましたが、フレームは無くなりませんでした。