DLGCBR32 サンプル : ダイアログ ボックスへのステータス バーとツール バーの追加
更新 : 2007 年 11 月
DLGCBR32 サンプルでは、ダイアログ ボックスにステータス バーとツール バーを追加する方法を示します。また、MFC アプリケーションのメイン ウィンドウとしてモードレス ダイアログ ボックスを使用するときの手法も示します。
MFC アプリケーションでは、ステータス バーやツール バーなどのコントロール バーをフレーム ウィンドウに追加できます。ただし、簡単なダイアログ ボックスを使用したユーザー インターフェイスで十分というアプリケーションも少なくありません。MFC には、ダイアログ ボックスにコントロール バーを追加するための組み込みサポートは用意されていません。
セキュリティに関するメモ : |
---|
このサンプル コードは概念を示す目的で提供されているものです。必ずしも最も安全なコーディング手法に従っているわけではないので、アプリケーションまたは Web サイトでは使用しないでください。Microsoft は、サンプル コードが意図しない目的で使用された場合に、付随的または間接的な損害について責任を負いません。 |
サンプルとそのインストール手順を取得するには
Visual Studio で、[ヘルプ] メニューの [サンプル] をクリックします。
詳細については、「サンプル ファイルの格納場所」を参照してください。
使用できるサンプルの最新バージョンと完全な一覧については、オンラインの Visual Studio 2008 Samples のページを参照してください。
サンプルは、コンピュータのハード ディスク上にもあります。既定では、サンプルおよび Readme ファイルは、\Program Files\Visual Studio 9.0\Samples\ の下のフォルダにコピーされます。Visual Studio Express Edition の場合、すべてのサンプルはオンライン上にあります。
サンプルのビルドと実行
DLGCBR32 サンプルをビルドおよび実行するには
ソリューション Dlgcbr32.sln を開きます。
[ビルド] メニューの [ビルド] をクリックします。
[デバッグ] メニューの [デバッグなしで開始] をクリックします。
ダイアログ ボックスへのコントロール バーの追加
ダイアログ ボックスにコントロール バーを追加するには、通常どおりにコントロール バーを作成し、ダイアログ ボックスのクライアント領域にコントロール バーを配置します。コントロール バーを正しく機能させるためには、ダイアログ ボックスがフレーム ウィンドウの機能の一部を複製する必要があります。ON_UPDATE_COMMAND_UI ハンドラをコントロール バーに対応させる場合は、新しいコントロール バー クラスを派生し、WM_IDLEUPDATECMDUI メッセージを処理することが必要です。ダイアログ ボックスがアプリケーションのメイン ウィンドウでない場合は、親フレームを変更し、WM_IDLEUPDATECMDUI メッセージをダイアログ ボックスのコントロール バーに渡すことが必要です。
ダイアログ ボックスのクライアント領域にコントロール バーを配置するには、ダイアログ ボックスの OnInitDialog 関数で次の手順を実行します。
コントロール バーを作成します。RepositionBars の reposQuery オプションを使用して、コントロール バーが使用する領域を調べます。
CRect rcClientStart; CRect rcClientNow; GetClientRect(rcClientStart); RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0, reposQuery, rcClientNow);
クライアント領域の上部または左側に配置するコントロール バーの領域を確保するために、ダイアログ ボックス内のコントロールを移動します。ダイアログ ボックスにメニューが含まれている場合は、メニューに必要な領域も確保します。
CPoint ptOffset(rcClientNow.left - rcClientStart.left, rcClientNow.top - rcClientStart.top); CRect rcChild; CWnd* pwndChild = GetWindow(GW_CHILD); while (pwndChild) { pwndChild->GetWindowRect(rcChild); ScreenToClient(rcChild); rcChild.OffsetRect(ptOffset); pwndChild->MoveWindow(rcChild, FALSE); pwndChild = pwndChild->GetNextWindow(); }
コントロール バーが使用する領域に応じて、ダイアログ ボックス ウィンドウを大きくします。
CRect rcWindow; GetWindowRect(rcWindow); rcWindow.right += rcClientStart.Width() - rcClientNow.Width(); rcWindow.bottom += rcClientStart.Height() - rcClientNow.Height(); MoveWindow(rcWindow, FALSE);
RepositionBars を使用してコントロール バーを配置します。
ステータス バーの最初のペインをメニュー項目のテキストで更新するには、ダイアログ ボックス クラスで WM_MENUSELECT、WM_ENTERIDLE、WM_SETMESSAGESTRING、および WM_POPMESSAGESTRING を処理する必要があります。これらのメッセージのために CFrameWnd ハンドラの機能を複製する必要があります。各メッセージ ハンドラの例については、サンプル プログラムの CModelessMain クラスを参照してください。
ツール バー ボタンのツール ヒントを表示するには、TTN_NEEDTEXTW および TTN_NEEDTEXTA の通知を処理する必要があります。
ON_UPDATE_COMMAND_UI ハンドラをほかのステータス バー ペインやツール バー ボタンで使用するには、新しいコントロール バー クラスを派生して、WM_IDLEUPDATECMDUI のメッセージ ハンドラを実装する必要があります。OnUpdateCmdUI の既定のコントロール バーの実装では、親ウィンドウがフレーム ウィンドウであると想定されるため、この処理を行う必要があります。ただし、OnUpdateCmdUI は、CCmdTarget ポインタだけを必要とする関数に親ウィンドウのポインタを渡すだけです。このため、ここで渡される親ウィンドウのポインタが CFrameWnd ポインタであるということを OnUpdateCmdUI に一時的に伝えると、コンパイラの必要条件を満たすことができます。以下にサンプルを示します。
LRESULT CDlgToolBar::OnIdleUpdateCmdUI(WPARAM wParam, LPARAM lParam)
{
if (IsWindowVisible())
{
CFrameWnd* pParent = (CFrameWnd*)GetParent();
if (pParent)
OnUpdateCmdUI(pParent, (BOOL)wParam);
}
return OL;
}
WM_IDLEUPDATECMDUI メッセージをメイン ウィンドウ以外のダイアログ ボックスに渡すには、ダイアログ ポインタをフレーム ウィンドウ クラスに保存して、そのクラスに WM_IDLEUPDATECMDUI ハンドラを作成します。このハンドラは、CWnd::SendMessageToDescendants を使用して WM_IDLEUPDATECMDUI メッセージをダイアログの子ウィンドウに送ります。この後、フレーム ウィンドウ内のメッセージに対して、既定の処理を実行します。
メモ : |
---|
このサンプルを含む一部のサンプルには、Visual C++ のウィザード、ライブラリ、およびコンパイラの変更が反映されていませんが、必要なタスクを実行する方法は示されています。 |