【第30節】MFC編程:ListCtrl控件和TreeCtrl控件

目錄

引言

一、高級控件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);}}

運行效果:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75122.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75122.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75122.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

為什么 ThreadLocalMap 的 key 是弱引用 value是強引用

問題一&#xff1a;為什么 ThreadLocalMap 的 key 是弱引用&#xff1f; 【假設 Entry 的 key 是對 ThreadLocal 對象的強引用】&#xff1a;這個 Entry 又持有 ThreadLocal 對象和 value 對象的強引用。如果在其他地方都沒有對這個 ThreadLocla 對象的引用了、然后在使用 Thr…

DeepSeek本地部署(linux)

一、下載并安裝Ollama 1.下載Ollama Ollama官網:Ollama 點擊"Download",會跳轉至下載頁面。 1.1在線下載安裝 可復制此命令到Linux服務器進行在線下載,如下載速度過慢,可選擇離線下載安裝。 curl -fsSL https://ollama.com/install.sh | sh1.2離線下載安裝 …

基于Halcon仿VM流程列表的執行效果

Halcon本身應用需要一定的門檻&#xff0c;但是也可以封裝成類似VM簡單易操作的樣子 上期文章分享的是連線功能&#xff0c;本期分享數據傳參 1&#xff0c;定義通用屬性和方法 public class BaseModel {public HObject HInput { get; set; }//圖像輸入public HObject HOutpu…

打車APP訂單系統邏輯梳理與實現

一、邏輯分析 打車 APP 訂單系統是整個打車業務的核心&#xff0c;負責處理從乘客下單到行程結束的一系列流程&#xff0c;涉及乘客、司機和平臺三方的交互。 乘客端 下單&#xff1a;乘客打開 APP&#xff0c;輸入上車地點、目的地&#xff0c;選擇車型等信息后提交訂單。此時…

雜草YOLO系列數據集4000張

一份開源數據集——雜草YOLO數據集&#xff0c;該數據集適用于農業智能化、植物識別等計算機視覺應用場景。 數據集詳情 ?訓練集&#xff1a;3,664張高清標注圖像?測試集&#xff1a;180張多樣性場景樣本?驗證集&#xff1a;359張嚴格篩選數據 下載鏈接 雜草YOLO數據集分…

算法 | 河馬優化算法原理,公式,應用,算法改進及研究綜述,matlab代碼

以下是關于河馬優化算法(Hippopotamus Optimization Algorithm, HO)的完整綜述,包含原理、公式、應用場景、改進方向及可直接運行的 Matlab 完整代碼。一、算法原理 河馬優化算法(HO)由Amiri等人于2024年提出,是受河馬群體行為啟發的元啟發式算法,其核心基于以下三階段行…

知識就是力量——HELLO GAME WORD!

你好&#xff01;游戲世界&#xff01; 簡介環境配置前期準備好文章介紹創建頭像小功能組件安裝本地中文字庫HSV顏色空間音頻生成空白的音頻 游戲UI開發加載動畫注冊登錄界面UI界面第一版第二版 第一個游戲&#xff08;貪吃蛇&#xff09;第二個游戲&#xff08;俄羅斯方塊&…

Android Activity 的 launchMode 與 Task Stack 管理

Android 中的 android:launchMode 決定了 Activity 在啟動時如何在任務欄中管理它的存在方式。下面我們來結合 Task Stack 管理詳細解釋。 1. android:launchMode 的四種模式 1.1 standard (標準模式, 默認) 啟動方式&#xff1a;每次啟動都會創建一個新實例并壓入欄任務堆中…

2025選擇手機之我見

自從開店之后&#xff0c;沒當有手機召開發布會&#xff0c;我就得去大概看看&#xff0c;了解一下屏幕&#xff0c;充電之類的東西。畢竟跟我的生意息息相關&#xff0c;而且還得研究要不要上新&#xff0c;從我目前賣貨的情況來看&#xff0c;折疊屏不是大眾的選擇&#xff0…

【區塊鏈安全 | 第九篇】基于Heimdall設計的智能合約反編譯項目

文章目錄 背景目的安裝1、安裝 Rust2、克隆 heimdall-dec3、編譯 heimdall-dec4、運行 heimdall-dec 使用說明1、訪問 Web 界面2、輸入合約信息3、查看反編譯結果 實戰演示1、解析普通合約2、解析代理合約 背景 在區塊鏈安全研究中&#xff0c;智能合約的審計和分析至關重要。…

