【第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.mzph.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 发送数据的程序。…