逐步解說: 使用新的 MFC 殼層控制項
在這個逐步解說中,您將建立的應用程式,類似於 [檔案總管]。 您會建立包含兩個窗格的視窗。 左的窗格會包含 CMFCShellTreeCtrl 的階層式檢視顯示桌面上的物件。 右窗格會包含 CMFCShellListCtrl ,其顯示在左邊窗格中選取的資料夾中的檔案。
必要條件
這個逐步解說假設您已設定Visual Studio使用一般開發設定。 如果您正在使用一個不同的開發設定中,有些Visual Studio我們在這個逐步解說中使用的 windows 可能不會顯示預設情況下。
若要使用 MFC 應用程式精靈建立一個新的 MFC 應用程式
使用 MFC 應用程式精靈來建立一個新的 MFC 應用程式。 若要執行精靈,從檔案 ] 功能表選取 新增,綴恁寁 專案。 新的專案 ] 對話方塊隨即出現。
在新的專案 對話方塊方塊中,展開 Visual C++ 中的節點專案類型 窗格,然後選取 MFC。 然後,在範本 ] 窗格中,選取 的 MFC 應用程式。 輸入專案名稱,例如 MFCShellControls 再利用確定。 MFC 應用程式精靈隨即出現。
在 MFC 應用程式精靈 對話方塊中,按一下 [ 下一步。 應用程式類型窗格隨即出現。
在應用程式類型 窗格,在 應用程式類型的空心 索引標籤式文件選項。 接下來,選取 [ 單一文件 ,然後選取 [ 文件/檢視架構支援。 在專案樣式,請選取 Visual Studio,並從 視覺化樣式和色彩 拉下清單中選取 Office 2007 (Blue 佈景主題)。 保留所有其他選項。 按一下 [ 下一步 以顯示 複合文件支援窗格。
在複合文件支援 ] 窗格中,選取 無。 按一下 [ 下一步 以顯示 文件樣板字串窗格。
不要進行任何變更到文件樣板字串窗格。 按一下 [ 下一步 以顯示 資料庫支援窗格。
在資料庫支援 ] 窗格中,選取 無因為此應用程式不使用資料庫。 按一下 [ 下一步 以顯示 使用者介面功能窗格。
在使用者介面功能 ] 窗格中,請確定 使用功能表列和工具列選項。 保留所有其他選項。 按一下 [ 下一步 以顯示 進階功能窗格。
在進階功能 窗格,在 進階的功能,選取 [僅顯示 ActiveX 控制項 和 通用控制項資訊清單。 在進階框架窗格,選取 [僅顯示 瀏覽窗格選項。 這會導致使用精靈來建立與視窗的左邊窗格CMFCShellTreeCtrl已內嵌。 按一下 [ 下一步 以顯示 產生的類別窗格。
我們不會進行任何變更到產生的類別窗格。 因此,請按一下完成來建立新的 MFC 專案。
建置並執行應用程式,以確認應用程式建立成功。 若要從建置應用程式時, 建置 ] 功能表選取 建置方案。 如果應用程式建置成功時,執行應用程式,藉由選取啟動偵錯 的 偵錯功能表。
精靈會自動建立具有視窗的左邊有一個標準功能表列、 標準工具列、 標準的狀態列及 outlook 功能區的應用程式資料夾 檢視和 行事曆檢視。
若要將命令介面的清單控制項加入至文件檢視
在本節中,您將加入的執行個體CMFCShellListCtrl至精靈所建立的檢視。 檢視標頭檔按兩下以開啟中的 MFCShellControlsView.h 方案總管] 中。
找出#pragma once靠近頂端的標頭檔指示詞。 下面因其而增加此程式碼中包含的標頭檔,請立即CMFCShellListCtrl:
#include <afxShellListCtrl.h>
現在,加入成員變數的型別CMFCShellListCtrl。 首先,在標頭檔中找到下列註解:
// Generated message map functions
立即該註解上面加入下列程式碼:
private: CMFCShellListCtrl m_wndList;
MFC 應用程式精靈已經建立CMFCShellTreeCtrl物件在CMainFrame類別,但它是受保護的成員。 我們稍後會存取此物件。 因此,現在建立它的存取子。 按兩下以開啟 MainFrm.h 標頭檔方案總管] 中。 找出下列註解:
// Attributes
緊接著下面,加入以下的方法宣告:
public: CMFCShellTreeCtrl& GetShellTreeCtrl();
接下來,MainFrm.cpp 的原始程式檔按兩下以開啟在方案總管] 中。 在該檔案的下方,加入下列方法定義:
CMFCShellTreeCtrl& CMainFrame::GetShellTreeCtrl() { return m_wndTree; }
現在我們更新CMFCShellControlsView類別來處理WM_CREATE windows 訊息。 開啟 MFCShellControlsView.h 標頭檔,按一下這行程式碼:
class CMFCShellControlsView : public CView
接著,在屬性 ] 視窗中,按一下 訊息圖示。 向下捲動直到您找到WM_CREATE訊息。 從下拉式清單旁邊WM_CREATE,請選取 <Add> OnCreate。 這會為我們的 [訊息處理常式,並且會自動更新 [MFC 訊息對應。
在OnCreate方法,現在我們將建立我們CMFCShellListCtrl物件。 找出OnCreate MFCShellControlsView.cpp 中的方法定義來源檔案和它的實作取代成下列程式碼:
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和CMFCShellListCtrl物件藉由使用CMFCShellTreeCtrl::SetRelatedList方法。 您呼叫這個方法之後, CMFCShellListCtrl就會自動顯示在 [選取項目的內容CMFCShellTreeCtrl。 我們將會執行此作業OnActivateView方法,這麼做會覆寫從CView::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類別中,我們必須將#include指示詞在 MFCShellControlsView.cpp 的原始程式檔的頂端:
#include "MainFrm.h"
建置並執行應用程式,以確認應用程式建立成功。 若要從建置應用程式時, 建置 ] 功能表選取 建置方案。 如果應用程式建置成功時,執行選取 [巨集啟動偵錯 的 偵錯功能表。
您現在應該可以看到選取的項目之詳細資料CMFCShellTreeCtrl在 [檢視] 窗格中。 當您按一下中的節點CMFCShellTreeCtrl、 CMFCShellListCtrl會自動更新。 同樣地,如果您按兩下資料夾,以在CMFCShellListCtrl、 CMFCShellTreeCtrl ,應自動更新。
在樹狀目錄控制項,或在清單控制項中的任何項目上按一下滑鼠右鍵。 注意您會收到相同的快顯功能表,彷彿正在使用真正的檔案總管]。
後續步驟
在精靈建立 outlook 功能區兼具資料夾 窗格和 行事曆窗格。 可能絲毫 「 不會是合理的作法行事曆中的檔案總管視窗的窗格。 因此,現在移除該窗格。
CMFCShellListCtrl支援,例如在不同的模式中檢視檔案大圖示, 小圖示, 清單,以及的詳細資訊。 更新您的應用程式,以實作這項功能。 Hint: see Visual C++ 範例.