ダイアログにツールバーをつける
MFCではダイアログボックスへのコントロールバー(ツールバーやステータスバー)
の追加がサポートされていない。
ここで挙げる例はダイアログボックスにツールバーを追加する方法。
同じ手法でステータスバーも追加できるはず。
前準備
// ツールバー情報の構造体
struct stToolBarInfo
{
int btnId; // ボタンのID
int imgIdx; // ボタンにつけるイメージのインデックス
int strId; // ボタンに表示する文字列ID
};
CXXXDialogの準備
#define XXX_TBAR_BUTTON_NUM 4
const stToolBarInfo cstTBarInfo[XXX_TBAR_BUTTON_NUM] =
{ {ID_BUTTON_1,0,IDS_BUTTON_1},
{ID_BUTTON_2,1,IDS_BUTTON_2},
{ID_BUTTON_3,2,IDS_BUTTON_3},
{ID_BUTTON_4,3,IDS_BUTTON_4} };
ダイアログボックスのOnCreate()関数内でツールバーを作成。
int
CXXXDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
・
・
・
// ツールバーの作成
BOOL bRet = m_wndToolBar.Create(this,WS_CHILD | WS_VISIBLE | CBRS_TOP,IDR_XXX_TOOLBAR);
if(bRet == FALSE)
return -1;
// テキストはイメージの右側
m_wndToolBar.ModifyStyle(0,TBSTYLE_LIST);
// イメージのロード
m_wndToolBar.LoadBitmap(IDB_XXX_TBAR_IMG);
// ボタンの設定(後でSetButtonInfo()で設定するので数だけ設定)
m_wndToolBar.SetButtons(NULL,XXX_TBAR_BUTTON_NUM);
// ボタンのスタイル
m_wndToolBar.SetBarStyle( m_wndToolBar.GetBarStyle()
&~CBRS_BORDER_TOP
| CBRS_BORDER_BOTTOM
&~CBRS_BORDER_RIGHT
&~CBRS_BORDER_LEFT );
// 各ボタンの設定
for(int i=0;i<XXX_TBAR_BUTTON_NUM;i++){
// ボタンのイメージのセット
m_wndToolBar.SetButtonInfo(i,cstTBarInfo[i].btId,TBBS_BUTTON,cstTBarInfo[i].imgIdx);
// ボタン文字列の設定
CString str(_T(""));
str.LoadString(cstTBarInfo[i].strId);
m_wndToolBar.SetButtonText(i,(LPCTSTR)str);
}
// ペイントする前に更新ハンドラの呼び出しを無効
m_wndToolBar.Invalidate();
return 0;
}
ツールバーのサイズが0,0なのでリサイズ処理を追加。
void
CXXXDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: この位置にメッセージ ハンドラ用のコードを追加してください
・
・
// ツールバーのリサイズ処理
// ダイアログのrect
CRect rcClient;
GetClientRect(rcClient);
// ツールバーの高さの取得
CSize sizeToolBar;
sizeToolBar = m_wndToolBar.CalcFixedLayout(FALSE,TRUE);
// 作成時は大きさが0なので設定する
m_wndToolBar.MoveWindow(0,0,rcClient.Width(),sizeToolBar.cy);
return;
}
これでダイアログにツールバーがつく。
しかしボタンがDisableのまま。
ON_UPDATE_COMMAND_UIでEnableにすれば良しと思いきや・・
親がフレームじゃないとWM_IDLEUPDATECMDUIは処理されてない。
つうことでツールバークラスを派生させてダイアログ用ツールバークラスを作成し
そいつのクラスでWM_IDLEUPDATECMDUIのメッセージハンドラをインプリ。
ちなみにWM_IDLEUPDATECMDUIはafxpriv.hで定義されてる。
/*****************************************************************************
DlgToolBar.cpp
ダイアログ用のツールバー
Copyright(c) 2003 IQ Company
*****************************************************************************/
#include "afxpriv.h"
#include "stdafx.h"
#include "DlgToolBar.h"
BEGIN_MESSAGE_MAP(CDlgToolBar,CToolBar)
ON_MESSAGE(WM_IDLEUPDATECMDUI,OnIdleUpdateCmdUI)
END_MESSAGE_MAP()
LRESULT
CDlgToolBar::OnIdleUpdateCmdUI(WPARAM wParam,LPARAM lParam)
{
if(IsWindowVisible()){
CFrameWnd* pParent = (CFrameWnd*)GetParent();
if(pParent){
OnUpdateCmdUI(pParent,(BOOL)wParam);
}
}
return 0L;
}
CXXXDlgクラスのメンバm_wndToolBarをCToolBarからCDlgToolBarに変更。
これでON_UPDATE_COMMAND_UIが処理できる。
(Apl 30,2003)
Previous<<
∧index
>>Next
Back to home
メールはこちらから