「MFCコントロール - メニュー」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
(Wiki がページ「メニュー項目を無効にする(MFC)」を「MFCコントロール - メニュー」に、リダイレクトを残さずに移動しました)
 
(3人の利用者による、間の6版が非表示)
1行目: 1行目:
== サンプルコード ==
== 概要 ==
  <source lang="c++">
 
<br><br>
 
== メインメニュー項目の無効化 ==
  <syntaxhighlight lang="c++">
  // CApp.cpp
  // CApp.cpp
  #include "CApp.h"    // CApp_クラス
  #include "CApp.h"    // CApp_クラス
30行目: 34行目:
     return TRUE; // 初期化成功ならTRUEを返す.
     return TRUE; // 初期化成功ならTRUEを返す.
  }
  }
   
  </syntaxhighlight>
   
<br>
  <syntaxhighlight lang="c++">
  // CApp.h
  // CApp.h
  #pragma once  // VisualC++独自のプリプロセッサで二重インクルード防止
  #pragma once  // VisualC++独自のプリプロセッサで二重インクルード防止
45行目: 50行目:
  // アプリケーションインスタンスの宣言
  // アプリケーションインスタンスの宣言
  CWinApp_ theApp;
  CWinApp_ theApp;
  </source>
  </syntaxhighlight>
<br>
<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  // CMainFrame.cpp
  // CMainFrame.cpp
  #include "stdafx.h"
  #include "stdafx.h"
75行目: 80行目:
     }
     }
  }
  }
   
  </syntaxhighlight>
   
<br>
  <syntaxhighlight lang="c++">
  // CMainFrame.h
  // CMainFrame.h
  #pragma once // VisualC++独自のプリプロセッサで二重インクルード防止
  #pragma once // VisualC++独自のプリプロセッサで二重インクルード防止
87行目: 93行目:
       CMainFrame();  // デフォルトコンストラクタ
       CMainFrame();  // デフォルトコンストラクタ
   
   
      void OnUpdateItem1(CCmdUI* pCmdUI);  // メニュー項目Item1_1のUI更新ハンドラ
       // メッセージマップ
       // メッセージマップ
       DECLARE_MESSAGE_MAP()  // メッセージマップの利用を宣言
       DECLARE_MESSAGE_MAP()  // メッセージマップの利用を宣言
      void OnUpdateItem1(CCmdUI* pCmdUI);  // メニュー項目Item1_1のUI更新ハンドラ
  };
  };
  </source>
  </syntaxhighlight>
<br><br>
 
== サブメニュー項目の無効化 ==
以下の例では、TESTという名前のサブメニュー項目を検索して無効化している。<br>
<br>
サブメニュー項目はリソースIDを持っていないため、直接、無効化することができない。<br>
そのため、上位の<code>CMenu</code>クラスから位置を指定して無効化する。<br>
<br>
また、さらに下位の階層の項目を無効化する場合は、<code>pMenu->GetSubMenu()</code>メソッドで取得して検索する。<br>
<syntaxhighlight lang="c++">
CWnd* pWnd        = ::AfxGetMainWnd();
CMenu* pMainMenu    = pWnd->GetMenu();
int SubMenuCount = pMenu->GetMenuItemCount();
for(int i = 0; i < MenuCount; i++)
{
    CString strSubMenu;
    pMenu->GetMenuString(i, strSubMenu, MF_BYPOSITION);
    if(0 == strSubMenu.Compare(_T("TEST")))
    {
      pMenu->EnableMenuItem(i, MF_BYPOSITION | MF_DISABLED | MF_GRAYED);  // 状態を設定する
      pWnd->DrawMenuBar();
    }
}
</syntaxhighlight>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:MFC]]
[[カテゴリ:MFC]]

2021年1月29日 (金) 16:00時点における最新版

概要



