MFC列表控件ListControl和树控件TreeControl




列表控件

 列表相关的类:CListCtrl-父类是CWnd,本质是一个控件; CListView-父类是CView,本质是一个视图。相当于在视图中嵌入了一个CListCtrl控件

 列表控件的使用

  •    1.1 显示方式:LVS_ICON/LVS_SMALLICON/LVS_LIST/LVS_REPORT
  •    1.2 图标:CListCtrl::SetImageList;CListCtrl::GetImageList
  •    1.3 设置列:CListCtrl::InsertColumn
  •    1.4 数据的添加:CListCtrl::InsertItem-插入数据项;CListCtrl::SetItemText-设置数据项的文本             
  •    1.5 遍历数据项:CListCtrl::GetFirstSelectedItemPosition; CListCtrl::GetNextSelectedItem; CListCtrl::GetSelectedCount
  •    1.6 数据项的删除:CListCtrl::DeleteItem-删除指定索引的数据项;CListCtrl::DeleteAllItems-删除所有项;CListCtrl::DeleteColumn-删除指定列
  •    1.7 查找:CListCtrl::FindItem
  •    1.8 附加数据:CListCtrl::SetItemData;CListCtrl::GetItemData   

实例:新建MFC基于对话框的工程MFCList;关键代码

  1. void CMFCListDlg::DoDataExchange(CDataExchange* pDX)  
  2. {  
  3.     CDialogEx::DoDataExchange(pDX);  
  4.     DDX_Control(pDX, IDC_COMBO1, m_wndStyle);//添加下拉列表框的关联控件变量  
  5.     DDX_Control(pDX, IDC_LIST1, m_wndList);//添加列表控件的关联控件变量  
  6. }  
  7.   
  8. BEGIN_MESSAGE_MAP(CMFCListDlg, CDialogEx)  
  9.     ON_WM_SYSCOMMAND()  
  10.     ON_WM_PAINT()  
  11.     ON_WM_QUERYDRAGICON()  
  12.     ON_BN_CLICKED(IDC_BUTTON_Seclect, &CMFCListDlg::OnBnClickedButtonSeclect)//"获取选择项"控件的双击事件  
  13.     ON_BN_CLICKED(IDC_BUTTON_Delete, &CMFCListDlg::OnBnClickedButtonDelete)//"删除选择项"控件 的双击事件  
  14.     ON_CBN_SELCHANGE(IDC_COMBO1, &CMFCListDlg::OnCbnSelchangeCombo1)//下拉列表框的选择项改变事件  
  15.     ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CMFCListDlg::OnNMDblclkList1)//列表控件的双击项事件  
  16. END_MESSAGE_MAP()  
  17. //BOOL CMFCListDlg::OnInitDialog()调用下列代码  
  18. //初始化列表控件  
  19. InitListCtrl();  
  20. m_wndStyle.InsertString(0,L"图标(ICON)");  
  21. m_wndStyle.InsertString(1,L"小图标(SMALL ICON)");  
  22. m_wndStyle.InsertString(2,L"列表(LIST)");  
  23. m_wndStyle.InsertString(3,L"报表(REPORT)");  
  24. m_wndStyle.SetCurSel(0);  
  25.   
  26. //"获取选择项"控件的双击事件  
  27. void CMFCListDlg::OnBnClickedButtonSeclect()  
  28. {   
  29.     POSITION pos=m_wndList.GetFirstSelectedItemPosition();  
  30.     while(pos)  
  31.     {  
  32.         int nItem=m_wndList.GetNextSelectedItem(pos);  
  33.         MessageBox(m_wndList.GetItemText(nItem,0));//显示数据项的文本  
  34.     }  
  35. }  
  36. //"删除选择项"控件 的双击事件  
  37. void CMFCListDlg::OnBnClickedButtonDelete()  
  38. {  
  39.     LVFINDINFO info;  
  40.     info.flags=LVFI_STRING|LVFI_PARTIAL;  
  41.     info.psz=L"stu.data";  
  42.     int index=0;  
  43.     if ((index=m_wndList.FindItem(&info))!=-1)  
  44.     {  
  45.         m_wndList.DeleteItem(index);  
  46.     }  
  47. }  
  48.   
  49. //下拉列表框的选择项改变事件  
  50. void CMFCListDlg::OnCbnSelchangeCombo1()  
  51. {   
  52.     int nSel=m_wndStyle.GetCurSel();  
  53.     switch (nSel)  
  54.     {  
  55.     case 0://图标  
  56.         m_wndList.ModifyStyle(LVS_SMALLICON|LVS_LIST|LVS_REPORT,LVS_ICON);  
  57.         break;  
  58.     case 1://小图标  
  59.         m_wndList.ModifyStyle(LVS_ICON|LVS_LIST|LVS_REPORT,LVS_SMALLICON);  
  60.         break;  
  61.     case 2://列表  
  62.         m_wndList.ModifyStyle(LVS_SMALLICON|LVS_ICON|LVS_REPORT,LVS_LIST);  
  63.         break;  
  64.     case 3://报表  
  65.         m_wndList.ModifyStyle(LVS_ICON|LVS_LIST|LVS_SMALLICON,LVS_REPORT);  
  66.         break;  
  67.     }  
  68. }   
  69. //列表控件的双击项事件  
  70. void CMFCListDlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)  
  71. {  
  72.     LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);  
  73.     // TODO: 在此添加控件通知处理程序代码  
  74.     int nSel=pNMItemActivate->iItem;  
  75.     if (-1!=nSel)  
  76.     {  
  77.         CString* pPath=(CString*)m_wndList.GetItemData(nSel);  
  78.         //MessageBox(*pPath);  
  79.         ShowFile(*pPath+L"\\*.*");  
  80.     }  
  81.     *pResult = 0;  
  82. }  
  83.   
  84. void CMFCListDlg::InitListCtrl()  
  85. {  
  86.     //1 设置控件的图标列表  
  87.     CImageList* pILNormal=new CImageList;  
  88.     pILNormal->Create(IDB_NORMAL,32,1,RGB(0,0,0));  
  89.     m_wndList.SetImageList(pILNormal,LVSIL_NORMAL);  
  90.     //2 设置控件的小图标  
  91.     CImageList* pILSmall=new CImageList;  
  92.     pILSmall->Create(IDB_SMALL,18,1,RGB(0,0,0));  
  93.     m_wndList.SetImageList(pILSmall,LVSIL_SMALL);  
  94.     //3 设置列  
  95.     m_wndList.InsertColumn(0,L"名称",LVCFMT_LEFT,150);  
  96.     m_wndList.InsertColumn(1,L"大小",LVCFMT_LEFT,80);  
  97.     m_wndList.InsertColumn(2,L"类型",LVCFMT_LEFT,80);  
  98.     m_wndList.InsertColumn(3,L"修改日期",LVCFMT_LEFT,100);  
  99.     //4 插入测试数据  
  100.     m_wndList.InsertItem(0,L"文件",1);  
  101.     m_wndList.SetItemText(0,1,L"15");  
  102.     m_wndList.SetItemText(0,2,L"文件");  
  103.     m_wndList.SetItemText(0,3,L"2012-03-06");  
  104.   
  105.     m_wndList.InsertItem(1,L"文件夹",0);  
  106.     m_wndList.SetItemText(1,1,L"12");  
  107.     m_wndList.SetItemText(1,2,L"文件夹");  
  108.     m_wndList.SetItemText(1,3,L"2011-03-06");  
  109.     //5 显示C盘根目录下的所有文件和文件夹  
  110.     //ShowFile(L"c:\\");  
  111.     //6 设置控件的背景色  
  112.     m_wndList.SetBkColor(RGB(200,200,200));  
  113.     m_wndList.SetTextColor(RGB(255,0,0));  
  114.     m_wndList.SetTextBkColor(CLR_NONE);  
  115.     //7 设置控件的背景图片  
  116.     m_wndList.SetBkImage(L"res\\MFCList.ico");  
  117. }  
  118.   
  119. void CMFCListDlg::ShowFile(CString strPath)  
  120. {  
  121.     //添加数据前,先清空原有数据  
  122.     m_wndList.DeleteAllItems();  
  123.     int index=0;//添加数据项的索引  
  124.     CFileFind find;  
  125.     BOOL bRet=find.FindFile(strPath+"*.*");  
  126.     while (bRet)  
  127.     {  
  128.         bRet=find.FindNextFileW();  
  129.         if (find.IsDirectory())  
  130.         {  
  131.             m_wndList.InsertItem(index,find.GetFileName(),0);  
  132.             m_wndList.SetItemText(index,2,L"文件夹");  
  133.         }  
  134.         else  
  135.         {  
  136.             m_wndList.InsertItem(index,find.GetFileName(),1);  
  137.             DWORD nLen=find.GetLength();  
  138.             CString strLen;  
  139.             strLen.Format(L"%d",nLen);  
  140.             m_wndList.SetItemText(index,1,strLen);  
  141.         }  
  142.         //保存路径  
  143.         CString* pPath=new CString;  
  144.         *pPath=find.GetFilePath();  
  145.         m_wndList.SetItemData(index,(DWORD)pPath);  
  146.         index++;  
  147.     }  
  148.     find.Close();//结束查找  
  149. }  

