チュートリアル : 新しい 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 プロジェクトを作成するには

  1. メイン メニューで、[ファイル]>[新規作成]>[プロジェクト] の順に選択して、[新しいプロジェクトの作成] ダイアログ ボックスを開きます。

  2. 上部にある検索ボックスに「MFC」と入力し、結果リストから [MFC アプリ] を選択します。

  3. 次へをクリックします。 次のページで、プロジェクトの名前を入力し、必要な場合はプロジェクトの場所を指定します。

  4. [作成] ボタンをクリックしてプロジェクトを作成します。

    MFC アプリケーション ウィザードが表示された後、次のオプションを使用します。

    1. 左側の [アプリケーションの種類] を選択します。 次に、[シングル ドキュメント] を選択し、[ドキュメント/ビュー アーキテクチャのサポート] を選択します。 [プロジェクト形式] で、[Visual Studio] を選択し、[視覚スタイルと色] ボックスの一覧の [Office 2007 (青のテーマ)] をクリックします。

    2. [複合ドキュメント サポート] ペインで、[なし] をクリックします。

    3. [ドキュメント テンプレートのプロパティ] ペイン には変更を加えないでください。

    4. [ユーザー インターフェイス機能] ペインで、[メニュー バーとツール バーを使用する] が選択されていることを確認します。 その他のオプションはそのままにします。

    5. [高度な機能] ウィンドウで、ActiveX コントロールコモン コントロール マニフェスト、およびナビゲーション ウィンドウ オプションを選択します。 それ以外はすべてのそのままにします [ナビゲーション ウィンドウ] オプションにより、ウィンドウの左側に、CMFCShellTreeCtrl が埋め込まれた状態でナビゲーション ウィンドウが作成されます。

    6. [生成されたクラス] ウィンドウに変更を加えないので、[完了] をクリックして新しい MFC プロジェクトを作成します。

