MFC Feature Packを使用していますが、リボンバーにいくつかのボタン(CMFCRibbonButtonのインスタンス)があります。問題は、特定の条件で、ただし実行時にそれらの一部を有効または無効にしたいことです。これどうやってするの?これには特定の方法がないため...解決策は実行時にイベントハンドラーをアタッチ/デタッチすることだと聞きましたが、方法がわかりません...
2 に答える
オブジェクトを作成するときは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_COMMAND
にON_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 のメッセージ マップを参照してください。
これが役立つことを願っています!
ChrisNはかなり完璧な答えを出しました。ここからVS2008サンプルパックをダウンロードし、MSOffice2007Demoソリューションを開くと、これがどのように行われるかの正確な例を見ることができます。
サンプルを実行するときは、リボンの[表示]タブにある[サムネイル]チェックボックスを確認してください。これは無効になっています。
これは、CMSOffice2007DemoView::OnUpdateViewThumb
どの呼び出しによって制御されますpCmdUI->Enable(FALSE);
。これを呼び出すように変更するTRUE
かFALSE
、実行時にボタンをそれぞれ有効/無効にするように変更できます。