質問

ユーザーがチェック/チェック解除できるチェックマークのように機能し、他のクラスがそのメニュー項目のチェックマークステータスを確認できるように、メニュー項目を追加しようとしています。メニューオプション(ポップアップオプション付き)のクラスを作成するように提案されましたが、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);
    }
}

参照:

http://www.codeguru.com/forum/showthread.php? t = 322261

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top