次の方法で共有


CTRLBARS サンプル : カスタム コントロール バー

更新 : 2007 年 11 月

CTRLBARS サンプルでは、コントロール バーの各種のカスタマイズ オプションを示します。

  • 特定のフレーム ウィンドウにおける複数のコントロール バー、コントロール バーの表示と非表示の選択、フレーム ウィンドウの境界に沿ったコントロールの動的再配置。コントロール バーは、Z オーダーに従ってフレーム ウィンドウ内に領域が割り当てられます。最初の Z オーダーは、コントロール バーが作成された順序です。CMainFrame::OnCreate に関するトピックを参照してください。CTRLBARS は、CWnd::SetWindowPos 関数を使用してダイアログ バーの Z オーダーを変更します。また、CWnd::ShowWindow を使用してコントロール バーの表示と非表示を切り替えます。CTRLBARS が Z オーダーを変更したり、コントロール バーの表示と非表示を切り替えたりすると、CFrameWnd::RecalcLayout が呼び出され、ウィンドウの領域を表示されているほかのコントロール バーに再割り当てされます。

  • カスタム ツール バー、ツール バー上のボタンの動的再配置、ツール バーへのコントロール (コンボ ボックスなど) の追加。CTRLBARS では、ツール バーをカスタマイズする 2 つの方法を示します。最初のツール バー [Tool Bar] では、[short] (ボタン 5 個) と [long] (ボタン 10 個) の場合でボタンの配置を切り替えます。CTRLBARS は、ボタンごとに CToolBar::SetButtonInfo を呼び出して、ツール バーのビットマップ上に並べて表示する位置とコマンド ID を対応付けます。2 番目のツール バー [Style Bar] は、ツール バー ボタン (または区分線) をコントロールに置き換える例です。この例では、コントロールとしてコンボ ボックスが使用されます。CMainFrame::CreateStyleBar によって、幅 100 ピクセルのツール バーの区分線が作成されます。次に、ツール バーの子としてコンボ ボックス (IDW_COMBO) が作成されます。最後に、区分線に割り当てられた領域に収まるようにコンボ ボックスの位置が設定されます。

  • カスタム ステータス バー、カスタム インジケータ、およびメッセージ行へのテキストの送信。ステータス バーの場合、たとえば、indicators[ ] 配列で CStatusBar::SetIndicators に渡す ID の 1 つとして ID_INDICATOR_CAPS を指定すると、フレームワークが [CAP LOCK]、[NUM LOCK]、または [SCROLL LOCK] のインジケータを自動的に更新します。CTRLBARS は、標準のステータス バー インジケータに上書き (OVR) 状態を組み込む拡張を示します。上書き (OVR) モードへの切り替えは Ins キーで行います。この場合、ID_TOGGLE_INSERT コマンド用の (VK_INSERT キーに割り当てられる) メッセージ ハンドラが必要です。また、上書きモードでは、テキスト ("OVR") を表示するリソース文字列 (ID_INDICATOR_OVR) も必要です。リソース ID の ID_INDICATOR_OVR は、MFC (Microsoft Foundation Class) ライブラリの定義済み定数です。

  • ダイアログ バー。これは、ダイアログ リソース テンプレートによりレイアウトが定義されているコントロール バーです。すべてのコントロール バーと同様に、ダイアログ バーのコントロールからの通知は、ダイアログ バーのオーナーであるメイン フレーム ウィンドウに送られます。たとえば、CMainFrame::OnSelChangePalette は、ダイアログ バーのコンボ ボックス コントロールから送られた CBN_SELCHANGE 通知を処理するハンドラです。また、CMainFrame には、3 つの [Hide/Show] チェック ボックスのうち 2 つ (Styles と Palette) に対するハンドラがあります。3 つ目のチェック ボックス [Hide/Show Toolbar] にはハンドラを作成する必要はありません。これは、フレームワークに ID_VIEW_TOOLBAR 用の標準ハンドラがあるためです。

  • フローティング ツール パレット。ツール バーのように動作しますが、ツール ボタンの 2 次元配列を表示し、オーナー フレーム ウィンドウの上にモードレス ウィンドウとして表示されます。フローティング ツール パレットは、CToolBar から派生した再利用可能な CPaletteBar クラスで実装されます。CPaletteBar は、CToolBar から派生しているため、ツール バー ボタンの動作が可能です。CPaletteBar で実装されるパレット固有の動作は次のとおりです。

    • フローティング (WS_POPUP) ウィンドウ スタイル

    • ツール ボタンを縦横に並べた 2 次元配置 (作成、描画、およびボタンのヒット テスト)

    • 細い (テキストなし) タイトル バー

    • 追跡四角形を使用した移動できるパレット

  • CTRLBARS には、ON_COMMAND_EXON_UPDATE_COMMAND_UI_RANGE の使用例もあります。CTRLBARS のコントロール バー用のカスタマイズ オプションの多くは、「テクニカル ノート 31: コントロール バー」で説明されています。

