4

MFC Feature Packを使用していますが、リボンバーにいくつかのボタン(CMFCRibbonButtonのインスタンス)があります。問題は、特定の条件で、ただし実行時にそれらの一部を有効または無効にしたいことです。これどうやってするの?これには特定の方法がないため...解決策は実行時にイベントハンドラーをアタッチ/デタッチすることだと聞きましたが、方法がわかりません...

4

2 に答える 2

15

オブジェクトを作成するときはCMFCRibbonButton、関連するコマンド ID を指定する必要があります (CMFCRibbonButtonコンストラクターのドキュメントはこちらを参照してください)。リボン ボタンの有効化と無効化は、CCmdUIクラスを使用して、MFC の通常のコマンド更新メカニズムを使用して行われます。

たとえば、コマンド ID が のリボン ボタンがあり、ID_MYCOMMANDこのコマンドをアプリケーションのビュー クラスで処理する場合は、次の関数をクラスに追加する必要があります。

// MyView.h
class CMyView : public CView {
    // ...
    private:
        afx_msg void OnMyCommand();
        afx_msg void OnUpdateMyCommand(CCmdUI* pCmdUI);
        DECLARE_MESSAGE_MAP()
};

それらを .cpp ファイルに実装します。

// MyView.cpp
void CMyView::OnMyCommand() {
    // add command handler code.
}

void CMyView::OnUpdateMyCommand(CCmdUI* pCmdUI) {
    BOOL enable = ...; // set flag to enable or disable the command.
    pCmdUI->Enable(enable);
}

また、クラスのメッセージ マップON_COMMANDON_UPDATE_COMMAND_UIエントリを追加する必要があります。CMyView

// MyView.cpp
BEGIN_MESSAGE_MAP(CMyView, CView)
    ON_COMMAND(ID_MYCOMMAND, &CMyView::OnMyCommand)
    ON_UPDATE_COMMAND_UI(ID_MYCOMMAND, &CMyView::OnUpdateMyCommand)
END_MESSAGE_MAP()

MFC のメッセージ マップの詳細については、TN006: MSDN のメッセージ マップを参照してください。

これが役立つことを願っています!

于 2009-02-02T17:48:03.730 に答える
2

ChrisNはかなり完璧な答えを出しました。ここからVS2008サンプルパックをダウンロードし、MSOffice2007Demoソリューションを開くと、これがどのように行われるかの正確な例を見ることができます。

サンプルを実行するときは、リボンの[表示]タブにある[サムネイル]チェックボックスを確認してください。これは無効になっています。

これは、CMSOffice2007DemoView::OnUpdateViewThumbどの呼び出しによって制御されますpCmdUI->Enable(FALSE);。これを呼び出すように変更するTRUEFALSE、実行時にボタンをそれぞれ有効/無効にするように変更できます。

于 2009-02-02T23:00:21.683 に答える