Visual Studio 2017 以前で MFC プロジェクトを作成するには

  1. MFC アプリケーション ウィザードを使用して、新しい MFC アプリケーションを作成します。 このウィザードを実行するには、[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。 [新しいプロジェクト] ダイアログ ボックスが表示されます。

  2. [新しいプロジェクト] ダイアログ ボックスの [プロジェクトの種類] ペインで、[Visual C++] ノードを展開し、[MFC] をクリックします。 次に、[テンプレート] ペインで [MFC アプリケーション] をクリックします。 プロジェクトの名前 (MFCShellControls など) を入力し、[OK] をクリックします。

    MFC アプリケーション ウィザードが表示された後、次のオプションを使用します。

    1. [アプリケーションの種類] ペインの [アプリケーションの種類] で、[タブ付きドキュメント] オプションをオフにします。 次に、[シングル ドキュメント] を選択し、[ドキュメント/ビュー アーキテクチャのサポート] を選択します。 [プロジェクト形式] で、[Visual Studio] を選択し、[視覚スタイルと色] ボックスの一覧の [Office 2007 (青のテーマ)] をクリックします。

    2. [複合ドキュメント サポート] ペインで、[なし] をクリックします。

    3. [ドキュメントテンプレート文字列] ペインでは何も変更しません。

    4. [データベース サポート] ウィンドウ (2015 Visual Studio以前) では、アプリケーションでデータベースを使用しないので、[なし] を選択します。

    5. [ユーザー インターフェイス機能] ペインで、[メニュー バーとツール バーを使用する] が選択されていることを確認します。 その他のオプションはそのままにします。

    6. [高度な機能] ペインの [高度な機能] で、[ActiveX コントロール][コモン コントロール マニフェスト] のみを選択します。 [高度なフレーム ペイン] で、[ナビゲーション ウィンドウ] オプションのみを選択します。 これにより、ウィンドウの左側に、CMFCShellTreeCtrl が埋め込まれた状態でナビゲーション ウィンドウが作成されます。

    7. [生成されたクラス] ウィンドウに変更を加えないので、[完了] をクリックして新しい MFC プロジェクトを作成します。

アプリケーションをビルドして実行することにより、アプリケーションが正常に作成されたことを確認します。 アプリケーションをビルドするには、[ビルド] メニューの [ソリューションのビルド] をクリックします。 アプリケーションが正常にビルドされたら、[デバッグ] メニューの [デバッグ開始] をクリックして、アプリケーションを実行します。

標準メニュー バー、標準ツール バー、標準ステータス バー、およびウィンドウの左側にフォルダー ビューと予定表ビューのある Outlook バーを備えたアプリケーションが自動的に作成されます。

シェル リスト コントロールをドキュメント ビューに追加するには

  1. ここでは、ウィザードによって作成されたビューに CMFCShellListCtrl のインスタンスを追加します。 ソリューション エクスプローラーMFCShellControlsView.h ファイルをダブルクリックしてビューのヘッダー ファイルを開きます。

    ヘッダー ファイルの先頭部分にある #pragma once ディレクティブを探します。 その直後に、次のコードを追加して、CMFCShellListCtrl のヘッダー ファイルをインクルードします。

    #include <afxShellListCtrl.h>
    

    次に、CMFCShellListCtrl 型のメンバー変数を追加します。 最初に、ヘッダー ファイルで次のコメントを探します。

    // Generated message map functions
    

    そのコメントの直前に、次のコードを追加します:

    private:
    CMFCShellListCtrl m_wndList;
    
  2. MFC アプリケーション ウィザードによって既に CMainFrame クラスに CMFCShellTreeCtrl オブジェクトが作成されていますが、これはプロテクト メンバーです。 後でオブジェクトにアクセスします。そのため、ここでアクセサーを作成します。 ソリューション エクスプローラーで MainFrm.h ヘッダー ファイルをダブルクリックして開きます。 次のコメントを探します。

    // Attributes
    

    この直後に、次のメソッド宣言を追加します。

    public:
        CMFCShellTreeCtrl& GetShellTreeCtrl();
    

    次に、ソリューション エクスプローラーで MainFrm.cpp ソース ファイルをダブルクリックして開きます。 このファイルの末尾に、次のメソッド定義を追加します。

    CMFCShellTreeCtrl& CMainFrame::GetShellTreeCtrl()
    {
         return m_wndTree;
    }
    
  3. 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;
    }
    
  4. 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);
    }
    
  5. 最後の手順では、 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"
    
  6. アプリケーションをビルドして実行することにより、アプリケーションが正常に作成されたことを確認します。 アプリケーションをビルドするには、[ビルド] メニューの [ソリューションのビルド] をクリックします。 アプリケーションが正常にビルドされたら、[デバッグ] メニューの [デバッグ開始] をクリックして、アプリケーションを実行します。

    CMFCShellTreeCtrl で選択されている項目の詳細が、ビュー ペインに表示されるようになりました。 CMFCShellTreeCtrl でノードをクリックすると、CMFCShellListCtrl が自動的に更新されます。 また、CMFCShellListCtrl でフォルダーをダブルクリックすると、CMFCShellTreeCtrl が自動的に更新されます。

    ツリー コントロールまたはリスト コントロールの任意の項目を右クリックします。 ファイル エクスプローラーを使用している場合と同じようなコンテキスト メニューが表示されます。

次のステップ

  • ウィザードによって、フォルダー ペインと予定表ペインのある Outlook バーが作成されました。 エクスプローラー ウィンドウに予定表ペインを表示しても意味がない可能性が高いので、ここでそのペインを削除します。

  • CMFCShellListCtrl では、大きいアイコン小さいアイコンリスト詳細などのさまざまなモードでファイルを表示できます。 アプリケーションを更新して、この機能を実装します。 ヒント: Visual C++ サンプルを参照してください。

関連項目

チュートリアル