wc9sxcw1.alert_security(ja-jp,VS.90).gifセキュリティに関するメモ :

このサンプル コードは概念を示す目的で提供されているものです。必ずしも最も安全なコーディング手法に従っているわけではないので、アプリケーションまたは Web サイトでは使用しないでください。Microsoft は、サンプル コードが意図しない目的で使用された場合に、付随的または間接的な損害について責任を負いません。

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

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

    詳細については、「サンプル ファイルの格納場所」を参照してください。

  • 使用できるサンプルの最新バージョンと完全な一覧については、オンラインの Visual Studio 2008 Samples のページを参照してください。

  • サンプルは、コンピュータのハード ディスク上にもあります。既定では、サンプルおよび Readme ファイルは、\Program Files\Visual Studio 9.0\Samples\ の下のフォルダにコピーされます。Visual Studio Express Edition の場合、すべてのサンプルはオンライン上にあります。

サンプルのビルドと実行

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

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

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

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

最初に CTRLBARS を実行するときは、以下のコントロールがすべて表示されます。

  • 5 個のボタンを持つツール バーは、メニュー バーのすぐ下に配置されます。最初のボタン (太い上向きの矢印) を使用すると、ツール バーの大きさが [Short] (ボタン 5 個) と [Long] (ボタン 10 個) の間で切り替わります。最初の [Short] ボタンまたは [Long] ボタン、および [About CTRLBARS] ダイアログ ボックスを開くための [Help] ボタン以外のボタンは、常に非アクティブです。

  • 2 番目のツール バーは、最初のツール バーのすぐ下に配置されます。この [Style Bar] というツール バーでは、テキストの配置スタイルとして、Left、Centered、Right、または Justified のいずれかを指定します。いずれかのスタイルを選択すると、[Style Bar] の状態だけが変化します。

  • ステータス バーはウィンドウの一番下に配置されます。

  • フローティング パレットには、ツール ボタンが 3 × 4 に配列されます。ウィンドウの上部に配置されます。

  • ダイアログ バーは、ウィンドウの左の境界に配置されます。このコントロール バーのレイアウトはダイアログ テンプレート リソース (IDD_VIEW_SELECT) で定義されているため、ダイアログ バーとなります。

[View] メニューでは、最初の 4 つのコントロール バーを表示または非表示にできます。ダイアログ バーは常に表示されています。[Toolbar]、[Styles Bar]、[Palette] の各コントロール バーの表示/非表示状態は、ダイアログ バーの [Hide/Show] チェック ボックスにすぐに反映されます。また、このチェック ボックスを使用して、ほかのコントロール バーの表示または非表示を切り替えることもできます。

[View] メニューの [Dlg Bar Top] では、ダイアログ バーがコントロール バーの Z オーダーの一番上になるように、コントロール バーを再配置できます。ダイアログ バーが一番上になる場合、ダイアログ バーは、メニュー バーとタイトル バーを除いたウィンドウの左側の境界全体に表示されます。2 つのツール バーの左端は、ダイアログ バーに接します。ダイアログ バーを本来の Z オーダーの位置 (ほかのすべてのコントロール バーの後ろ) に戻すと、ダイアログ バーの最上部が 2 番目のツール バーの下部に接し、ダイアログ バーの最下部はステータス バーの上部に接します。つまり、コントロール バーが指定順にウィンドウ領域を割り当てられるという基本アルゴリズムが反映されています。

[Style] メニューでは、Left、Centered、Right、および Justified の 4 つのテキストの配置スタイルから 1 つを選択できます。選択した内容は、[Style Bar] のコンボ ボックスと対応するボタンにすぐに反映されます。同様に、[Style Bar] のコンボ ボックスに表示されているスタイルを選択することも、4 つのボタンのどれかをクリックして選択することもできます。新しい選択内容は、他のコントロールの状態および [Style] メニューにすぐに反映されます。