运行结果:

树控件

树控件相关类:CTreeCtrl-父类是CWnd,本质上是一个控件;CTreeView -父类是CView,本质是一个视图。CTreeView是在CView中嵌入了一个CTreeCtrl控件

树控件的使用

  •      2.1 设置图标:CTreeCtrl::SetImageList;CTreeCtrl::GetImageList
  •      2.2 增加节点:CTreeCtrl::InserItem增加节点,并返回节点句柄
  •      2.3 获取节点:CTreeCtrl::GetSelectedItem-获取选择的节点;CTreeCtrl::GetParentItem-获取节点的父节点;CTreeCtrl::GetRootItem-获取根节点 ...
  •      2.4 判断:CTreeCtrl::ItemHasChildren-判断节点是否有子节点
  •      2.5 删除节点:CTreeCtrl::DeleteItem-删除指定节点;CTreeCtrl::DeleteAllItems-删除所有节点
  •      2.6 附加数据:CTreeCtrl::SetItemData;CTreeCtrl::GetItemData

实例:新建MFC基于对话框的工程MFCTree;关键代码

  1. void CMFCTreeDlg::DoDataExchange(CDataExchange* pDX)  
  2. {  
  3.     CDialogEx::DoDataExchange(pDX);  
  4.     DDX_Control(pDX, IDC_TREE1, m_wndTree);//增加树控件的关联控件变量  
  5. }  
  6.   
  7. BEGIN_MESSAGE_MAP(CMFCTreeDlg, CDialogEx)  
  8.     ON_WM_SYSCOMMAND()  
  9.     ON_WM_PAINT()  
  10.     ON_WM_QUERYDRAGICON()    
  11.     ON_NOTIFY(NM_DBLCLK, IDC_TREE1, &CMFCTreeDlg::OnNMDblclkTree1)//双击树控件项的事件  
  12. END_MESSAGE_MAP()  
  13.   
  14. //初始化树控件  
  15. void CMFCTreeDlg::InitTreeControl()  
  16. {  
  17.     //1.设置图标列表  
  18.     CImageList* pilNormal=new CImageList;  
  19.     BOOL bs=pilNormal->Create(IDB_NORMAL,16,1,RGB(1,0,0)); //IDB_NORMAL是 bitmap资源 64 x 16  
  20.     if (bs)  
  21.     {  
  22.         m_wndTree.SetImageList(pilNormal,TVSIL_NORMAL);  
  23.     }  
  24.     else  
  25.     {  
  26.         AfxMessageBox(L"adsfads");  
  27.     }  
  28.     m_wndTree.SetItemHeight(20);//设置行高  
  29.     HTREEITEM hRoot=m_wndTree.InsertItem(L"C:\\",0,2);//插入根目录  
  30.     ShowFile(L"c:\\",hRoot);  
  31. }  
  32. void CMFCTreeDlg::ShowFile(CString strPath,HTREEITEM hParent)  
  33. {  
  34.     if (m_wndTree.ItemHasChildren(hParent))  
  35.     {  
  36.         return;  
  37.     }  
  38.     CFileFind find;  
  39.     BOOL bRet=find.FindFile(strPath+"\\*.*");  
  40.     while(bRet)  
  41.     {  
  42.         HTREEITEM hItem;  
  43.         bRet=find.FindNextFileW();  
  44.         CString strName=find.GetFileName();  
  45.         if (!find.IsDots())  
  46.         {  
  47.             if (find.IsDirectory())  
  48.             {  
  49.                 hItem=m_wndTree.InsertItem(strName,0,2,hParent);  
  50.             }  
  51.             else  
  52.             {  
  53.                 hItem=m_wndTree.InsertItem(strName,1,3,hParent);  
  54.             }  
  55.             //保存路径  
  56.             CString *pPath=new CString;  
  57.             *pPath=find.GetFilePath();  
  58.             m_wndTree.SetItemData(hItem,(DWORD)pPath);  
  59.         }  
  60.     }  
  61.     find.Close();//结束查找  
  62.     m_wndTree.Expand(hParent,TVE_EXPAND);//展开根节点  
  63. }      
  64. //树控件项的双击事件  
  65. void CMFCTreeDlg::OnNMDblclkTree1(NMHDR *pNMHDR, LRESULT *pResult)  
  66. {   
  67.     HTREEITEM hCurItem=m_wndTree.GetSelectedItem();   
  68.     if (hCurItem==NULL || hCurItem==m_wndTree.GetRootItem())  
  69.     {  
  70.         return;  
  71.     }  
  72.     CString* pPath=(CString*)m_wndTree.GetItemData(hCurItem);  
  73.     //AfxMessageBox(*pPath);  
  74.     ShowFile(*pPath,hCurItem);  
  75.     *pResult = 0;  
  76. }  

