Ribbonインタフェースを使った開発についての覚書

必要な環境

  • VisualStudio2008ServicePack1

サンプル


RibbonインタフェースはSDIもしくはMDIでしか利用できない。ここで記述する内容はSDIを想定している。SDIで手っ取り早く開発したいのならビューの基本クラスをリソースエディタでボタンやエディットボックスなどを配置できる、CFormViewにする。

リボンコントロールをEnable/Disableにするにはどうすればよいのか。ビューもしくはメインフレームで下記のようにイベントハンドラを用意しCCmdUIを通じてEnable()を呼び出せばよい。メインメニューでメイン項目をEnable/Disableするのと全く同じやり方

//メッセージマップにイベントハンドラを設定
ON_UPDATE_COMMAND_UI(ID_VIEW_TRUMBNAILS, OnUpdateViewThumb) 

// イベントハンドラ
void OnUpdateViewThumb(CCmdUI* pCmdUI)
{
	pCmdUI->Enable(FALSE);
}

リボンコンボボックスでとある項目が選択されたことをしるにはどうすればよいのか。ビューもしくはメインフレームで下記のようにイベントハンドラを用意する。CComboBoxのようにSEL_CHANGEメッセージを受け取れれば良いのだが、そんなものはないので変更されたかどうかは自分で記述しなければならない

//メッセージマップにイベントハンドラを設定
ON_COMMAND(ID_FONT_FONTSIZE, OnFontsize)

void OnFontsize()
{
	int curSel = m_pRibbonComboBox->GetCurSel();
	if (curSel != CB_ERR && curSel != m_curSel) {
		// 項目が選択された場合の処理を記述
	}
}

ビューにおいてリボンコントロールへのポインタが欲しくなる時がある。その場合はメインフレームでリボンコントロールを作成した時のポインタを覚えておいてViewでそのポインタを利用すれば良い

// ビューでのコード
CMFCRibbonEdit* pEditIndentLeft = new CMFCRibbonEdit(ID_PAGELAYOUT_INDENT_LEFT, 72, _T("Left:\nil"), 13);
pEditIndentLeft->EnableSpinButtons(0, 1000);
pEditIndentLeft->SetEditText(_T("0"));
pPanelParagraph->Add(pEditIndentLeft);
m_pEditIndentLeft = pEditIndentLeft;  // 覚えておく

// メインフレームでのコード
m_pEditIndentLeft = (CMainFrame*)AfxGetMainFrame()->m_pEditIndentLeft 

後で知ったのだが下記のようにしても取得できる

CMFCRibbonBar* pRibbon = ((CMainFrame*) GetTopLevelFrame())->GetRibbonBar();
ASSERT_VALID(pRibbon);

CMFCRibbonEdit* pEdit = DYNAMIC_DOWNCAST(CMFCRibbonEdit, pRibbon->FindByID(ID_PAGELAYOUT_INDENT_LEFT));

わからないことはとりあえずサンプルのC++\MFC\Visual C++ 2008 Feature Pack\MSOffice2007Demoを見れば良い