チュートリアル : 新しい MFC シェル コントロールの使用
更新 : 2007 年 11 月
このチュートリアルでは、Windows エクスプローラのような外観のアプリケーションを作成します。ここでは、2 つのペインのあるウィンドウを作成します。左ペインにある CMFCShellTreeCtrl オブジェクトには、デスクトップが階層構造で表示されます。右ペインにある CMFCShellListCtrl には、左ペインで選択されたフォルダ内のファイルが表示されます。
前提条件
このチュートリアルを行うには、Visual C++ 2008 Feature Pack または Visual Studio 2008 Service Pack 1 をインストールする必要があります。
このチュートリアルは、読者が全般的な開発設定を使用することを指定して Visual Studio のセットアップを完了していることを前提としています。別の開発設定を使用している場合は、このチュートリアルで使用する一部の Visual Studio ウィンドウが既定で表示されないことがあります。
MFC アプリケーション ウィザードを使用して新しい MFC アプリケーションを作成するには
MFC アプリケーション ウィザードを使用して、新しい MFC アプリケーションを作成します。このウィザードを実行するには、[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。[新しいプロジェクト] ダイアログ ボックスが表示されます。
[新しいプロジェクト] ダイアログ ボックスの [プロジェクトの種類] ペインで、[Visual C++] ノードを展開し、[MFC] をクリックします。次に、[テンプレート] ペインで [MFC アプリケーション] をクリックします。プロジェクトの名前 (MFCShellControls など) を入力し、[OK] をクリックします。MFC アプリケーション ウィザードが表示されます。
[MFC アプリケーション ウィザード] ダイアログ ボックスで、[次へ] をクリックします。[アプリケーションの種類] ペインが表示されます。
[アプリケーションの種類] ペインの [アプリケーションの種類] で、[タブ付きドキュメント] をオフにします。次に、[シングル ドキュメント] を選択し、[ドキュメント/ビュー アーキテクチャのサポート] を選択します。[プロジェクト形式] で、[Visual Studio] を選択し、[視覚スタイルと色] ボックスの一覧の [Office 2007 (青のテーマ)] をクリックします。その他のオプションはそのままにします。[次へ] をクリックして、[複合ドキュメント サポート] ペインを表示します。
[複合ドキュメント サポート] ペインで、[なし] をクリックします。[次へ] をクリックして、[ドキュメントテンプレート文字列] ペインを表示します。
[ドキュメントテンプレート文字列] ペインでは何も変更しません。[次へ] をクリックして、[データベース サポート] ペインを表示します。
このアプリケーションではデータベースを使用しないため、[データベース サポート] ペインで [なし] を選択します。[次へ] をクリックして、[ユーザー インターフェイス機能] ペインを表示します。
[ユーザー インターフェイス機能] ペインで、[メニュー バーとツール バーを使用する] が選択されていることを確認します。その他のオプションはそのままにします。[次へ] をクリックして、[高度な機能] ペインを表示します。
[高度な機能] ペインの [高度な機能] で、[ActiveX コントロール] と [コモン コントロール マニフェスト] のみを選択します。[高度なフレーム ペイン] で、[ナビゲーション ウィンドウ] のみを選択します。これにより、ウィンドウの左側に、CMFCShellTreeCtrl が埋め込まれた状態でナビゲーション ウィンドウが作成されます。[次へ] をクリックして、[生成されたクラス] ペインを表示します。
[生成されたクラス] ペインでは何も変更しません。[完了] をクリックして、新しい MFC プロジェクトを作成します。
アプリケーションをビルドして実行することにより、アプリケーションが正常に作成されたことを確認します。アプリケーションをビルドするには、[ビルド] メニューの [ソリューションのビルド] をクリックします。アプリケーションが正常にビルドされたら、[デバッグ] メニューの [デバッグ開始] をクリックして、アプリケーションを実行します。
標準メニュー バー、標準ツール バー、標準ステータス バー、およびウィンドウの左側にフォルダ ビューと予定表ビューのある Outlook バーを備えたアプリケーションが自動的に作成されます。
シェル リスト コントロールをドキュメント ビューに追加するには
ここでは、ウィザードによって作成されたビューに CMFCShellListCtrl のインスタンスを追加します。ソリューション エクスプローラで MFCShellControlsView.h ファイルをダブルクリックしてビューのヘッダー ファイルを開きます。
ヘッダー ファイルの先頭部分にある #pragma once ディレクティブを探します。その直後に、次のコードを追加して、CMFCShellListCtrl のヘッダー ファイルをインクルードします。
#include <afxShellListCtrl.h>
次に、CMFCShellListCtrl 型のメンバ変数を追加します。最初に、ヘッダー ファイルで次のコメントを探します。
// Generated message map functions
そのコメントの直前に、次のコードを追加します。
private: CMFCShellListCtrl m_wndList;
MFC アプリケーション ウィザードによって既に CMainFrame クラスに CMFCShellTreeCtrl オブジェクトが作成されていますが、これはプロテクト メンバです。後で、このオブジェクトにアクセスします。したがって、ここでアクセサを作成します。ソリューション エクスプローラで MainFrm.h ヘッダー ファイルをダブルクリックして開きます。次のコメントを探します。
// Attributes
この直後に、次のメソッド宣言を追加します。
public: CMFCShellTreeCtrl& GetShellTreeCtrl();
次に、ソリューション エクスプローラで MainFrm.cpp ソース ファイルをダブルクリックして開きます。このファイルの末尾に、次のメソッド定義を追加します。
CMFCShellTreeCtrl& CMainFrame::GetShellTreeCtrl() { return m_wndTree; }
WM_CREATE Windows メッセージを処理するように CMFCShellControlsView クラスを更新します。MFCShellControlsView.h ヘッダー ファイルを開き、次のコード行をクリックします。
class CMFCShellControlsView : public CView
次に、[プロパティ] ウィンドウで [メッセージ] アイコンをクリックします。スクロール ダウンして WM_CREATE メッセージを探します。WM_CREATE の横のドロップダウン リストで、[<追加> OnCreate] をクリックします。これにより、メッセージ ハンドラが作成され、MFC メッセージ マップが自動的に更新されます。
OnCreate メソッドで、独自の CMFCShellListCtrl オブジェクトを作成します。MFCShellControlsView.cpp ソース ファイルで OnCreate メソッド定義を探し、その実装を次のコードに置き換えます。
int CMFCShellControlsView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; CRect rectDummy (0, 0, 0, 0); m_wndList.Create(WS_CHILD | WS_VISIBLE | LVS_REPORT, rectDummy, this, 1); return 0; }
WM_SIZE メッセージについて、前の手順を繰り返します。これにより、ユーザーがアプリケーション ウィンドウのサイズを変更するたびにアプリケーションのビューが再描画されるようになります。OnSize メソッドの定義を次のコードに置き換えます。
void CMFCShellControlsView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); m_wndList.SetWindowPos(NULL, -1, -1, cx, cy, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); }
最後に、CMFCShellTreeCtrl::SetRelatedList メソッドを使用して、CMFCShellTreeCtrl オブジェクトと CMFCShellListCtrl オブジェクトを関連付けます。このメソッドを呼び出すと、CMFCShellTreeCtrl で選択された項目の内容が自動的に CMFCShellListCtrl に表示されます。これは、CView::OnActivateView からオーバーライドした OnActivateView メソッドで行います。
MFCShellControlsView.h ヘッダー ファイルの CMFCShellControlsView クラス宣言に、次のメソッド宣言を追加します。
protected: virtual void OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView);
次に、このメソッドの定義を MFCShellControlsView.cpp ソース ファイルに追加します。
void CMFCShellControlsView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView) { if (bActivate && AfxGetMainWnd() != NULL) { ((CMainFrame*)AfxGetMainWnd())->GetShellTreeCtrl().SetRelatedList(&m_wndList); } CView::OnActivateView(bActivate, pActivateView, pDeactiveView); }
CMainFrame クラスのメソッドを呼び出すため、MFCShellControlsView.cpp ソース ファイルの先頭部分に次の #include ディレクティブを追加する必要があります。
#include "MainFrm.h"
アプリケーションをビルドして実行することにより、アプリケーションが正常に作成されたことを確認します。アプリケーションをビルドするには、[ビルド] メニューの [ソリューションのビルド] をクリックします。アプリケーションが正常にビルドされたら、[デバッグ] メニューの [デバッグ開始] をクリックして、アプリケーションを実行します。
CMFCShellTreeCtrl で選択されている項目の詳細が、ビュー ペインに表示されるようになりました。CMFCShellTreeCtrl でノードをクリックすると、CMFCShellListCtrl が自動的に更新されます。また、CMFCShellListCtrl でフォルダをダブルクリックすると、CMFCShellTreeCtrl が自動的に更新されます。
ツリー コントロールまたはリスト コントロールの任意の項目を右クリックします。実際の Windows エクスプローラを使用している場合と同じようなコンテキスト メニューが表示されます。
次の手順
ウィザードによって、フォルダ ペインと予定表ペインのある Outlook バーが作成されました。エクスプローラ ウィンドウには、おそらく予定表ペインは必要ありません。したがって、このペインを削除します。
CMFCShellListCtrl では、大きいアイコン、小さいアイコン、リスト、詳細などのさまざまなモードでファイルを表示できます。アプリケーションを更新して、この機能を実装します。ヒントについては、「Explorer サンプル : MFC Windows エクスプローラ アプリケーション」を参照してください。