目錄
引言
一、高級控件ListCtrl
二、高級控件TreeCtrl
三、Shell控件
四、CImageList
五、綜合代碼示例
引言
????????在MFC編程里,高級控件能大幅提升應用程序的交互性與功能性。接下來,咱們會詳細講講ListCtrl和TreeCtrl這兩個高級控件。不僅會介紹它們的功能、操作方法,還會分享創建與使用時的實操步驟,助力大家掌握這些控件的開發技巧 。?
一、高級控件ListCtrl
????????ListCtrl控件可以把字符串內容,用列表形式展示出來。這種展示方法既整齊又直觀,在實際使用過程中,能讓用戶更方便。
????????一般情況下,使用ListCtrl控件時,需要將它和CListCtrl類,或者從CListCtrl派生出來的類所創建的對象進行綁定。?
常見函數如下:
具體每個消息的含義,可在控件屬性欄中選擇消息查看中文解釋,也可查閱MSDN。
ListCtrl控件的創建步驟
1. 添加變量:為ListCtrl控件添加變量。
2. 添加類:右鍵點擊list控件,選擇“添加類”,類名設為CMyListCtrl,基類選擇CListCtrl(該類繼承于CListCtrl)。
3. 綁定變量生成代碼:綁定變量完成后會在當前對話框類的相應位置生成代碼。
頭文件中:
protected:
virtual void DoDataExchange(CDataExchange*pDX);
DECLARE_MESSAGE_MAP()
// 該窗口類對應的h類中
public:
CListCtrl mListCtrl;
CPP文件中:
void CListCtrlDlg::DoDataExchange(CDataExchange*pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_LIST1, mListCtrl);
}
4. 初始化:在該窗口類的OnInitDialog()中對ListCtrl初始化。
//獲取當前控件的擴展風格
DWORD dwOldStyle = mListCtrl.GetExtendedStyle(); //獲取原風格
//設置當前控件的擴展風格
mListCtrl.SetExtendedStyle(dwOldStyle |LVS_EX_FULLROWSELECT| //報表視圖形式LVS_EX_GRIDLINES //網格線(只適用與report風格的listctrl)LVS_EX_CHECKBOXES); //item前生成checkbox控件
//獲取list的寬度
CRect rc;
mListCtrl.GetClientRect(rc);
int nWidth = rc.Width();
//為List插入列信息
mListCtrl.InsertColumn(0, L"姓名", 0, nWidth/3); //當前列編號、要求插入的信息、風格、列的寬度
mListCtrl.InsertColumn(1, L"性別", 0, nWidth /3);
mListCtrl.InsertColumn(2, L"年齡", 0, nWidth/3);
//插入生信息
mListCtrl.InsertItem(0, L"張三"); //行號
mListCtrl.SetItemText(0, 1, L"男"); //行號、列號
mListCtrl.SetItemText(0, 2, L"20");
mListCtrl.InsertItem(1, L"李四");
mListCtrl.SetItemText(1, 1, L"男");
mListCtrl.SetItemText(1, 2, L"22");
????????運行之后,列表框會顯示相應內容。
5. 響應選中行:為新添加的List類添加點擊事件,通過類向導選擇“消息”中的NM_CLICK消息。
頭文件中:
public :
afx_msg void OnNMGIick(NMHDR *pNMHDR, LRESULT *pResult);
CPP文件中:
// 消息映射宏中添加的代碼
BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)ON_NOTIFY_REFLECT(NM_CLICK, &CMyListCtrl::OnNMClicK)
END_MESSAGE_MAP()
// 函數實現部分
void CMyListCtrl::OnNMClicK(NMHDR *pNMHDR, LRESULT *pResult)
{LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);//TODO:在此添加控件通知處理程序代碼*pResult = 0;
}
可以在注釋下面添加相應代碼。
二、高級控件TreeCtrl
????????樹控件是較為復雜的控件,這里先簡要介紹其基本使用方法,后續課程會介紹一些使用技巧。樹控件的每個節點都由一個HTREEITEM類型的句柄標識,在插入或查找樹節點時會用到。
CTree類的常見函數
重點函數詳解
HTREEITEM InsertItem(LPCTSTR lpszItem,int nImage,int nSelectedImage,HTREEITEM hParent =TVI_ROOT,HTREEITEM hInsertAfter =TVI_LAST);
- lpszItem:為新節點的標簽文本字符串的指針。
- nImage:為新節點的圖標在樹形控件圖像序列中的索引。
- nSelectedImage:為新節點被選中時的圖標在圖像序列中的索引。
- hParent:為插入節點的父節點的句柄。
- hInsertAfter:為新節點的前一個節點的句柄,即新節點將被插入到hInsertAfter節點之后。
與其他控件使用方法相同,需要為Tree控件綁定一個控件類型的變量。
通知消息
????????Tree控件和所有控件一樣,都有針對父窗口的通知消息,可通過類向導查看,如:TVN_SELCHANGED、TVN_BEGINDRAG、TVN_BEGINLABELEDIT、TVN_BEGINRDRAG、TVN_DELETEITEM、TVN_ENDLABELEDIT、TVN_GETDISPINFO、TVN_ITEMEXPANDED等。
????????我們可測試其中的TVN_SELCHANGED消息(被選擇的樹節點改變的消息),與tab控件一樣,這個消息也有對應的發給自身的反射消息,在類向導中添加其處理程序即可。
三、Shell控件
????????Shell控件主要用于實現與Windows Shell相關的功能,例如文件資源管理器的樹形視圖和列表視圖。以下是關于MFC中Shell控件用法的詳細介紹:
1. Shell控件概述
MFC提供了兩個主要的Shell控件:
- `CMFCShellTreeCtrl`:用于顯示文件系統的樹形結構,類似于Windows資源管理器的左側樹形視圖。
- `CMFCShellListCtrl`:用于顯示指定文件夾中的文件列表,類似于Windows資源管理器的右側文件列表。
這兩個控件可以結合使用,創建一個類似于文件資源管理器的應用程序。
2. 創建Shell控件
以下是如何在MFC應用程序中使用Shell控件的步驟:
2.1 創建MFC項目
- 使用Visual Studio的MFC應用程序向導創建一個新的MFC項目。在向導中,選擇“單個文檔”或“對話框”應用程序類型,并確保勾選“ActiveX控件”和“導航窗格”選項。導航窗格選項會自動在窗口左側嵌入一個`CMFCShellTreeCtrl`控件。
2.2 添加Shell控件
- `CMFCShellTreeCtrl`:通常由向導自動創建,嵌入在主窗口的左側窗格中。
- `CMFCShellListCtrl`:需要在視圖類中手動添加。首先在視圖頭文件中包含`afxShellListCtrl.h`,然后聲明一個`CMFCShellListCtrl`類型的成員變量。接著,在`OnCreate`方法中初始化并創建該控件。
示例代碼:
#include <afxShellListCtrl.h>class CMFCShellControlsView : public CView {
private:CMFCShellListCtrl m_wndList;
};
在`OnCreate`方法中:
int CMFCShellControlsView::OnCreate(LPCREATESTRUCT lpCreateStruct) {if (CView::OnCreate(lpCreateStruct) == -1)return -1;CRect rect;GetClientRect(&rect);m_wndList.Create(WS_CHILD | WS_VISIBLE | LVS_REPORT, rect, this, 2);return 0;
}
3. Shell控件的交互
- 樹形控件與列表控件的聯動:當用戶在`CMFCShellTreeCtrl`中選擇一個文件夾時,`CMFCShellListCtrl`應顯示該文件夾中的內容。可以通過處理樹形控件的`TVN_SELCHANGED`消息來實現這一功能。
示例代碼:
void CMFCShellControlsView::OnTvnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult) {LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);CString strPath;m_wndTree.GetItemPath(strPath, pNMTreeView->itemNew.hItem);m_wndList.SetFolder(strPath);*pResult = 0;
}
4. Shell控件的擴展功能
- 文件操作:可以通過`CMFCShellListCtrl`實現文件的復制、移動、刪除等操作。
- 自定義顯示:可以自定義列表控件的顯示方式,例如圖標視圖、詳細信息視圖等。
5. 注意事項
- 路徑處理:Shell控件使用PIDL(指向項目標識符列表的指針)來唯一標識文件和文件夾。可以使用`CMFCShellManager`類來管理PIDL和路徑之間的轉換。
- 權限問題:某些系統文件夾可能需要管理員權限才能訪問,需確保應用程序有足夠的權限。
????????通過以上步驟和代碼示例,您可以在MFC應用程序中實現類似文件資源管理器的功能,并充分利用Shell控件的強大功能。
四、CImageList
????????`CImageList` 是 MFC(Microsoft Foundation Classes)中的一個類,用于管理相同大小的圖像集合,通常用于為其他控件(如列表控件、樹控件、標簽控件等)提供圖標資源。以下是 `CImageList` 的用法詳細介紹:
1. 創建 `CImageList` 對象
`CImageList` 的創建通過 `Create` 方法實現,該方法有多個重載版本,常用的形式如下:
BOOL Create(int cx, int cy, UINT nFlags, int nInitial, int nGrow);
BOOL Create(UINT nBitmapID, int cx, int nGrow, COLORREF crMask);
BOOL Create(LPCTSTR lpszBitmapID, int cx, int nGrow, COLORREF crMask);
- 參數說明:
? - `cx` 和 `cy`:圖像的寬度和高度(以像素為單位)。
? - `nFlags`:指定圖像列表的類型,如 `ILC_COLOR4`(16色)、`ILC_COLOR8`(256色)、`ILC_COLOR32`(真彩色)等。
? - `nInitial`:初始圖像數量。
? - `nGrow`:當圖像列表需要擴展時,每次增加的圖像數量。
? - `nBitmapID` 或 `lpszBitmapID`:位圖資源的 ID 或路徑。
? - `crMask`:用于生成透明掩碼的顏色。
示例:
CImageList m_ImageList;
m_ImageList.Create(32, 32, ILC_COLOR32 | ILC_MASK, 0, 4);
2. 添加圖像
????????`CImageList` 支持從資源文件或外部文件添加圖像:
// 從資源文件添加圖標
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON2));// 從資源文件添加位圖
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
m_ImageList.Add(&bmp, RGB(0, 0, 0)); // RGB(0, 0, 0) 為透明色
bmp.DeleteObject();// 從外部文件添加位圖
HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, _T("e:\\TIME.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
CBitmap* pBitmap = new CBitmap;
pBitmap->Attach(hBitmap);
m_ImageList.Add(pBitmap, RGB(0, 0, 0));
delete pBitmap;
3. 關聯控件
????????`CImageList` 通常與其他控件(如 `CListCtrl`、`CTreeCtrl`)一起使用,通過 `SetImageList` 方法關聯:
// 關聯列表控件
CListCtrl m_ListCtrl;
m_ListCtrl.SetImageList(&m_ImageList, LVSIL_NORMAL);// 關聯樹控件
CTreeCtrl m_TreeCtrl;
m_TreeCtrl.SetImageList(&m_ImageList, TVSIL_NORMAL);
4. 繪制圖像
????????可以通過 `Draw` 方法將圖像繪制到設備上下文(DC)中:
CDC* pDC = GetDC();
CPoint pt(30, 50);
for (int i = 0; i < m_ImageList.GetImageCount(); i++) {m_ImageList.Draw(pDC, i, pt, ILD_NORMAL);pt.x += 60;
}
ReleaseDC(pDC);
5. 常用操作
- 獲取圖像數量:`int GetImageCount()`
- 刪除圖像:`BOOL Remove(int nImage)`
- 設置背景顏色:`COLORREF SetBkColor(COLORREF cr)`
- 刪除圖像列表:`BOOL DeleteImageList()`
- 提取圖標:`HICON ExtractIcon(int nImage)`
6. 應用示例
????????以下是一個完整的示例,展示如何創建 `CImageList` 并關聯到 `CListCtrl`:
// 在對話框類中定義成員變量
CImageList m_ImageList;
CListCtrl m_ListCtrl;// 在 OnInitDialog 中初始化
m_ImageList.Create(32, 32, ILC_COLOR32 | ILC_MASK, 0, 4);
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON2));m_ListCtrl.SetImageList(&m_ImageList, LVSIL_NORMAL);
m_ListCtrl.InsertItem(0, _T("Item 1"), 0);
m_ListCtrl.InsertItem(1, _T("Item 2"), 1);
7. 注意事項
- `CImageList` 本身不可見,必須與其他控件結合使用。
- 圖像列表中的圖像大小必須一致。
- 使用透明色時,確保 `ILC_MASK` 標志被設置。
通過以上方法,可以有效地在 MFC 應用程序中使用 `CImageList` 來管理和顯示圖像資源。
五、綜合代碼示例
????????該項目是一個演示 MFC 中列表控件(CListCtrl)和樹形控件(CTreeCtrl)使用的示例程序。主要功能包括:
1. 列表控件(CListCtrl)功能:
?? - 使用網格線樣式和整行選擇
?? - 包含3列數據展示
?? - 每行顯示3個數據項
?? - 支持圖標顯示
?? - 點擊列表項會彈出消息框顯示選中內容
2. 樹形控件(CTreeCtrl)功能:
?? - 支持圖標顯示
?? - 包含兩級樹形結構:
???? - 第一級:SDK、MFC
???? - 第二級:SDK001/SDK002、MFC001/MFC002
?? - 支持節點選擇和點擊事件
?? - 點擊樹節點會彈出消息框顯示節點文本
3. Shell控件功能:
?? - 使用 CMFCShellTreeCtrl 和 CMFCShellListCtrl 實現文件系統瀏覽
?? - 樹形控件顯示文件夾結構
?? - 列表控件顯示當前文件夾內容
?? - 兩個控件聯動,選擇文件夾時自動更新列表內容
4. 界面特點:
?? - 使用圖標列表(CImageList)管理界面圖標
?? - 包含4個圖標資源(1.ico ~ 4.ico)
?? - 支持對話框最小化時的圖標顯示
5. 其他功能:
?? - 包含"關于"對話框
?? - 支持系統菜單
?? - 使用 Unicode 字符集
?? - 支持 Windows 視覺樣式
????????這個項目主要用于演示 MFC 中常用控件的使用方法和基本功能,包括列表控件、樹形控件、Shell控件等。
// 01.ListTree.h : PROJECT_NAME 應用程序的主頭文件
//#pragma once#ifndef __AFXWIN_H__#error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"
#endif#include "resource.h" // 主符號// CMy01ListTreeApp:
// 有關此類的實現,請參閱 01.ListTree.cpp
//class CMy01ListTreeApp : public CWinApp
{
public:CMy01ListTreeApp();// 重寫
public:virtual BOOL InitInstance();// 實現DECLARE_MESSAGE_MAP()
};extern CMy01ListTreeApp theApp;
// 01.ListTreeDlg.h : 頭文件
//#pragma once
#include "afxcmn.h"
#include "afxshelltreectrl.h"
#include "afxshelllistctrl.h"// CMy01ListTreeDlg 對話框
class CMy01ListTreeDlg : public CDialogEx
{
// 構造
public:CMy01ListTreeDlg(CWnd* pParent = NULL); // 標準構造函數// 對話框數據
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_MY01LISTTREE_DIALOG };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 實現
protected:HICON m_hIcon;// 生成的消息映射函數virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()
public:CListCtrl m_list;// 初始化listvoid InitList();// 初始化圖標數組CImageList m_img;void InitImgList();afx_msg void OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult);// 初始化樹控件CTreeCtrl m_tree;void InitTree();afx_msg void OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult);afx_msg void OnNMClickTree1(NMHDR *pNMHDR, LRESULT *pResult);CMFCShellTreeCtrl m_mfcTree;CMFCShellListCtrl m_mfcList;
};
//resource.h
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 01.ListTree.rc 使用
//
#define IDM_ABOUTBOX 0x0010
#define IDD_ABOUTBOX 100
#define IDS_ABOUTBOX 101
#define IDD_MY01LISTTREE_DIALOG 102
#define IDR_MAINFRAME 128
#define IDI_ICON1 130
#define IDI_ICON2 131
#define IDI_ICON3 132
#define IDI_ICON4 133
#define IDC_LIST1 1000
#define IDC_TREE1 1001
#define IDC_MFCSHELLTREE1 1002
#define IDC_MFCSHELLLIST1 1003// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 135
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1004
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
//01.ListTree.rc
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"#define APSTUDIO_READONLY_SYMBOLS
/
//
// Generated from the TEXTINCLUDE 2 resource.
//
#ifndef APSTUDIO_INVOKED
#include "targetver.h"
#endif
#include "afxres.h"
#include "verrsrc.h"/
#undef APSTUDIO_READONLY_SYMBOLS/
// 中文(簡體,中國) resources#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED#ifdef APSTUDIO_INVOKED
/
//
// TEXTINCLUDE
//1 TEXTINCLUDE
BEGIN"resource.h\0"
END2 TEXTINCLUDE
BEGIN"#ifndef APSTUDIO_INVOKED\r\n""#include ""targetver.h""\r\n""#endif\r\n""#include ""afxres.h""\r\n""#include ""verrsrc.h""\r\n""\0"
END3 TEXTINCLUDE
BEGIN"#define _AFX_NO_SPLITTER_RESOURCES\r\n""#define _AFX_NO_OLE_RESOURCES\r\n""#define _AFX_NO_TRACKER_RESOURCES\r\n""#define _AFX_NO_PROPERTY_RESOURCES\r\n""\r\n""#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)\r\n""LANGUAGE 4, 2\r\n""#include ""res\\My01ListTree.rc2"" // 非 Microsoft Visual C++ 編輯的資源\r\n""#include ""l.CHS\\afxres.rc"" // 標準組件\r\n""#if !defined(_AFXDLL)\r\n""#include ""l.CHS\\afxribbon.rc"" // MFC 功能區和控制條資源\r\n""#endif\r\n""#endif\r\n""\0"
END#endif // APSTUDIO_INVOKED/
//
// Icon
//// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDR_MAINFRAME ICON "res\\01.ListTree.ico"IDI_ICON1 ICON "res\\1.ico"IDI_ICON2 ICON "res\\2.ico"IDI_ICON3 ICON "res\\3.ico"IDI_ICON4 ICON "res\\4.ico"/
//
// Dialog
//IDD_ABOUTBOX DIALOGEX 0, 0, 170, 62
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "關于 01.ListTree"
FONT 9, "MS Shell Dlg", 0, 0, 0x1
BEGINICON IDR_MAINFRAME,IDC_STATIC,14,14,21,20LTEXT "01.ListTree,1.0 版",IDC_STATIC,42,14,114,8,SS_NOPREFIXLTEXT "Copyright (C) 2018",IDC_STATIC,42,26,114,8DEFPUSHBUTTON "確定",IDOK,113,41,50,14,WS_GROUP
ENDIDD_MY01LISTTREE_DIALOG DIALOGEX 0, 0, 320, 200
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "01.ListTree"
FONT 9, "MS Shell Dlg", 0, 0, 0x1
BEGINCONTROL "",IDC_LIST1,"SysListView32",LVS_REPORT | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,136,7,177,72CONTROL "",IDC_TREE1,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | WS_BORDER | WS_HSCROLL | WS_TABSTOP,7,7,129,71CONTROL "",IDC_MFCSHELLTREE1,"MfcShellTree",WS_BORDER | WS_HSCROLL | WS_TABSTOP,7,79,128,114CONTROL "",IDC_MFCSHELLLIST1,"MfcShellList",WS_BORDER | WS_TABSTOP | 0x841,135,79,178,114
END/
//
// Version
//VS_VERSION_INFO VERSIONINFOFILEVERSION 1,0,0,1PRODUCTVERSION 1,0,0,1FILEFLAGSMASK 0x3fL
#ifdef _DEBUGFILEFLAGS 0x1L
#elseFILEFLAGS 0x0L
#endifFILEOS 0x40004LFILETYPE 0x1LFILESUBTYPE 0x0L
BEGINBLOCK "StringFileInfo"BEGINBLOCK "080404B0"BEGINVALUE "CompanyName", "TODO: <公司名>"VALUE "FileDescription", "01.ListTree"VALUE "FileVersion", "1.0.0.1"VALUE "InternalName", "01.ListTree.exe"VALUE "LegalCopyright", "TODO: (C) <公司名>。 保留所有權利。"VALUE "OriginalFilename", "01.ListTree.exe"VALUE "ProductName", "TODO: <產品名>"VALUE "ProductVersion", "1.0.0.1"ENDENDBLOCK "VarFileInfo"BEGINVALUE "Translation", 0x804, 1200END
END/
//
// DESIGNINFO
//#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGINIDD_ABOUTBOX, DIALOGBEGINLEFTMARGIN, 7RIGHTMARGIN, 163TOPMARGIN, 7BOTTOMMARGIN, 55ENDIDD_MY01LISTTREE_DIALOG, DIALOGBEGINLEFTMARGIN, 7RIGHTMARGIN, 313TOPMARGIN, 7BOTTOMMARGIN, 193END
END
#endif // APSTUDIO_INVOKED/
//
// AFX_DIALOG_LAYOUT
//IDD_MY01LISTTREE_DIALOG AFX_DIALOG_LAYOUT
BEGIN0
END/
//
// Dialog Info
//IDD_MY01LISTTREE_DIALOG DLGINIT
BEGINIDC_MFCSHELLTREE1, 0x37c, 88, 0
0x4d3c, 0x4346, 0x6853, 0x6c65, 0x546c, 0x6572, 0x4365, 0x7274, 0x5f6c,
0x6e45, 0x6261, 0x656c, 0x6853, 0x6c65, 0x436c, 0x6e6f, 0x6574, 0x7478,
0x654d, 0x756e, 0x463e, 0x4c41, 0x4553, 0x2f3c, 0x464d, 0x5343, 0x6568,
0x6c6c, 0x7254, 0x6565, 0x7443, 0x6c72, 0x455f, 0x616e, 0x6c62, 0x5365,
0x6568, 0x6c6c, 0x6f43, 0x746e, 0x7865, 0x4d74, 0x6e65, 0x3e75, IDC_MFCSHELLLIST1, 0x37c, 88, 0
0x4d3c, 0x4346, 0x6853, 0x6c65, 0x4c6c, 0x7369, 0x4374, 0x7274, 0x5f6c,
0x6e45, 0x6261, 0x656c, 0x6853, 0x6c65, 0x436c, 0x6e6f, 0x6574, 0x7478,
0x654d, 0x756e, 0x463e, 0x4c41, 0x4553, 0x2f3c, 0x464d, 0x5343, 0x6568,
0x6c6c, 0x694c, 0x7473, 0x7443, 0x6c72, 0x455f, 0x616e, 0x6c62, 0x5365,
0x6568, 0x6c6c, 0x6f43, 0x746e, 0x7865, 0x4d74, 0x6e65, 0x3e75, 0
END/
//
// String Table
//STRINGTABLE
BEGINIDS_ABOUTBOX "關于 01.ListTree(&A)..."
END#endif // 中文(簡體,中國) resources
/#ifndef APSTUDIO_INVOKED
/
//
// Generated from the TEXTINCLUDE 3 resource.
//
#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE 4, 2
#include "l.CHS\afxres.rc" // 標準組件
#if !defined(_AFXDLL)
#include "l.CHS\afxribbon.rc" // MFC 功能區和控制條資源
#endif
#endif/
#endif // not APSTUDIO_INVOKED
// 01.ListTree.cpp : 定義應用程序的類行為。
//#include "stdafx.h"
#include "01.ListTree.h"
#include "01.ListTreeDlg.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif// CMy01ListTreeAppBEGIN_MESSAGE_MAP(CMy01ListTreeApp, CWinApp)ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()// CMy01ListTreeApp 構造CMy01ListTreeApp::CMy01ListTreeApp()
{// 支持重新啟動管理器m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;// TODO: 在此處添加構造代碼,// 將所有重要的初始化放置在 InitInstance 中
}// 唯一的一個 CMy01ListTreeApp 對象CMy01ListTreeApp theApp;// CMy01ListTreeApp 初始化BOOL CMy01ListTreeApp::InitInstance()
{// 如果一個運行在 Windows XP 上的應用程序清單指定要// 使用 ComCtl32.dll 版本 6 或更高版本來啟用可視化方式,//則需要 InitCommonControlsEx()。 否則,將無法創建窗口。INITCOMMONCONTROLSEX InitCtrls;InitCtrls.dwSize = sizeof(InitCtrls);// 將它設置為包括所有要在應用程序中使用的// 公共控件類。InitCtrls.dwICC = ICC_WIN95_CLASSES;InitCommonControlsEx(&InitCtrls);CWinApp::InitInstance();AfxEnableControlContainer();// 創建 shell 管理器,以防對話框包含// 任何 shell 樹視圖控件或 shell 列表視圖控件。CShellManager *pShellManager = new CShellManager;// 激活“Windows Native”視覺管理器,以便在 MFC 控件中啟用主題CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));// 標準初始化// 如果未使用這些功能并希望減小// 最終可執行文件的大小,則應移除下列// 不需要的特定初始化例程// 更改用于存儲設置的注冊表項// TODO: 應適當修改該字符串,// 例如修改為公司或組織名SetRegistryKey(_T("應用程序向導生成的本地應用程序"));CMy01ListTreeDlg dlg;m_pMainWnd = &dlg;INT_PTR nResponse = dlg.DoModal();if (nResponse == IDOK){// TODO: 在此放置處理何時用// “確定”來關閉對話框的代碼}else if (nResponse == IDCANCEL){// TODO: 在此放置處理何時用// “取消”來關閉對話框的代碼}else if (nResponse == -1){TRACE(traceAppMsg, 0, "警告: 對話框創建失敗,應用程序將意外終止。\n");TRACE(traceAppMsg, 0, "警告: 如果您在對話框上使用 MFC 控件,則無法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n");}// 刪除上面創建的 shell 管理器。if (pShellManager != NULL){delete pShellManager;}#ifndef _AFXDLLControlBarCleanUp();
#endif// 由于對話框已關閉,所以將返回 FALSE 以便退出應用程序,// 而不是啟動應用程序的消息泵。return FALSE;
}
// 01.ListTreeDlg.cpp : 實現文件
//#include "stdafx.h"
#include "01.ListTree.h"
#include "01.ListTreeDlg.h"
#include "afxdialogex.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif// 用于應用程序“關于”菜單項的 CAboutDlg 對話框class CAboutDlg : public CDialogEx
{
public:CAboutDlg();// 對話框數據
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_ABOUTBOX };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 實現
protected:DECLARE_MESSAGE_MAP()
};CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()// CMy01ListTreeDlg 對話框CMy01ListTreeDlg::CMy01ListTreeDlg(CWnd* pParent /*=NULL*/): CDialogEx(IDD_MY01LISTTREE_DIALOG, pParent)
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CMy01ListTreeDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_LIST1, m_list);DDX_Control(pDX, IDC_TREE1, m_tree);DDX_Control(pDX, IDC_MFCSHELLTREE1, m_mfcTree);DDX_Control(pDX, IDC_MFCSHELLLIST1, m_mfcList);
}BEGIN_MESSAGE_MAP(CMy01ListTreeDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_NOTIFY(NM_CLICK, IDC_LIST1, &CMy01ListTreeDlg::OnNMClickList1)ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, &CMy01ListTreeDlg::OnTvnSelchangedTree1)ON_NOTIFY(NM_CLICK, IDC_TREE1, &CMy01ListTreeDlg::OnNMClickTree1)
END_MESSAGE_MAP()// CMy01ListTreeDlg 消息處理程序BOOL CMy01ListTreeDlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 將“關于...”菜單項添加到系統菜單中。// IDM_ABOUTBOX 必須在系統命令范圍內。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 設置此對話框的圖標。 當應用程序主窗口不是對話框時,框架將自動// 執行此操作SetIcon(m_hIcon, TRUE); // 設置大圖標SetIcon(m_hIcon, FALSE); // 設置小圖標// TODO: 在此添加額外的初始化代碼InitImgList();InitList();InitTree();m_mfcTree.SetRelatedList(&m_mfcList);return TRUE; // 除非將焦點設置到控件,否則返回 TRUE
}void CMy01ListTreeDlg::OnSysCommand(UINT nID, LPARAM lParam)
{if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}
}// 如果向對話框添加最小化按鈕,則需要下面的代碼
// 來繪制該圖標。 對于使用文檔/視圖模型的 MFC 應用程序,
// 這將由框架自動完成。void CMy01ListTreeDlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // 用于繪制的設備上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使圖標在工作區矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 繪制圖標dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}
}//當用戶拖動最小化窗口時系統調用此函數取得光標
//顯示。
HCURSOR CMy01ListTreeDlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}void CMy01ListTreeDlg::InitList()
{// 設置擴展風格 帶網格 整行選中m_list.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);// 設置list的關聯圖標數組m_list.SetImageList(&m_img, LVSIL_SMALL);// 設置行列信息// 1. 先設置列標題m_list.InsertColumn(0, L"第1列", 0, 80);m_list.InsertColumn(1, L"第2列", 0, 80);m_list.InsertColumn(2, L"第3列", 0, 80);// 2. 再插入行信息 行標題 行內容for (int i=0;i<20;i++){TCHAR szShow[20] = {};swprintf_s(szShow, 20, L"第%d行",i+1);// 行標題 m_list.InsertItem(i, szShow,i%4);// 行內容swprintf_s(szShow, 20, L"第%d行%d列", i + 1,1);m_list.SetItemText(i, 1, szShow);swprintf_s(szShow, 20, L"第%d行%d列", i + 1, 2);m_list.SetItemText(i, 2, szShow);}}void CMy01ListTreeDlg::InitImgList()
{// 每個icon的信息 大小等// 創建一成員為32*32大小使用32位色的icon數組,// 數組初始空間大小為4個,滿了之后按1遞增m_img.Create(32, 32, ILC_COLOR32, 4, 1);m_img.Add(AfxGetApp()->LoadIconW(IDI_ICON1));m_img.Add(AfxGetApp()->LoadIconW(IDI_ICON2));m_img.Add(AfxGetApp()->LoadIconW(IDI_ICON3));m_img.Add(AfxGetApp()->LoadIconW(IDI_ICON4));}void CMy01ListTreeDlg::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);// TODO: 在此添加控件通知處理程序代碼*pResult = 0;CString str = m_list.GetItemText(pNMItemActivate->iItem, pNMItemActivate->iSubItem);MessageBox(str.GetBuffer());
}void CMy01ListTreeDlg::InitTree()
{// 設置關聯圖標m_tree.SetImageList(&m_img, TVSIL_NORMAL);// 1級節點HTREEITEM hParent = m_tree.InsertItem(L"SDK",// 插入文本0,// 正常情況下顯示的圖標在數組中的索引3,// 該節點被點擊的時候顯示的圖標在數組中的索引TVI_ROOT,// 父節點TVI_LAST// 插入方式);// 2級節點m_tree.InsertItem(L"SDK001", 1,3,hParent, TVI_LAST);m_tree.InsertItem(L"SDK002", 2,3,hParent, TVI_LAST);// 1級節點hParent = m_tree.InsertItem(L"MFC", 0,3,TVI_ROOT, TVI_LAST);m_tree.InsertItem(L"MFC001", 1, 3, hParent, TVI_LAST);m_tree.InsertItem(L"MFC002", 2, 3, hParent, TVI_LAST);
}void CMy01ListTreeDlg::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult)
{LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);// TODO: 在此添加控件通知處理程序代碼*pResult = 0;m_tree.Invalidate();
}void CMy01ListTreeDlg::OnNMClickTree1(NMHDR *pNMHDR, LRESULT *pResult)
{// TODO: 在此添加控件通知處理程序代碼*pResult = 0;CPoint pt;GetCursorPos(&pt);// 屏幕坐標轉客戶區坐標 m_tree.ScreenToClient(&pt);UINT uFlags = 0;//TVHT_ONITEMLABEL HTREEITEM hTree = m_tree.HitTest(pt, &uFlags);if (uFlags == TVHT_ONITEMLABEL || uFlags == TVHT_ONITEMICON){CString str = m_tree.GetItemText(hTree);MessageBox(str);}}
運行效果: