Visual Studio 2005 スタイルのドッキング ウィンドウを作成するには

解説

Visual C++ 2008 Service Pack 1 には、Visual Studio 2005 スタイルのドッキング ウィンドウを簡単に作成することができる、CDockablePaneクラスが追加されました。

Visual C++ 2008 Service Pack 1 より追加された CDockablePane クラスを利用して、Visual Studio 2005 スタイルのドッキング ウィンドウを作成する方法をまとめます。
使用開発環境は Visual C++ 2008 Service Pack 1 です。

CDockablePane クラスを利用して、Visual Studio 2005 スタイルのドッキング ウィンドウを作成するための必要条件、最低すべきこと、は、

必要条件
・開発環境が Visual C++ 2008 Service Pack 1 (以降)であること。
・MFCアプリケーションプログラムであること。
・CMainFrameの親クラスが、(CFrameWndではなく)CFrameWndExであること。
最低すべきこと
・CDockablePaneの派生クラスを作成する。
・作成したCDockablePaneの派生クラスのクラス定義に、ドッキングペインに入れるコントロールメンバ変数を追加する。
・作成したCDockablePaneの派生クラスに、OnCreate関数を追加し、ドッキングペインに入れるコントロールを作成する処理を追加する。
・作成したCDockablePaneの派生クラスに、OnSize関数、OnPaint関数、OnSetFocus関数を追加し、それぞれに対応する処理を追加する。
・CMainFrameクラスのクラス定義に、作成したCDockablePaneの派生クラスのオブジェクトメンバ変数を追加する。
・CMainFrameクラスのOnCreate関数に、ドッキングペイン作成処理(作成したCDockablePaneの派生クラスのオブジェクトを作成する処理)、Visual Studio 2005 スタイルのドッキングウィンドウ動作に関する設定処理、ドッキング処理、を追加する。

サンプルコード

プロジェクトの作成

(「CDockablePaneクラスを利用してVisual Studio 2005 スタイルのドッキング ウィンドウを作成する方法をまとめる」が目的なので、自動生成されるコードができるだけ少なくなるような設定で、プロジェクトを作成しています。この設定でプロジェクトを作成しなければいけないわけではありません。)

「メニュー/新規作成/プロジェクト」を選択します。

プロジェクトの種類:MFC
テンプレート:MFC アプリケーション
プロジェクト名:適当な名前(今回は「DockablePaneTest」)
場所:適当なフォルダを指定
ソリューションのディレクトリの作成:チェックしない
でOKボタンを押します。




次へボタンを押します。


アプリケーションの種類:シングル ドキュメント
プロジェクト形式:MFC 標準
視覚スタイルと色:Windows ネイティブ/規定
MFCの使用:共有DLLでMFCを使用
ドキュメント ビュー アーキテクチャー サポート:チェックする
リソース言語:日本語
ユニコードライブラリを使用する:チェックする
で次へボタンを押します。


設定を変更せず次へボタンを押します。


設定を変更せず次へボタンを押します。


設定を変更せず次へボタンを押します。


コマンド バー(メニュー/ツール バー/リボン):クラシック メニューを使用する
(「新しい外観機能はどれも無効になります」ダイアログが出ますが、「はい」を選択します。)
その他の設定は変更せず次へボタンを押します。


印刷と印刷プレビュー:チェックしない
ActiveXコントロール:チェックしない
コモンコントロールマニフェスト:チェックしない
その他の設定は変更せず次へボタンを押します。


設定を変更せず完了ボタンを押します。

ビルドし、エラー、警告がないことを確認します。

CDockablePaneクラスの派生クラスの追加

「メニュー/プロジェクト/クラスの追加」を選択します。


カテゴリ:MFC
テンプレート:MFC クラス
追加ボタンを押します。


クラス名:適当な名前(今回は「CDockablePaneMyTree」)
基本クラス:CDockablePane
(それ他の設定は自動入力に任せます)

「完了」ボタンを押します。

ビルドし、エラー、警告がないことを確認します。

「作成したCDockablePane派生クラス」への「ドッキングペインに入れるコントロール」のメンバ変数の宣言の追加

