MFCメニュー項目のチェックボックスの動作
-
06-07-2019 - |
質問
ユーザーがチェック/チェック解除できるチェックマークのように機能し、他のクラスがそのメニュー項目のチェックマークステータスを確認できるように、メニュー項目を追加しようとしています。メニューオプション(ポップアップオプション付き)のクラスを作成するように提案されましたが、Visual Studio 2005のリソースレイアウトエディターではメニューオプションのクラスを作成できません。私が説明したことを実行できるメニュー項目を作成する最も簡単な方法に関する提案を聞きます。
解決 3
GetMenu()メソッドを使用してメインフレームからメニューを取得し、そのメニューオブジェクトとID番号を使用して、適切なフラグとGetMenuState()関数を使用してCheckMenuItem()を呼び出しました。
他のヒント
CCmdUI :: SetCheck
ON_UPDATE_COMMAND_UIを使用して、メニュー項目にチェックボックスを追加する機能
ハンドラー関数、および ON_COMMAND
ハンドラを使用して、チェックボックスの状態を変更します。このメソッドは、アプリケーションのメインメニューと作成するポップアップメニューの両方で機能します。
MDIまたはSDI MFCアプリケーションがある場合、まず、アプリケーション、メインフレーム、ドキュメント、またはビュークラスなど、ハンドラー関数を追加する場所を決定する必要があります。これは、フラグが何に使用されるかに依存します。アプリケーション全体の動作を制御する場合は、アプリケーションクラスに入れます。ビュー固有の動作を制御する場合は、ビュークラスなどに配置します。
(また、メニュー項目のチェック済みプロパティをリソースエディターで False に設定したままにすることをお勧めします。)
ビュークラスを使用して、 ID_MY_COMMAND
メニュー項目のチェックボックスの状態を制御する例を次に示します。
// MyView.h
class CMyView : public CView
{
private:
BOOL m_Flag;
afx_msg void OnMyCommand();
afx_msg void OnUpdateMyCommand(CCmdUI* pCmdUI);
DECLARE_MESSAGE_MAP()
};
// MyView.cpp
BEGIN_MESSAGE_MAP(CMyView, CView)
ON_COMMAND(ID_MY_COMMAND, OnMyCommand)
ON_UPDATE_COMMAND_UI(ID_MY_COMMAND, OnUpdateMyCommand)
END_MESSAGE_MAP()
void CMyView::OnMyCommand()
{
m_Flag = !m_Flag; // Toggle the flag
// Use the new flag value.
}
void CMyView::OnUpdateMyCommand(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_Flag);
}
たとえば、 CMyView
コンストラクターまたは OnInitialUpdate
関数で、 m_Flag
メンバー変数が初期化されていることを確認する必要があります。
これが役立つことを願っています!
@ChrisNのアプローチは、 MFCダイアログアプリケーションではまったく機能しません( pCmdUI-> SetCheck(m_Flag);
は効果がありません)。 Dialogアプリのソリューションは次のとおりです。
// MyView.h
class CMyView : public CView
{
private:
BOOL m_Flag;
CMenu * m_menu;
virtual BOOL OnInitDialog();
afx_msg void OnMyCommand();
DECLARE_MESSAGE_MAP()
};
// MyView.cpp
BEGIN_MESSAGE_MAP(CMyView, CView)
ON_COMMAND(ID_MY_COMMAND, OnMyCommand)
END_MESSAGE_MAP()
BOOL CMyView::OnInitDialog()
{
m_menu = GetMenu();
}
void CMyView::OnMyCommand()
{
m_Flag = !m_Flag; // Toggle the flag
if (m_flag) {
m_menu->CheckMenuItem(ID_MENUITEM, MF_CHECKED | MF_BYCOMMAND);
} else {
m_menu->CheckMenuItem(ID_MENUITEM, MF_UNCHECKED | MF_BYCOMMAND);
}
}
参照: