列表控件
?列表相關的類: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;關鍵代碼
[cpp] view plaincopyprint?
void?CMFCListDlg::DoDataExchange(CDataExchange*?pDX)??{??????CDialogEx::DoDataExchange(pDX);??????DDX_Control(pDX,?IDC_COMBO1,?m_wndStyle);??????DDX_Control(pDX,?IDC_LIST1,?m_wndList);??}????BEGIN_MESSAGE_MAP(CMFCListDlg,?CDialogEx)??????ON_WM_SYSCOMMAND()??????ON_WM_PAINT()??????ON_WM_QUERYDRAGICON()??????ON_BN_CLICKED(IDC_BUTTON_Seclect,?&CMFCListDlg::OnBnClickedButtonSeclect)??????ON_BN_CLICKED(IDC_BUTTON_Delete,?&CMFCListDlg::OnBnClickedButtonDelete)??????ON_CBN_SELCHANGE(IDC_COMBO1,?&CMFCListDlg::OnCbnSelchangeCombo1)??????ON_NOTIFY(NM_DBLCLK,?IDC_LIST1,?&CMFCListDlg::OnNMDblclkList1)??END_MESSAGE_MAP()??????InitListCtrl();??m_wndStyle.InsertString(0,L"圖標(ICON)");??m_wndStyle.InsertString(1,L"小圖標(SMALL?ICON)");??m_wndStyle.InsertString(2,L"列表(LIST)");??m_wndStyle.InsertString(3,L"報表(REPORT)");??m_wndStyle.SetCurSel(0);??????void?CMFCListDlg::OnBnClickedButtonSeclect()??{???????POSITION?pos=m_wndList.GetFirstSelectedItemPosition();??????while(pos)??????{??????????int?nItem=m_wndList.GetNextSelectedItem(pos);??????????MessageBox(m_wndList.GetItemText(nItem,0));??????}??}????void?CMFCListDlg::OnBnClickedButtonDelete()??{??????LVFINDINFO?info;??????info.flags=LVFI_STRING|LVFI_PARTIAL;??????info.psz=L"stu.data";??????int?index=0;??????if?((index=m_wndList.FindItem(&info))!=-1)??????{??????????m_wndList.DeleteItem(index);??????}??}??????void?CMFCListDlg::OnCbnSelchangeCombo1()??{???????int?nSel=m_wndStyle.GetCurSel();??????switch?(nSel)??????{??????case?0:??????????m_wndList.ModifyStyle(LVS_SMALLICON|LVS_LIST|LVS_REPORT,LVS_ICON);??????????break;??????case?1:??????????m_wndList.ModifyStyle(LVS_ICON|LVS_LIST|LVS_REPORT,LVS_SMALLICON);??????????break;??????case?2:??????????m_wndList.ModifyStyle(LVS_SMALLICON|LVS_ICON|LVS_REPORT,LVS_LIST);??????????break;??????case?3:??????????m_wndList.ModifyStyle(LVS_ICON|LVS_LIST|LVS_SMALLICON,LVS_REPORT);??????????break;??????}??}?????void?CMFCListDlg::OnNMDblclkList1(NMHDR?*pNMHDR,?LRESULT?*pResult)??{??????LPNMITEMACTIVATE?pNMItemActivate?=?reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);????????????int?nSel=pNMItemActivate->iItem;??????if?(-1!=nSel)??????{??????????CString*?pPath=(CString*)m_wndList.GetItemData(nSel);????????????????????ShowFile(*pPath+L"\\*.*");??????}??????*pResult?=?0;??}????void?CMFCListDlg::InitListCtrl()??{????????????CImageList*?pILNormal=new?CImageList;??????pILNormal->Create(IDB_NORMAL,32,1,RGB(0,0,0));??????m_wndList.SetImageList(pILNormal,LVSIL_NORMAL);????????????CImageList*?pILSmall=new?CImageList;??????pILSmall->Create(IDB_SMALL,18,1,RGB(0,0,0));??????m_wndList.SetImageList(pILSmall,LVSIL_SMALL);????????????m_wndList.InsertColumn(0,L"名稱",LVCFMT_LEFT,150);??????m_wndList.InsertColumn(1,L"大小",LVCFMT_LEFT,80);??????m_wndList.InsertColumn(2,L"類型",LVCFMT_LEFT,80);??????m_wndList.InsertColumn(3,L"修改日期",LVCFMT_LEFT,100);????????????m_wndList.InsertItem(0,L"文件",1);??????m_wndList.SetItemText(0,1,L"15");??????m_wndList.SetItemText(0,2,L"文件");??????m_wndList.SetItemText(0,3,L"2012-03-06");????????m_wndList.InsertItem(1,L"文件夾",0);??????m_wndList.SetItemText(1,1,L"12");??????m_wndList.SetItemText(1,2,L"文件夾");??????m_wndList.SetItemText(1,3,L"2011-03-06");????????????????????????m_wndList.SetBkColor(RGB(200,200,200));??????m_wndList.SetTextColor(RGB(255,0,0));??????m_wndList.SetTextBkColor(CLR_NONE);????????????m_wndList.SetBkImage(L"res\\MFCList.ico");??}????void?CMFCListDlg::ShowFile(CString?strPath)??{????????????m_wndList.DeleteAllItems();??????int?index=0;??????CFileFind?find;??????BOOL?bRet=find.FindFile(strPath+"*.*");??????while?(bRet)??????{??????????bRet=find.FindNextFileW();??????????if?(find.IsDirectory())??????????{??????????????m_wndList.InsertItem(index,find.GetFileName(),0);??????????????m_wndList.SetItemText(index,2,L"文件夾");??????????}??????????else??????????{??????????????m_wndList.InsertItem(index,find.GetFileName(),1);??????????????DWORD?nLen=find.GetLength();??????????????CString?strLen;??????????????strLen.Format(L"%d",nLen);??????????????m_wndList.SetItemText(index,1,strLen);??????????}????????????????????CString*?pPath=new?CString;??????????*pPath=find.GetFilePath();??????????m_wndList.SetItemData(index,(DWORD)pPath);??????????index++;??????}??????find.Close();??}??
void CMFCListDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_COMBO1, m_wndStyle);//添加下拉列表框的關聯控件變量DDX_Control(pDX, IDC_LIST1, m_wndList);//添加列表控件的關聯控件變量
}BEGIN_MESSAGE_MAP(CMFCListDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON_Seclect, &CMFCListDlg::OnBnClickedButtonSeclect)//"獲取選擇項"控件的雙擊事件ON_BN_CLICKED(IDC_BUTTON_Delete, &CMFCListDlg::OnBnClickedButtonDelete)//"刪除選擇項"控件 的雙擊事件ON_CBN_SELCHANGE(IDC_COMBO1, &CMFCListDlg::OnCbnSelchangeCombo1)//下拉列表框的選擇項改變事件ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CMFCListDlg::OnNMDblclkList1)//列表控件的雙擊項事件
END_MESSAGE_MAP()
//BOOL CMFCListDlg::OnInitDialog()調用下列代碼
//初始化列表控件
InitListCtrl();
m_wndStyle.InsertString(0,L"圖標(ICON)");
m_wndStyle.InsertString(1,L"小圖標(SMALL ICON)");
m_wndStyle.InsertString(2,L"列表(LIST)");
m_wndStyle.InsertString(3,L"報表(REPORT)");
m_wndStyle.SetCurSel(0);//"獲取選擇項"控件的雙擊事件
void CMFCListDlg::OnBnClickedButtonSeclect()
{ POSITION pos=m_wndList.GetFirstSelectedItemPosition();while(pos){int nItem=m_wndList.GetNextSelectedItem(pos);MessageBox(m_wndList.GetItemText(nItem,0));//顯示數據項的文本}
}
//"刪除選擇項"控件 的雙擊事件
void CMFCListDlg::OnBnClickedButtonDelete()
{LVFINDINFO info;info.flags=LVFI_STRING|LVFI_PARTIAL;info.psz=L"stu.data";int index=0;if ((index=m_wndList.FindItem(&info))!=-1){m_wndList.DeleteItem(index);}
}//下拉列表框的選擇項改變事件
void CMFCListDlg::OnCbnSelchangeCombo1()
{ int nSel=m_wndStyle.GetCurSel();switch (nSel){case 0://圖標m_wndList.ModifyStyle(LVS_SMALLICON|LVS_LIST|LVS_REPORT,LVS_ICON);break;case 1://小圖標m_wndList.ModifyStyle(LVS_ICON|LVS_LIST|LVS_REPORT,LVS_SMALLICON);break;case 2://列表m_wndList.ModifyStyle(LVS_SMALLICON|LVS_ICON|LVS_REPORT,LVS_LIST);break;case 3://報表m_wndList.ModifyStyle(LVS_ICON|LVS_LIST|LVS_SMALLICON,LVS_REPORT);break;}
}
//列表控件的雙擊項事件
void CMFCListDlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);// TODO: 在此添加控件通知處理程序代碼int nSel=pNMItemActivate->iItem;if (-1!=nSel){CString* pPath=(CString*)m_wndList.GetItemData(nSel);//MessageBox(*pPath);ShowFile(*pPath+L"\\*.*");}*pResult = 0;
}void CMFCListDlg::InitListCtrl()
{//1 設置控件的圖標列表CImageList* pILNormal=new CImageList;pILNormal->Create(IDB_NORMAL,32,1,RGB(0,0,0));m_wndList.SetImageList(pILNormal,LVSIL_NORMAL);//2 設置控件的小圖標CImageList* pILSmall=new CImageList;pILSmall->Create(IDB_SMALL,18,1,RGB(0,0,0));m_wndList.SetImageList(pILSmall,LVSIL_SMALL);//3 設置列m_wndList.InsertColumn(0,L"名稱",LVCFMT_LEFT,150);m_wndList.InsertColumn(1,L"大小",LVCFMT_LEFT,80);m_wndList.InsertColumn(2,L"類型",LVCFMT_LEFT,80);m_wndList.InsertColumn(3,L"修改日期",LVCFMT_LEFT,100);//4 插入測試數據m_wndList.InsertItem(0,L"文件",1);m_wndList.SetItemText(0,1,L"15");m_wndList.SetItemText(0,2,L"文件");m_wndList.SetItemText(0,3,L"2012-03-06");m_wndList.InsertItem(1,L"文件夾",0);m_wndList.SetItemText(1,1,L"12");m_wndList.SetItemText(1,2,L"文件夾");m_wndList.SetItemText(1,3,L"2011-03-06");//5 顯示C盤根目錄下的所有文件和文件夾//ShowFile(L"c:\\");//6 設置控件的背景色m_wndList.SetBkColor(RGB(200,200,200));m_wndList.SetTextColor(RGB(255,0,0));m_wndList.SetTextBkColor(CLR_NONE);//7 設置控件的背景圖片m_wndList.SetBkImage(L"res\\MFCList.ico");
}void CMFCListDlg::ShowFile(CString strPath)
{//添加數據前,先清空原有數據m_wndList.DeleteAllItems();int index=0;//添加數據項的索引CFileFind find;BOOL bRet=find.FindFile(strPath+"*.*");while (bRet){bRet=find.FindNextFileW();if (find.IsDirectory()){m_wndList.InsertItem(index,find.GetFileName(),0);m_wndList.SetItemText(index,2,L"文件夾");}else{m_wndList.InsertItem(index,find.GetFileName(),1);DWORD nLen=find.GetLength();CString strLen;strLen.Format(L"%d",nLen);m_wndList.SetItemText(index,1,strLen);}//保存路徑CString* pPath=new CString;*pPath=find.GetFilePath();m_wndList.SetItemData(index,(DWORD)pPath);index++;}find.Close();//結束查找
}
運行結果:
樹控件
樹控件相關類: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;關鍵代碼
[cpp] view plaincopyprint?
void?CMFCTreeDlg::DoDataExchange(CDataExchange*?pDX)??{??????CDialogEx::DoDataExchange(pDX);??????DDX_Control(pDX,?IDC_TREE1,?m_wndTree);??}????BEGIN_MESSAGE_MAP(CMFCTreeDlg,?CDialogEx)??????ON_WM_SYSCOMMAND()??????ON_WM_PAINT()??????ON_WM_QUERYDRAGICON()????????ON_NOTIFY(NM_DBLCLK,?IDC_TREE1,?&CMFCTreeDlg::OnNMDblclkTree1)??END_MESSAGE_MAP()??????void?CMFCTreeDlg::InitTreeControl()??{????????????CImageList*?pilNormal=new?CImageList;??????BOOL?bs=pilNormal->Create(IDB_NORMAL,16,1,RGB(1,0,0));???????if?(bs)??????{??????????m_wndTree.SetImageList(pilNormal,TVSIL_NORMAL);??????}??????else??????{??????????AfxMessageBox(L"adsfads");??????}??????m_wndTree.SetItemHeight(20);??????HTREEITEM?hRoot=m_wndTree.InsertItem(L"C:\\",0,2);??????ShowFile(L"c:\\",hRoot);??}??void?CMFCTreeDlg::ShowFile(CString?strPath,HTREEITEM?hParent)??{??????if?(m_wndTree.ItemHasChildren(hParent))??????{??????????return;??????}??????CFileFind?find;??????BOOL?bRet=find.FindFile(strPath+"\\*.*");??????while(bRet)??????{??????????HTREEITEM?hItem;??????????bRet=find.FindNextFileW();??????????CString?strName=find.GetFileName();??????????if?(!find.IsDots())??????????{??????????????if?(find.IsDirectory())??????????????{??????????????????hItem=m_wndTree.InsertItem(strName,0,2,hParent);??????????????}??????????????else??????????????{??????????????????hItem=m_wndTree.InsertItem(strName,1,3,hParent);??????????????}????????????????????????????CString?*pPath=new?CString;??????????????*pPath=find.GetFilePath();??????????????m_wndTree.SetItemData(hItem,(DWORD)pPath);??????????}??????}??????find.Close();??????m_wndTree.Expand(hParent,TVE_EXPAND);??}????????void?CMFCTreeDlg::OnNMDblclkTree1(NMHDR?*pNMHDR,?LRESULT?*pResult)??{???????HTREEITEM?hCurItem=m_wndTree.GetSelectedItem();???????if?(hCurItem==NULL?||?hCurItem==m_wndTree.GetRootItem())??????{??????????return;??????}??????CString*?pPath=(CString*)m_wndTree.GetItemData(hCurItem);????????????ShowFile(*pPath,hCurItem);??????*pResult?=?0;??}??
void CMFCTreeDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_TREE1, m_wndTree);//增加樹控件的關聯控件變量
}BEGIN_MESSAGE_MAP(CMFCTreeDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON() ON_NOTIFY(NM_DBLCLK, IDC_TREE1, &CMFCTreeDlg::OnNMDblclkTree1)//雙擊樹控件項的事件
END_MESSAGE_MAP()//初始化樹控件
void CMFCTreeDlg::InitTreeControl()
{//1.設置圖標列表CImageList* pilNormal=new CImageList;BOOL bs=pilNormal->Create(IDB_NORMAL,16,1,RGB(1,0,0)); //IDB_NORMAL是 bitmap資源 64 x 16if (bs){m_wndTree.SetImageList(pilNormal,TVSIL_NORMAL);}else{AfxMessageBox(L"adsfads");}m_wndTree.SetItemHeight(20);//設置行高HTREEITEM hRoot=m_wndTree.InsertItem(L"C:\\",0,2);//插入根目錄ShowFile(L"c:\\",hRoot);
}
void CMFCTreeDlg::ShowFile(CString strPath,HTREEITEM hParent)
{if (m_wndTree.ItemHasChildren(hParent)){return;}CFileFind find;BOOL bRet=find.FindFile(strPath+"\\*.*");while(bRet){HTREEITEM hItem;bRet=find.FindNextFileW();CString strName=find.GetFileName();if (!find.IsDots()){if (find.IsDirectory()){hItem=m_wndTree.InsertItem(strName,0,2,hParent);}else{hItem=m_wndTree.InsertItem(strName,1,3,hParent);}//保存路徑CString *pPath=new CString;*pPath=find.GetFilePath();m_wndTree.SetItemData(hItem,(DWORD)pPath);}}find.Close();//結束查找m_wndTree.Expand(hParent,TVE_EXPAND);//展開根節點
}
//樹控件項的雙擊事件
void CMFCTreeDlg::OnNMDblclkTree1(NMHDR *pNMHDR, LRESULT *pResult)
{ HTREEITEM hCurItem=m_wndTree.GetSelectedItem(); if (hCurItem==NULL || hCurItem==m_wndTree.GetRootItem()){return;}CString* pPath=(CString*)m_wndTree.GetItemData(hCurItem);//AfxMessageBox(*pPath);ShowFile(*pPath,hCurItem);*pResult = 0;
}
運行結果:
總結
以上是生活随笔為你收集整理的MFC列表控件ListControl和树控件TreeControl的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。