「作成したCDockablePane派生クラス」のクラス定義の最初に、「ドッキングペインに入れるコントロール」のメンバ変数の宣言を追加します。
今回は、CTreeCtrl型のm_treectrlMyTreeというメンバ変数の定義を追加しています。



ビルドし、エラー、警告がないことを確認します。

「作成したCDockablePane派生クラス」へのOnCreate関数の追加

プロパティウィンドウを用いて、「作成したCDockablePane派生クラス」にWM_CREATEメッセージに対応するメッセージハンドラOnCreate関数を追加します。

OnCreate関数に、「ドッキングペインに入れるコントロール」の作成処理を追加します。



ビルドし、エラー、警告がないことを確認します。

「作成したCDockablePane派生クラス」へのOnSize関数の追加と編集

プロパティウィンドウを用いて、「作成したCDockablePane派生クラス」にWM_SIZEメッセージに対応するメッセージハンドラOnSize関数を追加します。

OnSize関数に、「ドッキングペインに入れるコントロール」を、ドッキングペインに対して位置あわせする処理を追加します。



ビルドし、エラー、警告がないことを確認します。

「作成したCDockablePane派生クラス」へのOnPaint関数の追加と編集

プロパティウィンドウを用いて、「作成したCDockablePane派生クラス」にWM_PAINTメッセージに対応するメッセージハンドラOnPaint関数を追加します。

OnPaint関数に、「ドッキングペインに入れるコントロール」の境界線を描く処理を追加します。



ビルドし、エラー、警告がないことを確認します。

「作成したCDockablePane派生クラス」へのOnSetFocus関数の追加と編集

プロパティウィンドウを用いて、「作成したCDockablePane派生クラス」にWM_SETFOCUSメッセージに対応するメッセージハンドラOnSetFocus関数を追加します。

OnSetFocus関数に、「ドッキングペインに入れるコントロール」にフォーカスを設定する処理を追加します。



ビルドし、エラー、警告がないことを確認します。

CMainFrameクラスの親クラスの変更

MainFrm.cpp および MainFrm.h の
CFrameWnd をすべて CFrameWndEx に置換します。(「大文字と小文字を区別する」「単語単位」にチェックを入れます。)

ビルドし、エラー、警告がないことを確認します。

CMainFrameクラスへの「作成したCDockablePane派生クラス」オブジェクトメンバ変数の追加

CMainFrameクラスのクラス定義の最初に、「作成したCDockablePane派生クラス」オブジェクトのメンバ変数の定義を追加します。
「作成したCDockablePane派生クラス」が定義されたファイルのインクルードを追加します。



ビルドし、エラー、警告がないことを確認します。

CMainFrameクラスのOnCreate関数の編集

CMainFrameクラスのOnCreate関数に、
・ドッキングペイン作成処理(作成したCDockablePaneの派生クラスのオブジェクトの作成処理)
・Visual Studio 2005 スタイルのドッキングウィンドウ動作に関する設定処理
・ドッキング処理
を追加します。



ビルドし、エラー、警告がないことを確認します。

実行

実行結果

ダミーデータ登録

「ドッキングペインに入れるコントロール」に何もデータがないのも面白くないので、「作成したCDockablePane派生クラス」のOnCreate関数にダミーデータ登録処理を追加してみます。



ビルドし、エラー、警告がないことを確認します。

実行

実行結果

補足(ドッキングぺインの位置の保存、復元)

アプリケーションクラスのソースファイル および ヘッダーファイル の
CWinApp をすべて CWinAppEx に置換(「大文字と小文字を区別する」「単語単位」にチェックを入れます。)すると、
アプリケーションを終了したときにドッキングペインの位置が保存され、
アプリケーションを次回起動したときにドッキングペインの位置が復元されるようになります。

補足(ステータスバーがなくなることへの対処)

CMainFrameクラスの親クラスを CFrameWndEx に変更すると、ステータスバーがなくなってしまうようだ。

ステータスバー変数の型を CStatusBar から CMFCStatusBar へ変更すると復活した。
(MainFrm.hの
 CStatusBar m_wndStatusBar;
 を
 CMFCStatusBar m_wndStatusBar;
 に変更)

ダウンロード

サンプルプロジェクト