[Palette] メニューでは、パレット上のツールの配置を 3 × 4 から 2 × 6 に変更できます。

[Palette] でツールを選択すると、ステータス バーのメッセージ行に "You have selected the <type> tool" と表示されます。<type> には 12 個のツールから選択したツールが表示されます。この選択内容は、ダイアログ バーのコンボ ボックスに反映されます。また、このコンボ ボックスでも、ツールを選択できます。

ステータス バーには、最後に選択したツールが表示されるだけでなく、Ins、CapsLock、および NumLock という 3 つのキーの状態が表示されます。

キーワード

このサンプルでは、次のキーワードを使用します。

AfxFormatString1; AfxGetApp; AfxIsValidAddress; AfxRegisterWndClass; AfxThrowResourceException; BitBlt; CBrush::CreateSolidBrush; CCmdUI::ContinueRouting; CCmdUI::Enable; CCmdUI::SetCheck; CCmdUI::SetText; CComboBox::AddString; CComboBox::Create; CComboBox::GetCurSel; CComboBox::GetLBText; CComboBox::SetCurSel; CControlBar::GetBarStyle; CControlBar::SetBarStyle; CDC::Attach; CDC::Detach; CDC::PatBlt; CDC::RectVisible; CDialogBar::Create; CDumpContext::GetDepth; CFont::CreateFontIndirect; CFrameWnd::LoadFrame; CFrameWnd::RecalcLayout; CFrameWnd::SetMessageText; CGdiObject::Attach; CObject::AssertValid; CObject::Dump; CRect::Height; CRect::InflateRect; CRect::SetRectEmpty; CRect::Width; CStatusBar::Create; CStatusBar::GetPaneInfo; CStatusBar::SetIndicators; CStatusBar::SetPaneInfo; CString::LoadString; CToolBar::CToolBar; CToolBar::CommandToIndex; CToolBar::Create; CToolBar::GetButtonInfo; CToolBar::GetItemID; CToolBar::GetItemRect; CToolBar::LoadBitmap; CToolBar::SetButtonInfo; CToolBar::SetButtons; CToolBar::SetHeight; CToolBar::SetSizes; CWinApp::InitInstance; CWinApp::OnIdle; CWnd::ClientToScreen; CWnd::CreateEx; CWnd::GetCapture; CWnd::GetClientRect; CWnd::GetDC; CWnd::GetDlgItem; CWnd::GetOwner; CWnd::GetParentFrame; CWnd::GetSafeHwnd; CWnd::GetStyle; CWnd::GetWindowRect; CWnd::Invalidate; CWnd::InvalidateRect; CWnd::OnCancelMode; CWnd::OnCreate; CWnd::OnLButtonDown; CWnd::OnMouseActivate; CWnd::OnMouseMove; CWnd::OnSysColorChange; CWnd::PreCreateWindow; CWnd::ReleaseDC; CWnd::SendMessage; CWnd::SetCapture; CWnd::SetFont; CWnd::SetWindowPos; CWnd::ShowWindow; CWnd::UpdateDialogControls; CWnd::UpdateWindow; CreateBitmap; CreateCompatibleBitmap; CreateCompatibleDC; CreateDIBitmap; CreatePatternBrush; CreatePen; CreateSolidBrush; DeleteDC; DeleteObject; FillRect; FindResource; FrameRect; FreeResource; GetActiveWindow; GetBValue; GetCapture; GetDC; GetDeviceCaps; GetGValue; GetNextWindow; GetObjectType; GetParent; GetRValue; GetStockObject; GetSysColor; GetSystemMetrics; GetVersion; GetWindow; HIBYTE; InvertRect; LOBYTE; LoadCursor; LoadIcon; LoadResource; LockResource; MAKEINTRESOURCE; OffsetRect; PatBlt; RGB; ReleaseCapture; ReleaseDC; SelectObject; SendMessage; SetActiveWindow; SetBkColor; SetCapture; SetROP2; SetRect; SetTextColor; StretchDIBits; UpdateWindow; free; lstrcpy; malloc; memcpy; memset

wc9sxcw1.alert_note(ja-jp,VS.90).gifメモ :

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

参照

その他の技術情報

MFC サンプル