DLGCBR32 サンプル:ダイアログ ボックスへのツールバーとステータス バーの追加を示します

DLGCBR32 サンプルでは、ダイアログ ボックスにステータス バーとツール バーを追加する方法を示します。 また、MFC アプリケーションのメイン ウィンドウとしてモードレス ダイアログ ボックスを使用するときの手法も示します。

MFC アプリケーションでは、ステータス バーやツール バーなどのコントロール バーをフレーム ウィンドウに追加できます。 ただし、簡単なダイアログ ボックスを使用したユーザー インターフェイスで十分というアプリケーションも少なくありません。 MFC には、ダイアログ ボックスにコントロール バーを追加するための組み込みサポートは用意されていません。

セキュリティに関するメモセキュリティに関するメモ

このサンプル コードは概念を示すためのものであり、その概念に関連するコードのみを示しています。特定の環境について必ずしもセキュリティ要件を満たしていませんので、そのまま使用しないでください。セキュリティおよびエラー処理コードを追加して、プロジェクトをより安全かつ堅牢にすることをお勧めします。これらのサンプル コードは、現状有姿のままで提供されるものであり、一切保証されていません。

サンプルとそのインストール手順を取得するには

Visual Studio のサンプルにアクセスするには

  • [ヘルプ] メニューの [サンプル] をクリックします。

    既定では、これらのサンプルは drive:\Program Files\Microsoft Visual Studio 10.0\Samples\ にインストールされています。

  • このサンプルの最新版および他のサンプルの一覧については、MSDN Web サイト上で Visual Studio サンプル 」を参照してください。

サンプルのビルドと実行

DLGCBR32 サンプルをビルドおよび実行するには

  1. ソリューション Dlgcbr32.sln を開きます。

  2. [ビルド] メニューの [ビルド] をクリックします。

  3. でデバッグ メニューの、[デバッグなしで開始 をクリックします。

ダイアログ ボックスへのコントロール バーの追加

ダイアログ ボックスにコントロール バーを追加するには、通常どおりにコントロール バーを作成し、ダイアログ ボックスのクライアント領域にコントロール バーを配置します。 コントロール バーを正しく機能させるためには、ダイアログ ボックスがフレーム ウィンドウの機能の一部を複製する必要があります。 ON_UPDATE_COMMAND_UI ハンドラーは、コントロール バーを操作する場合は、コントロール バーの新しいクラスを派生し、 WM_IDLEUPDATECMDUI メッセージを処理する必要があります。 ダイアログ ボックスは、アプリケーションのメイン ウィンドウではない場合は、WM_IDLEUPDATECMDUI メッセージ ダイアログ ボックスの上にボックスのコントロール バーを渡すには、親フレーム ウィンドウを変更する必要があります。

ダイアログ ボックスのクライアント領域にコントロール バーを配置するには、ダイアログ ボックスの OnInitDialog 関数で次の手順を実行します。

  1. コントロール バーを作成します。 reposQuery の RepositionBars オプションを使用して、コントロール バーが使用する領域を調べます。

    CRect rcClientStart;
    CRect rcClientNow;
    GetClientRect(rcClientStart);
    RepositionBars(AFX_IDW_CONTROLBAR_FIRST,
                   AFX_IDW_CONTROLBAR_LAST,
                   0, reposQuery, rcClientNow);
    
  2. クライアント領域の上部または左側に配置するコントロール バーの領域を確保するために、ダイアログ ボックス内のコントロールを移動します。 ダイアログ ボックスにメニューが含まれている場合は、メニューに必要な領域も確保します。

    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();
        }
    
  3. コントロール バーが使用する領域に応じて、ダイアログ ボックス ウィンドウを大きくします。

    CRect rcWindow;
    GetWindowRect(rcWindow);
    rcWindow.right += rcClientStart.Width() - rcClientNow.Width();
    rcWindow.bottom += rcClientStart.Height() - rcClientNow.Height();
    MoveWindow(rcWindow, FALSE);
    
  4. RepositionBars を使用してコントロール バーを配置します。

最初のウィンドウのステータス バーのメニュー項目のテキストを更新するのには、ダイアログ ボックス クラスに WM_MENUSELECTWM_ENTERIDLEWM_SETMESSAGESTRINGWM_POPMESSAGESTRING を処理する必要があります。 これらのメッセージのために CFrameWnd ハンドラーの機能を複製する必要があります。 CModelessMain クラスのサンプル プログラムにこれらのメッセージ ハンドラーの例」を参照してください。

ツールバーのボタンに対するツール ヒントを表示するのには、TTN_NEEDTEXTWTTN_NEEDTEXTA 通知を処理する必要があります。

ON_UPDATE_COMMAND_UI ハンドラーを他のステータス バー ペイン、およびツールバーのボタンを動作させるには、コントロール バーの新しいクラスを派生し、メッセージ ハンドラー WM_IDLEUPDATECMDUI を実装する必要があります。 OnUpdateCmdUI の既定のコントロール バーの実装では、親ウィンドウがフレーム ウィンドウであると想定されるため、この処理を行う必要があります。 ただし、OnUpdateCmdUI は、CCmdTarget ポインターだけを必要とする関数に親ウィンドウのポインターを渡すだけです。 このため、ここで渡される親ウィンドウのポインターが OnUpdateCmdUI ポインターであるということを CFrameWnd に一時的に伝えると、コンパイラの必要条件を満たすことができます。 たとえば、次のように公開されます。

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 ハンドラーを作成します。 ハンドラーが WM_IDLEUPDATECMDUI メッセージ ダイアログ ボックスを使って CWnd::SendMessageToDescendants 子ウィンドウを送信する必要があります。 この後、フレーム ウィンドウ内のメッセージに対して、既定の処理を実行します。

注意

このサンプルを含む一部のサンプルには、Visual C++ のウィザード、ライブラリ、およびコンパイラの変更が反映されていませんが、必要なタスクを実行する方法は示されています。

参照

その他の技術情報

MFC サンプル