メインメニュー項目の無効化

 // CApp.cpp
 #include "CApp.h"    // CApp_クラス
 #include "CMainFrame.h"  // CMainFrameクラス
 #include "resource.h"    // リソースID
 
 // CAppのメンバの定義
 // メンバ関数InitInstance()
 BOOL CWinApp_::InitInstance()
 {
    // インスタンスの初期化処理
    // 構造体の宣言
    CFrameWnd_ *pFrameWnd;                // CFrameWnd_のオブジェクトポインタ
 
    // CFrameWnd_のインスタンス作成
    pFrameWnd  = new CFrameWnd();         // CFrameWndのインスタンスを作成し, pFrameWndに格納
    m_pMainWnd = pFrameWnd;               // m_pMainWndにpFrameWndをセット
 
    // フレームをリソースからロードしてウィンドウを作成
    pFrameWnd->LoadFrame(IDR_MAINFRAME);  // LoadFrameで共有リソースIDがIDR_MAINFRAMEとなるフレームをロード
 
    // CFrameWndの表示
    pFrameWnd->ShowWindow(m_nCmdShow);    // ShowWindowでウィンドウを表示
 
    // CFrameWnd_の更新
    pFrameWnd->UpdateWindow();            // UpdateWindowでウィンドウを更新
 
    // 初期化成功
    return TRUE;	// 初期化成功ならTRUEを返す.
 }


 // CApp.h
 #pragma once   // VisualC++独自のプリプロセッサで二重インクルード防止
 
 #include "stdafx.h"
 
 class CApp : public CWinApp
 {
    public:
       virtual BOOL InitInstance();  // インスタンスの初期化処理
 };
 
 // アプリケーションインスタンスの宣言
 CWinApp_ theApp;


 // CMainFrame.cpp
 #include "stdafx.h"
 #include "CMainFrame.h"
 
 // CMainFrameのメッセージマップ
 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    ON_UPDATE_COMMAND_UI(ID_ITEM_1, OnUpdateItem1)	// メニュー項目のUI更新マクロ
 END_MESSAGE_MAP()
 
 // CMainFrameのメンバの定義
 CMainFrame::CMainFrame()
 {
 }
 
 // メニュー項目Item1のUI更新ハンドラ
 void CMainFrame::OnUpdateItem1(CCmdUI* pCmdUI)
 {
    // メニュー項目Item1のUI更新
    if(pCmdUI)
    {  // メニュー項目Item1の有効化
       pCmdUI->Enable(TRUE);
    }
    else
    {  // メニュー項目Item1の無効化
       pCmdUI->Enable(FALSE);
    }
 }


 // CMainFrame.h
 #pragma once	// VisualC++独自のプリプロセッサで二重インクルード防止
 
 #include "stdafx.h"
 
 class CMainFrame : public CFrameWnd
 {  // フレームウィンドウクラス
    public:
       CMainFrame();  // デフォルトコンストラクタ
 
       // メッセージマップ
       DECLARE_MESSAGE_MAP()  // メッセージマップの利用を宣言
       void OnUpdateItem1(CCmdUI* pCmdUI);  // メニュー項目Item1_1のUI更新ハンドラ
 };



サブメニュー項目の無効化

以下の例では、TESTという名前のサブメニュー項目を検索して無効化している。

サブメニュー項目はリソースIDを持っていないため、直接、無効化することができない。
そのため、上位のCMenuクラスから位置を指定して無効化する。

また、さらに下位の階層の項目を無効化する場合は、pMenu->GetSubMenu()メソッドで取得して検索する。

 CWnd*	pWnd         = ::AfxGetMainWnd();
 CMenu*	pMainMenu    = pWnd->GetMenu();
 int	SubMenuCount = pMenu->GetMenuItemCount();
 
 for(int i = 0; i < MenuCount; i++)
 {
    CString strSubMenu;
    pMenu->GetMenuString(i, strSubMenu, MF_BYPOSITION);
 
    if(0 == strSubMenu.Compare(_T("TEST")))
    {
       pMenu->EnableMenuItem(i, MF_BYPOSITION | MF_DISABLED | MF_GRAYED);  // 状態を設定する
       pWnd->DrawMenuBar();
    }
 }