利用 PCI-Express 交換機實現面向未來的推理服務器

在數據中心系統的歷史上&#xff0c;沒有比被 Nvidia 選為其 AI 系統的組件供應商更高的贊譽了。 這就是為什么新興的互連芯片制造商 Astera Labs 感到十分高興&#xff0c;因為該公司正在 PCI-Express 交換機、PCI-Express 重定時器和 CXL 內存控制器方面與 Broadcom 和 Marv…

智能交通預警桿:守護道路安全的科技先鋒

在城市化進程加速以及機動車保有量持續增長的背景下&#xff0c;道路交通安全與擁堵問題漸趨嚴峻。智能交通預警桿應時而生&#xff0c;其集成多種高科技功能&#xff0c;正逐步成為現代城市交通管理中至關重要的智能裝備&#xff0c;對于提升交通效率、保障出行安全發揮著關鍵…

flink 基站與服務器長連接,每次連接和斷開都會上報數據,統計過去一小時每個基站斷開次數和時長

模擬生成數據 CREATE TABLE ods_station_log (base_station_id int, -- 基站IDevent_type int, -- 事件類型: connect/disconnectevent_time TIMESTAMP_LTZ(3), -- 事件時間WATERMARK FOR event_time AS event_time - INTERVAL 5 SECOND -- 允許5秒亂序 ) WITH …

自定義一些C語言的字符串函數

一、代碼如下 (一)十六進制字符串轉十進制整數 #include<stdio.h> // 把一個十六進制字符轉成十進制整數 int hexToInt(char hexs[]){ int index; int k 0; for(k 0; ; k) { if(hexs[k] \0) { index k; break; …

核函數(機器學習深度學習)

一、核函數的基本概念 核函數&#xff08;Kernel Function&#xff09; 是機器學習中處理非線性問題的核心工具&#xff0c;通過隱式映射將數據從原始空間轉換到高維特征空間&#xff0c;從而在高維空間中實現線性可分或線性建模。其數學本質是計算兩個樣本在高維空間中的內積…

微服務架構中的精妙設計:服務注冊/服務發現-Eureka

一.使用注冊中心背景 1.1服務遠程調用問題 服務之間遠程調?時, 我們的URL是寫死的 String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 缺點&#xff1a; 當更換機器, 或者新增機器時, 這個URL就需要跟著變更, 就需要去通知所有的相關服…

極速版:棧的內存/局部變量表/堆的內存細分

1. 棧的存儲 每個線程都有自己的棧&#xff0c;棧中數據以棧幀&#xff08;Stack Frame&#xff09;為基本單位 線程上正在執行的每個方法都各自對應一個棧楨&#xff08;Stack Frame&#xff09; 棧楨是一個內存區塊&#xff0c;是一個數據集&#xff0c;維系著方法執行過程…

【操作系統】內存泄漏 vs 內存碎片

【操作系統】內存泄漏 vs 內存碎片 內存泄漏&#xff08;Memory Leak&#xff09; vs 內存碎片&#xff08;Memory Fragmentation&#xff09;1. 內存泄漏&#xff08;Memory Leak&#xff09;2. 內存碎片&#xff08;Memory Fragmentation&#xff09;3. 內存泄漏 vs 內存碎片…

力扣HOT100之矩陣:73. 矩陣置零

這道題我沒有想到什么好的辦法&#xff0c;直接暴力AC了&#xff0c;直接遍歷兩次矩陣&#xff0c;第一次遍歷用兩個向量分別記錄出現0的行數和列數&#xff0c;第二次遍歷就判斷當前的元素的行數或者列數是否出現在之前的兩個向量中&#xff0c;若出現了就直接置零&#xff0c…

?Flink/Kafka在python中的用處

一、基礎概念 1. ?Apache Kafka 是什么&#xff1f; ?核心功能&#xff1a;Kafka 是一個分布式流處理平臺&#xff0c;主要用于構建實時數據管道和流式應用程序。?核心概念&#xff1a; ?生產者&#xff08;Producer&#xff09;?&#xff1a;向 Kafka 發送數據的程序。…