|
ダイアログバーの基本
(本項目はSDI/MDIベースアプリに関しての項目です。「ドキュメント・ビューの基本」を見ていない方は先にそちらを見てください。)
今回はダイアログバーを作成してみます。ダイアログバーというのは、次のようなダイアログリソースを元にしたバーです。中にボタンやエディットボックスなどのコントロールを配置することができます。ダイアログバーはツールバーやステータスバーと同じ「コントロールバー」の一種です。

ドキュメント・ビューにおけるコントロールバーの位置づけは、フレームウィンドウの子ウィンドウです。ビューもフレームウィンドウの子ウィンドウなので、コントロールバーとビューは同じ親を持った兄弟の関係になります。この関係をまず理解しておきましょう。これは後のコード作成で必要になってきます。
今回は「ツリービューの基本」で作成したプロジェクトにダイアログバーを追加し、ダイアログバーで入力したアイテムをツリーに追加する機能をつけてみましょう。
では、最初にダイアログバー用のダイアログリソースを作成します。今回はエディットボックスとボタン1つを追加しました。

バーになるので、ダイアログの上下左右の余白は調整しておきましょう。グリップをつける場合は左側の余白を少し多めに取っておきます。
ダイアログのプロパティは、「Style」を「子」に、「Border」を「なし」にします。
次はメインフレームクラスにCDialogBarクラスのメンバを追加します。

次はボタンのイベントハンドラを追加します。ここでハンドラを追加するクラスを選択できますが、どこに追加すればよいのでしょうか?今回はボタンが押されたらツリービューにアイテムを追加しようとしています。ここで先ほどの関係を思い出してみましょう。ダイアログバーとビューには直接のつながりはなく、共通の親であるフレームウィンドウを介してつながっています。ということは、ボタンのイベントはまず親であるフレームウィンドウに通知し、フレームウィンドウからビューへ通知するのが最も自然な流れです。
というわけで、ここではCMainFrameクラスにハンドラを追加します。なお、場合によってはまずドキュメントを更新し、ドキュメントが更新されたことによってビューが更新されるということもあるでしょう。その場合は、ダイアログバー→フレームウィンドウ→ドキュメント→ビューというように通知が連鎖していきます。今回は特にドキュメントは使用していないので、フレームウィンドウから直接ビューに通知することにします。

次は、ビュークラスに関数を追加します。この関数でフレームウィンドウからビューにアイテムの追加を通知します。引数でアイテムの文字列を渡すようにします。

では、コードを実装していきましょう。まずはフレームウィンドウのOnCreate()関数です。ここでダイアログバーを作成します。
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT,
WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("ツール バーの作成に失敗しました。\n");
return -1; // 作成できませんでした。
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("ステータス バーの作成に失敗しました。\n");
return -1; // 作成できませんでした。
}
// TODO: ツール バーをドッキング可能にしない場合は、
// これらの 3 行を削除してください。
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
// ダイアログバーの生成
{
int err = 0;
if (!err) if (!m_dlgBar.Create(this, IDD_DLGBAR,
CBRS_TOP | CBRS_GRIPPER , AFX_IDW_DIALOGBAR)) err = 1;
if (!err)
{
m_dlgBar.EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_dlgBar);
}
}
return 0;
}
|
ダイアログバーはCDialogBar::Create()関数で作成します。引数には親ウィンドウ、ダイアログリソースID、ダイアログバーを配置する位置等を指定します。ここではウィンドウの上部にダイアログバーを表示させるようにしています。また、左端にグリップをつける場合はnStyleにCBRS_GRIPPERを追加します。
virtual BOOL CDialogBar::Create(
CWnd* pParentWnd, UINT nIDTemplate, UINT nStyle, UINT nID); |
| 説明: |
ダイアログバーの作成 |
| 引数: |
pParentWnd:親ウィンドウへのポインタ
nIDTemplate:ダイアログリソースのID
nStyle:ダイアログバーを配置する位置。CBRS_TOP、CBRS_BOTTOM、CBRS_NOALIGN、CBRS_LEFT、CBRS_RIGHTのどれか
nID:ダイアログバーのコントロールID |
| 戻り値: |
正常終了した場合は0以外。それ以外の場合は0 |
次はダイアログバーをドッキング可能にします(しなくてもいいですが)。ドッキング可能にするとダイアログバーをドラッグして自由に位置を変えることができるようになります。ドッキング可能にしないと、ダイアログバーは最初の位置で固定になります。
ドッキング可能にする場合、CControlBar::EnableDocking()関数でコントロールバーをドッキング可能にし、CFrameWnd::DockControlBar()関数でコントロールバーをドッキングします。
では、次は「追加」ボタンのイベントハンドラです。
// "追加"ボタン押下
void CMainFrame::OnBnClickedBtnAdd()
{
CTVView *tvviewP = NULL;
CString itemStr;
int err = 0;
// View取得
if (!err) if ((tvviewP =
static_cast<CTVView *>(GetActiveView())) == NULL) err = 1;
// ダイアログバーから文字列取得
if (!err) if (!m_dlgBar.GetDlgItemText(IDC_EDIT_ITEM, itemStr)) err = 1;
// Viewにアイテム追加
if (!err) err = tvviewP->AddItem(itemStr);
}
|
ここでは、ダイアログバーのエディットボックスから文字列を取得し、ビュークラスに追加した関数を呼んでいます。フレームウィンドウからのビューの取得は、CFrameWnd::GetActiveView()関数でできます。この関数は現在アクティブなビューのポインタを返します。今回はビューが1つなので必ずツリービューのポインタが返りますが、ビューが2つ以上ある場合は、現在のビューがどれであるのかということを気にする必要が出てきます。
では、次はビュークラスに追加したアイテムの追加関数です。
// アイテム追加
int CTVView::AddItem(CString item)
{
CTreeCtrl &treeCtrl = GetTreeCtrl();
HTREEITEM hItem = NULL;
int err = 0;
if (item.IsEmpty()) err = 1;
if (!err)
{
hItem = treeCtrl.GetNextItem(TVI_ROOT, TVGN_CARET);
if (!treeCtrl.InsertItem(item, hItem ? hItem : TVI_ROOT)) err = 1;
}
return err;
}
|
ツリーコントロールへのアイテムの追加は「ツリーコントロールの基本」でやりました。詳しくはそちらを見てください。
では、ビルドして実行してみましょう。ダイアログバーに文字列を入力し、「追加」ボタンを押すと、ツリービューにアイテムが追加されます。

|