CTreeCtrl中为什麽不能得到具体数据?
我用MFC向导生成一个类似资源管理器的界面我在左面的LeftView中用CFileFind枚举出了当前目录下的所有文件夹,我想实现当用户点击左面的文件夹时,右面的CListView能显示出此文件夹中的所有文件,所以我在LeftView中添加了"void CLeftView::OnClickItem(NMHDR* pNMHDR, LRESULT* pResult) " 处理函数用"
CTreeCtrl& mtree=GetTreeCtrl();
HTREEITEM item=mtree.GetSelectedItem();
data=mtree.GetItemData(item);" <---得到文件夹中的内容
得到点击的具体item的内容,然后我在"CLeftView::OnDraw(CDC* pDC)"里面得到右面CListView的指针:"POSITION pos=pDoc->GetFirstViewPosition();
while(pos!=NULL){
CView* pview=pDoc->GetNextView(pos);
if(pview->IsKindOf(RUNTIME_CLASS(CBrowserView))){
pview->SetWindowText((LPCTSTR)data)"
但点击一个item后右面的listview中没有反应(我用AfxMessageBox测试是可以得到用户点击的item的,所以我认为是SetWindowText这一段代码的问题),我的做法是不是有问题?如果想实现我的想法,应该怎样做?请指点!
问题点数:0、回复次数:11Top
1 楼jcreatorqijiashe(秋天的童话)回复于 2003-08-01 21:34:49 得分 0
提前!有人知道吗?Top
2 楼fengqinggao(风清高)回复于 2003-08-02 00:30:20 得分 0
你不应该在OnDraw()中处理,就在OnClickItem()中处理好了,或者也许在OnSelChange()函数中处理更好,在OnDraw()中处理的话,只要你的界面有少许便(TreeCtrl的选项没有变)它都会刷新,浪费而且不科学,而OnSelChange()就是在你的选项发生变化后才刷新,这是你所希望的。
我觉得你的SetWindowText()应该没有问题,主要看你那个data参数是否正确。Top
3 楼myhot(大头河马)回复于 2003-08-02 01:11:53 得分 0
upTop
4 楼jcreatorqijiashe(秋天的童话)回复于 2003-08-03 00:53:28 得分 0
可是OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) 函数中没有pDoc指针,我怎麽获得pview?就是“POSITION pos=pDoc->GetFirstViewPosition();
while(pos!=NULL){
CView* pview=pDoc->GetNextView(pos);
if(pview->IsKindOf(RUNTIME_CLASS(CBrowserView))){
pview->SetWindowText((LPCTSTR)data);”
就算把函数OnselChanged改成:“CBrowserDoc* pDoc = GetDocument();
POSITION pos=pDoc->GetFirstViewPosition();
while(pos!=NULL){
CView* pview=pDoc->GetNextView(pos);
if(pview->IsKindOf(RUNTIME_CLASS(CBrowserView))){
pview->SetWindowText((LPCTSTR)data);”
点击后还是没反应Top
5 楼fengqinggao(风清高)回复于 2003-08-03 01:43:44 得分 0
你跟踪看看,是不是pos=pDoc->GetFirstViewPosition()所得到的pos一开始就是NULL?如果不是看这个语句pview->SetWindowText((LPCTSTR)data)有没有执行?
还有,data=mtree.GetItemData(item);,这里的data得到的是一个DWORD型的数据啊,肯定不是你想要的,强制转换(LPCTSTR)data得到的是什么?Top
6 楼jcreatorqijiashe(秋天的童话)回复于 2003-08-05 21:44:01 得分 0
可是GetItemData是不是这个用法?他是可以达到点击文件夹后显示文件夹中内容的效果吗?Top
7 楼fengqinggao(风清高)回复于 2003-08-05 22:06:11 得分 0
它怎么知道你的文件夹中有什么东西,得要你赋值啊,用循环赋值吧Top
8 楼huwei6000(三刀)回复于 2003-08-05 22:21:35 得分 0
我想 你可以用 OnSelectionChanged消息机制来处理:
在leftview其中引入UpdateAllViews (...):注意this参数 不可改;
在rightview中引入OnUpdate接收就可
具体如下:
void CDriveView::OnSelectionChanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*) pNMHDR;
CString strPath = GetPathFromItem (pNMTreeView->itemNew.hItem);
GetDocument ()->UpdateAllViews (this, 0x5A, (CObject*) (LPCTSTR) strPath);
*pResult = 0;
}
void CFileView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
if (lHint == 0x5A) {
FreeItemMemory ();
GetListCtrl ().DeleteAllItems ();
Refresh ((LPCTSTR) pHint);//自定处理函数
return;
}
CListView::OnUpdate (pSender, lHint, pHint);
}
Top
9 楼he_zhidan(何志丹:www.dzlishi.net,www.vcshare.net)回复于 2003-08-06 09:05:51 得分 0
pview->SetWindowText((LPCTSTR)data)"?
CListView
分割窗口
还是CListCtrl
CListCtrl没有标题
分割的窗口也可能没有标题
Top
10 楼jcreatorqijiashe(秋天的童话)回复于 2003-08-10 21:55:14 得分 0
不是分割窗口,他们是继承自CListView和CTreeView,我用MFC的向导自动生成的基于Explore界面的程序Top
11 楼jcreatorqijiashe(秋天的童话)回复于 2003-08-10 21:57:47 得分 0
to huwei6000(三刀):
我没有CFileView这个类阿Top




