一、架構產生
開啟VC6,建立一個 MFC AppWizard(exe) 工程;
1 在嚮導第一步中選擇應用程式類型是"單文檔",確保,在"文檔/查看體繫結構支援"檢查框中打上對勾;
2 在嚮導第二步中根據實際情況選擇是否支援資料庫,我這裡選擇不支援資料庫;
3 在嚮導第三步中選擇不需要複合文檔支援;也不需要複合檔案支援;
4 在嚮導第四步中預設即可;
5 在嚮導第五步中選擇風格是"Windows 資源管理員樣式";
6 在嚮導第六步中對你的選擇做一下確認,可以看到左邊視圖的基類是CTreeView,應用程式視圖的基類是CListView;
點擊確定即可完成,點擊運行按鈕就可看到效果.
二、初始化樹形視圖
1 修改LeftView.h
在類的聲明之前包含右視圖的標頭檔,聲明類的保護成員 CGldogView* m_listView以便通過tree事件對右視圖進行通訊; 聲明類的保護成員CImageList ImgTree對樹的表徵圖進行操作;
#include "usbdogview.h"
class CLeftView : public CTreeView
2 開啟LeftView.c 在樹形視圖中添加樹根、樹枝和樹葉;
void CLeftView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
ImgTree.Create (16,16,ILC_COLOR|ILC_MASK,3,3);//建立表徵圖列表
ImgTree.Add (AfxGetApp()->LoadIcon (IDR_MAINFRAME));
ImgTree.Add (AfxGetApp()->LoadIcon (IDI_dir));
CTreeCtrl& CtlTree=(CTreeCtrl&)GetTreeCtrl ();
CtlTree.SetBkColor (RGB(210,230,190));
CtlTree.SetImageList (&ImgTree,TVSIL_NORMAL);
int i=0;
TV_INSERTSTRUCT tvRoot;//樹根
TV_INSERTSTRUCT tvSecond;//樹枝
TV_INSERTSTRUCT tvThree;//樹葉
tvRoot.hParent=NULL;
tvRoot.item.pszText="系統管理";
tvRoot.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
tvRoot.item.iImage=i;
tvRoot.item.iSelectedImage=i;
HTREEITEM item_root=CtlTree.InsertItem (&tvRoot);
int ii;
CString strSecond[2]={"2F00","3F00"};
CString strThree[2][3]={{"0001","0002","0003"},{"001","002"}};
for(i=0;i<2;i++)
{
tvSecond.hParent=item_root;
tvSecond.item.pszText=(LPTSTR)(LPCTSTR)strSecond[i];
tvSecond.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
tvSecond.item.iImage=1;
tvSecond.item.iSelectedImage=2;
HTREEITEM item_second=CtlTree.InsertItem (&tvSecond);
switch(i)
{
case 0:
ii=3;
break;
case 1:
ii=2;
break;
default:
break;
}
for(int j=0;j<ii;j++)
{tvThree.hParent=item_second;
tvThree.item.pszText=(LPTSTR)(LPCTSTR)strThree[i][j];
tvThree.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
tvThree.item.iImage=1;
tvThree.item.iSelectedImage=2;
CtlTree.InsertItem (&tvThree);
}
}
//設定列表視圖的風格
CtlTree.Expand(item_root,TVE_EXPAND);
DWORD dwStyle=GetWindowLong(CtlTree.m_hWnd ,GWL_STYLE);
dwStyle|=TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT;
::SetWindowLong (CtlTree.m_hWnd ,GWL_STYLE,dwStyle);
}
三、初始化列表視圖
開啟應用程式視圖檔案修改OnInitialUpdate()函數如下:
CListView::OnInitialUpdate();
CListCtrl &listCtrl=(CListCtrl&)GetListCtrl();
listCtrl.ModifyStyle (0,LVS_REPORT);
listCtrl.ModifyStyle (LVS_EDITLABELS,0);//禁止修改欄位標題
listCtrl.SetExtendedStyle (LVS_EX_FULLROWSELECT|LVS_EX_ONECLICKACTIVATE|LVS_EX_INFOTIP|LVS_EX_SUBITEMIMAGES|LVS_EX_GRIDLINES);
listCtrl.InsertColumn (0,"檔案ID",LVCFMT_LEFT,50);
listCtrl.InsertColumn (1,"操作許可權",LVCFMT_LEFT,100);
listCtrl.InsertColumn (2,"佔用空間(位元組)",LVCFMT_LEFT,100);
listCtrl.InsertColumn (3,"已用空間(位元組)",LVCFMT_LEFT,100);
listCtrl.InsertColumn (4,"空閑空間(位元組)",LVCFMT_LEFT,100);
listCtrl.InsertColumn (5,"建立時間",LVCFMT_LEFT,100);
listCtrl.InsertColumn (6,"最新動向時間",LVCFMT_LEFT,100);
listCtrl.InsertColumn (7,"建立者",LVCFMT_LEFT,100);
效果如所示:
四、樹視圖與列表視圖的通訊
1、在右邊的列表視圖中添加處理左視圖資料的公用方法void recievedata(CString strInfo);
2、recievedata函數的實現
void CUsbdogView::recievedata(CString strInfo)
{
CListCtrl &listCtrl=(CListCtrl&)GetListCtrl();
if(strInfo=="0001")
{ listCtrl.DeleteAllItems ();
listCtrl.InsertItem(0,"0001");
listCtrl.SetItemText(0,1,"r/w/d");
listCtrl.SetItemText(0,2,"300");
listCtrl.SetItemText(0,3,"200");
listCtrl.SetItemText(0,4,"100");
listCtrl.SetItemText(0,5,"2008.08.08 010302");
listCtrl.SetItemText(0,6,"2008.08.09 231105");
listCtrl.SetItemText(0,7,"jiadelin");
}
this->Invalidate (FALSE);
}
3、在樹視圖中建立訊息映射並調用列表視圖的recievedata方法實現通訊
4、實現OnSelchanged方法
void CLeftView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
CTreeCtrl& CtlTree=(CTreeCtrl&)GetTreeCtrl ();
HTREEITEM select_item=CtlTree.GetSelectedItem ();
CString str=CtlTree.GetItemText (select_item);
CSplitterWnd* m_wndSplitter=(CSplitterWnd*)GetParent();
m_listView=(CUsbdogView*)m_wndSplitter->GetPane (0,1);
m_listView->recievedata(str);
*pResult = 0;
}
全文完.