运行结果:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MFC ListControl控件的颜色可以通过以下方法进行设置: 1. 设置整个ListControl的背景颜色: 可以使用CListCtrl类的SetBkColor()函数来设置ListControl的背景颜色,例如: m_ListCtrl.SetBkColor(RGB(255, 255, 255)); // 设置背景颜色为白色 2. 设置ListControl中某一行或某一列的颜色: 可以使用CListCtrl类的SetItem()函数来设置ListControl中某一行或某一列的颜色,例如: m_ListCtrl.SetItem(, , LVIF_TEXT | LVIF_STATE, _T("第一行第一列"), , , , , LVIS_SELECTED, LVIS_SELECTED); // 设置第一行第一列的文本和选中状态 m_ListCtrl.SetItemText(, 1, _T("第一行第二列")); // 设置第一行第二列的文本 m_ListCtrl.SetItemState(, LVIS_SELECTED, LVIS_SELECTED); // 设置第一行选中状态 m_ListCtrl.SetItemData(, (DWORD_PTR)&m_Data); // 设置第一行的数据 可以在SetItem()函数中设置LVITEM结构体的iItem、iSubItem、pszText、state、stateMask等参数来设置行或列的颜色和状态。 3. 设置ListControl中某一单元格的颜色: 可以使用CListCtrl类的SetCell()函数来设置ListControl中某一单元格的颜色,例如: m_ListCtrl.SetCell(, , RGB(255, , ), RGB(255, 255, 255)); // 设置第一行第一列的前景色为红色,背景色为白色 可以在SetCell()函数中设置行、列、前景色和背景色等参数来设置单元格的颜色。 以上是MFC ListControl控件颜色设置的一些方法,希望能对您有所帮助。 ### 回答2: MFC ListControl 控件是非常常用的控件之一,可以用于展示大量数据。在使用 ListControl 控件的过程中,我们可能会遇到需要修改控件颜色的需求。下面就来介绍一下 MFC ListControl 控件的颜色设置方法。 MFC ListControl 控件的颜色可以通过属性编辑器或代码进行设置。在属性编辑器中,我们可以找到相应的属性(如:Background Color、Text Color、Selected Text Color、Selected Background Color 等),并通过改变相应的属性值来修改控件的颜色。同样地,在代码中,我们也可以通过修改相应的控件属性值来实现对控件颜色的修改。例如: // 获取 ListControl 控件指针 CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_CONTROL); // 设置控件的背景色 pListCtrl->SetBkColor(RGB(255, 0, 0)); // 设置控件文本颜色 pListCtrl->SetTextColor(RGB(0, 255, 0)); // 设置选中行的背景色和文本颜色 pListCtrl->SetItemState(0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); pListCtrl->SetSelectionMark(0); pListCtrl->SetItemState(0, LVIS_SELECTED, LVIS_SELECTED); 以上代码中,通过调用 SetBkColor() 函数和 SetTextColor() 函数分别对控件的背景色和文本颜色进行设置。同时,代码也演示了如何设置选中行的背景色和文本颜色。需要注意的是,当设置控件的颜色时,如果控件已经被创建,需要先调用控件的 RedrawItems() 函数进行重绘操作,否则,新设置的颜色可能不会立即生效。 总之,MFC ListControl 控件是非常强大的控件之一,灵活的颜色设置能够更好地满足各种需求,开发者需要注意控件的颜色设置时需要先重绘才会生效。 ### 回答3: MFC ListControl控件MFC中非常常用的控件之一,它可以用于显示列表、图形视图等。在使用ListControl控件时,有时候需要对列表中的某些行或列进行颜色的设置以达到更好的视觉效果。下面我们来了解一下MFC ListControl控件的颜色设置。 MFC ListControl控件的背景颜色是由ListControl的背景色和父窗口的背景色共同决定的。用户可以在资源编辑器中或运行时使用CListCtrl类的SetBackgroundColor()函数来设置ListControl的背景颜色。 MFC ListControl控件的前景颜色是由用户在添加数据时指定的。在使用CListCtrl类的InsertItem()函数添加行的时候,可以指定该行的前景颜色和背景颜色;在使用CListCtrl类的SetItemText()函数设置列的时候,也可以指定该列的前景颜色和背景颜色。 如果需要动态地设置某一行或某一列的颜色,可以使用CListCtrl类的SetItem()函数。例如,设置第一行红色,第二行蓝色,可以用以下代码: ``` m_ListCtrl.SetItem(0, 0, LVIF_TEXT | LVIF_STATE, _T("第一行"), 0, LVIS_SELECTED, LVIS_SELECTED, 0); m_ListCtrl.SetItemText(0, 1, _T("第一列")); m_ListCtrl.SetItemData(0, 100); m_ListCtrl.SetItemState(0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); m_ListCtrl.SetItemText(1, 0, _T("第二行")); m_ListCtrl.SetItem(1, 0, LVIF_TEXT | LVIF_STATE, _T("第二行"), 0, LVIS_SELECTED, LVIS_SELECTED, 0); m_ListCtrl.SetItemText(1, 1, _T("第二列")); m_ListCtrl.SetItemData(1, 200); m_ListCtrl.SetItemState(1, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); m_ListCtrl.SetItemText(2, 0, _T("第三行")); m_ListCtrl.SetItemText(2, 1, _T("第三列")); m_ListCtrl.SetItemText(0, 0, _T("第一行")); m_ListCtrl.SetItemText(0, 1, _T("第一列")); m_ListCtrl.SetItemState(0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); m_ListCtrl.SetTextColor(0, RGB(255, 0, 0)); // 设置第1行红色 m_ListCtrl.SetItem(1, 0, LVIF_TEXT | LVIF_STATE, _T("第二行"), 0, LVIS_SELECTED, LVIS_SELECTED, 0); m_ListCtrl.SetItemText(1, 1, _T("第二列")); m_ListCtrl.SetItemState(1, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); m_ListCtrl.SetTextColor(1, RGB(0, 0, 255)); // 设置第2行蓝色 ``` 除了设置整行或整列的颜色,还可以为不同的单元格设置不同的颜色。可以在添加行时使用LVITEM结构体的iItem、iSubItem、mask、pszText等成员,分别指定行号、列号、要设置的属性和单元格中要显示的文本。在通过CListCtrl类的GetItem()函数获取某一行列时,也可以获得单元格的前景色和背景色等属性信息。 通过上述方法,可以实现对MFC ListControl控件的颜色自定义设置。至于要如何设置出美观的颜色组合,需要根据实际情况和个人喜好来决定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值