チュートリアル : 新しい MFC シェル コントロールの使用
このチュートリアルでは、エクスプローラーのようなアプリケーションを作成します。 2 つのペインを含むウィンドウを作成します。 左ペインにある CMFCShellTreeCtrl オブジェクトには、デスクトップが階層構造で表示されます。 右ペインにある CMFCShellListCtrl には、左ペインで選択されたフォルダー内のファイルが表示されます。
前提条件
Visual Studio 2017 以降では、MFC のサポートはオプション コンポーネントです。 これをインストールするには、Windows の [スタート] メニューから Visual Studio インストーラーを開きます。 使用しているバージョンのVisual Studioを見つけて、[変更] ボタンを選択します。 [C++ でのデスクトップ開発] タイルがオン になっていることを確認してください。 [省略可能なコンポーネント] で、[MFC サポート] ボタンをオンにします。
このチュートリアルは、General Development Settings を使用してVisual Studio のセットアップを完了していることを前提としています。 別の開発設定を使用している場合は、このチュートリアルで使用する一部の Visual Studio ウィンドウが既定で表示されないことがあります。
MFC アプリケーション ウィザードを使用して新しい MFC アプリケーションを作成するには
これらの手順は、使っている Visual Studio のバージョンによって異なります。 優先するバージョンの Visual Studio のドキュメントを表示するには、 [バージョン] セレクター コントロールを使用します。 このページの目次の一番上にあります。
Visual Studio で MFC プロジェクトを作成するには
メイン メニューで、[ファイル]>[新規作成]>[プロジェクト] の順に選択して、[新しいプロジェクトの作成] ダイアログ ボックスを開きます。
上部にある検索ボックスに「MFC」と入力し、結果リストから [MFC アプリ] を選択します。
次へをクリックします。 次のページで、プロジェクトの名前を入力し、必要な場合はプロジェクトの場所を指定します。
[作成] ボタンをクリックしてプロジェクトを作成します。
MFC アプリケーション ウィザードが表示された後、次のオプションを使用します。
左側の [アプリケーションの種類] を選択します。 次に、[シングル ドキュメント] を選択し、[ドキュメント/ビュー アーキテクチャのサポート] を選択します。 [プロジェクト形式] で、[Visual Studio] を選択し、[視覚スタイルと色] ボックスの一覧の [Office 2007 (青のテーマ)] をクリックします。
[複合ドキュメント サポート] ペインで、[なし] をクリックします。
[ドキュメント テンプレートのプロパティ] ペイン には変更を加えないでください。
[ユーザー インターフェイス機能] ペインで、[メニュー バーとツール バーを使用する] が選択されていることを確認します。 その他のオプションはそのままにします。
[高度な機能] ウィンドウで、ActiveX コントロール、コモン コントロール マニフェスト、およびナビゲーション ウィンドウ オプションを選択します。 それ以外はすべてのそのままにします [ナビゲーション ウィンドウ] オプションにより、ウィンドウの左側に、
CMFCShellTreeCtrl
が埋め込まれた状態でナビゲーション ウィンドウが作成されます。[生成されたクラス] ウィンドウに変更を加えないので、[完了] をクリックして新しい MFC プロジェクトを作成します。
Visual Studio 2017 以前で MFC プロジェクトを作成するには
MFC アプリケーション ウィザードを使用して、新しい MFC アプリケーションを作成します。 このウィザードを実行するには、[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。 [新しいプロジェクト] ダイアログ ボックスが表示されます。
[新しいプロジェクト] ダイアログ ボックスの [プロジェクトの種類] ペインで、[Visual C++] ノードを展開し、[MFC] をクリックします。 次に、[テンプレート] ペインで [MFC アプリケーション] をクリックします。 プロジェクトの名前 (
MFCShellControls
など) を入力し、[OK] をクリックします。MFC アプリケーション ウィザードが表示された後、次のオプションを使用します。
[アプリケーションの種類] ペインの [アプリケーションの種類] で、[タブ付きドキュメント] オプションをオフにします。 次に、[シングル ドキュメント] を選択し、[ドキュメント/ビュー アーキテクチャのサポート] を選択します。 [プロジェクト形式] で、[Visual Studio] を選択し、[視覚スタイルと色] ボックスの一覧の [Office 2007 (青のテーマ)] をクリックします。
[複合ドキュメント サポート] ペインで、[なし] をクリックします。
[ドキュメントテンプレート文字列] ペインでは何も変更しません。
[データベース サポート] ウィンドウ (2015 Visual Studio以前) では、アプリケーションでデータベースを使用しないので、[なし] を選択します。
[ユーザー インターフェイス機能] ペインで、[メニュー バーとツール バーを使用する] が選択されていることを確認します。 その他のオプションはそのままにします。
[高度な機能] ペインの [高度な機能] で、[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; }
CMFCShellControlsView
Windows メッセージを処理するようにWM_CREATE
クラスを更新します。 [クラス ビュー] ウィンドウを開き、CMFCShellControlsView
クラスを選択します。 右クリックし、[プロパティ] を選択します。次に、クラス ウィザードで、[メッセージ] タブ をクリックします。
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::SetRelatedList
を呼び出すと、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
が自動的に更新されます。ツリー コントロールまたはリスト コントロールの任意の項目を右クリックします。 ファイル エクスプローラーを使用している場合と同じようなコンテキスト メニューが表示されます。
次のステップ
ウィザードによって、フォルダー ペインと予定表ペインのある Outlook バーが作成されました。 エクスプローラー ウィンドウに予定表ペインを表示しても意味がない可能性が高いので、ここでそのペインを削除します。
CMFCShellListCtrl
では、大きいアイコン、小さいアイコン、リスト、詳細などのさまざまなモードでファイルを表示できます。 アプリケーションを更新して、この機能を実装します。 ヒント: Visual C++ サンプルを参照してください。