主頁 > 軟體工程 > shell tree contrl 控制元件怎么顯示檔案路徑?

shell tree contrl 控制元件怎么顯示檔案路徑?

2020-09-26 07:00:24 軟體工程

用 shell tree contrl  控制元件 ,再用OnTvnSelchanged 顯示選擇的檔案夾路徑,但是只能顯示檔案夾路徑 ,怎么做才能顯示檔案的路徑呢?求助!

uj5u.com熱心網友回復:

自己獲取檔案路徑 然后來控制顯示

uj5u.com熱心網友回復:

// DirTreeCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "DirTreeCtrl.h"
#include "shlobj.h"

// CDirTreeCtrl

IMPLEMENT_DYNAMIC(CDirTreeCtrl, CTreeCtrl)

CDirTreeCtrl::CDirTreeCtrl()
{

}

CDirTreeCtrl::~CDirTreeCtrl()
{
}


BEGIN_MESSAGE_MAP(CDirTreeCtrl, CTreeCtrl)
ON_NOTIFY_REFLECT(TVN_ITEMEXPANDED, OnTvnItemexpanded)
ON_WM_CREATE()
END_MESSAGE_MAP()

// CDirTreeCtrl 訊息處理程式

void CDirTreeCtrl::OnTvnItemexpanded(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: 在此添加控制元件通知處理程式代碼
TV_ITEM itm = pNMTreeView->itemNew;
if(itm.state & TVIS_EXPANDED)
ExpandBranch(itm.hItem);
else
DeleteAllChild(itm.hItem);
*pResult = 0;
}

int CDirTreeCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CTreeCtrl::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO:  在此添加您專用的創建代碼
Initialize();
return 0;
}

void CDirTreeCtrl::Initialize(bool clear)
{
LPITEMIDLIST itemList;
TCHAR buf[60];
int desktopIcon;
int mycomputerIcon;
int ret;
if(clear)
DeleteAllItems();
SetImageList(NULL,0);
SHGetSpecialFolderLocation(this->m_hWnd, CSIDL_DESKTOP, &itemList);
SHGetPathFromIDList(itemList,buf);
m_desktop_path=buf;
m_img.Create(GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),ILC_COLOR24,50,50);
m_img.SetBkColor(GetSysColor(COLOR_WINDOW));
CBitmap bmp;
CBitmap *old;
CBitmap *newbmp;
CDC dc;
dc.CreateCompatibleDC(NULL);
bmp.CreateBitmap(32,32,1,24,NULL);
old = dc.SelectObject(&bmp);
dc.FillSolidRect(0,0,31,31,GetSysColor(COLOR_WINDOW));
newbmp=dc.SelectObject(old);
dc.DeleteDC();
ret = m_img.Add(newbmp,COLORREF(0x00));
desktopIcon = m_img.Add(ExtractIcon(AfxGetApp()->m_hInstance,"shell32.dll",34));
mycomputerIcon = m_img.Add(ExtractIcon(AfxGetApp()->m_hInstance,"shell32.dll",15));
m_drives_root=AddItem_Core(_T("我的電腦"),TVI_ROOT,true,
mycomputerIcon,mycomputerIcon);
m_desktop_root = AddItem(m_desktop_path,TVI_ROOT,true,desktopIcon,desktopIcon);
}

HTREEITEM CDirTreeCtrl::AddItem(const TCHAR *path, HTREEITEM parent,
bool isDir,int iconEx, int iconEx2)
{
SHFILEINFO shinfo,shinfo_sel;
SHGetFileInfo(path,NULL,
&shinfo,
sizeof(shinfo),
SHGFI_DISPLAYNAME|SHGFI_ICON|SHGFI_SMALLICON);
SHGetFileInfo(path,NULL,
&shinfo_sel,
sizeof(shinfo_sel),
SHGFI_DISPLAYNAME|SHGFI_ICON|SHGFI_OPENICON|SHGFI_SMALLICON);
int icon = iconEx!=-1?iconEx:m_img.Add(shinfo.hIcon);
int iconsel = iconEx2!=-1?iconEx2:m_img.Add(shinfo_sel.hIcon);
SetImageList(&m_img,LVSIL_NORMAL);
return AddItem_Core(shinfo.szDisplayName,parent,isDir,icon,iconsel);
}

void CDirTreeCtrl::DeleteAllChild(HTREEITEM itm,bool isEmpty)
{
HTREEITEM child;
child = GetChildItem(itm);
while(child)
{
int img1,img2;
if(GetChildItem(child))
DeleteAllChild(GetChildItem(child),isEmpty);
GetItemImage(child,img1,img2);
if(img2!=0 && img2!=img1)
{
m_img.Remove(img2);
RefreshTreeImages(m_drives_root,img2);
RefreshTreeImages(m_desktop_root,img2);
}
if(img1!=0)
{
m_img.Remove(img1);
RefreshTreeImages(m_drives_root,img1);
RefreshTreeImages(m_desktop_root,img1);
}
DeleteItem(child);
SetImageList(&m_img,TVSIL_NORMAL);
child=GetChildItem(itm);
}
if(isEmpty) InsertItem(_T(""),itm);
}

void CDirTreeCtrl::ExpandBranch(HTREEITEM parent)
{
bool bOne = false;
if(parent==m_drives_root)
{
TCHAR *ptr;
DeleteAllChild(parent,false);
GetLogicalDriveStrings(255,m_drives_name);
ptr=m_drives_name;
while(*ptr)
{
bOne=true;
AddItem(ptr,m_drives_root,true);
ptr+=_tcslen(ptr)+1;
}
}
else
{
CString fullpath,pathWildcard;
fullpath=GetPathFromHere(fullpath,parent);
DeleteAllChild(parent,false);
pathWildcard=fullpath+_T("*.*");
CFileFind finder;
BOOL bWorking = finder.FindFile(pathWildcard);
while(bWorking)
{
bWorking = finder.FindNextFile();
if(finder.IsDirectory()&&!finder.IsDots())
{
bOne = true;
HTREEITEM itm = AddItem(fullpath+finder.GetFileName(),
parent);
InsertItem(_T(""),itm);
}
}
bWorking = finder.FindFile(pathWildcard);
while(bWorking)
{
bWorking = finder.FindNextFile();
if(!finder.IsDirectory()&&MatchExtension(finder.GetFileName()))
{
bOne = true;
AddItem(fullpath+finder.GetFileName(),parent);
}
}
}
if(!bOne)InsertItem(_T(""),parent);
}

HTREEITEM CDirTreeCtrl::AddItem_Core(const TCHAR * name,HTREEITEM parent,bool isDir,int icon,int iconOpen)
{
HTREEITEM hitm;
hitm = InsertItem(name,icon,iconOpen,parent);
if(isDir)InsertItem(_T(""),hitm);
return hitm;
}

CString CDirTreeCtrl::GetPathFromHere(CString s, HTREEITEM itm)
{
HTREEITEM parent = GetParentItem(itm);
HTREEITEM itmChild = GetChildItem(itm);
if(itm==m_drives_root)return _T("");
if(parent==m_drives_root)
{
HTREEITEM child;
TCHAR *ptr = m_drives_name;
child = GetChildItem(parent);
while(child)
{
if(child==itm)
{
s=CString(ptr)+s;
return s;
}
ptr+=_tcslen(ptr)+1;
child = GetNextItem(child,TVGN_NEXT);
}
}
else if(itm==m_desktop_root)
{
s=m_desktop_path + _T("\\") + s;
return s;
}
else
{
if(GetItemText(itm) != CString("")) s = GetItemText(itm)+_T("\\") + s;
s = GetPathFromHere(s,parent);
}
if(!itmChild && s.GetLength()>0) s = s.Left(s.GetLength()-1);
return s;
}

void CDirTreeCtrl::RefreshTreeImages(HTREEITEM item,int img)
{
int iStandard,iOpen;
HTREEITEM itmCurrent;
itmCurrent = GetChildItem(item);
while(itmCurrent)
{
if(GetItemImage(itmCurrent,iStandard,iOpen))
{
if(iStandard>img)iStandard--;
if(iOpen>img)iOpen--;
SetItemImage(itmCurrent,iStandard,iOpen);
}
if(ItemHasChildren(itmCurrent)!=0) RefreshTreeImages(itmCurrent,img);
itmCurrent=GetNextSiblingItem(itmCurrent);
}
}

bool CDirTreeCtrl::MatchExtension(CString file)
{
return file.Right(4)==CString(_T(".exe"));
}

CString CDirTreeCtrl::GetFullPath(HTREEITEM item)
{
if(GetItemText(item)==CString(_T(""))) return _T("");
else return GetPathFromHere(_T(""),item);
}

bool CDirTreeCtrl::SetPath(CString path_in)
{
TCHAR path[MAX_PATH];
TCHAR *delimiters=_T("\\");
TCHAR *token;
TCHAR *pathStart = path;
HTREEITEM current = m_drives_root;
_tcscpy(path,path_in);
Expand(current,TVE_EXPAND);
token = _tcstok(path,delimiters);
while(token!=NULL)
{
current = Dir2Item(current,token);
if(!current)
{
return false;
}
Expand(current,TVE_EXPAND);
token = _tcstok(NULL,delimiters);
}
SelectItem(current);
return true;
}

HTREEITEM CDirTreeCtrl::Dir2Item(HTREEITEM current,TCHAR *dir)
{
if(current==m_drives_root)
{
HTREEITEM child;
CString szDir(dir);
szDir+=_T("\\");
szDir.MakeUpper();
TCHAR *ptr = m_drives_name;
child = GetChildItem(current);
while(child)
{
if(szDir==CString(ptr))
{
return child;
}
ptr+=_tcslen(ptr)+1;
child = GetNextItem(child,TVGN_NEXT);
}
}
else
{
HTREEITEM child;
CString szChildText;
CString szDir(dir);
szDir.MakeUpper();
child = GetChildItem(current);
while(child)
{
szChildText = GetItemText(child);
szChildText.MakeUpper();
if(szChildText==szDir)
{
return child;
}
child = GetNextItem(child,TVGN_NEXT);
}
}
return NULL;
}
、、、
#if !defined(AFX_DIRTREECTRL_H__1A45AE0D_BD63_45B6_B4FF_AF00C5882BB1__INCLUDED_)
#define AFX_DIRTREECTRL_H__1A45AE0D_BD63_45B6_B4FF_AF00C5882BB1__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// DirTreeCtrl.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// CDirTreeCtrl window

class CDirTreeCtrl : public CTreeCtrl
{
DECLARE_DYNAMIC(CDirTreeCtrl)

public:
void Initialize(bool clear=true);
bool SetPath(CString path);
CString GetFullPath(HTREEITEM item);
CDirTreeCtrl();
virtual ~CDirTreeCtrl();
private:
HTREEITEM Dir2Item(HTREEITEM current, TCHAR *dir);
virtual bool MatchExtension(CString file);
void RefreshTreeImages(HTREEITEM item,int img);
CString GetPathFromHere(CString s, HTREEITEM itm);
HTREEITEM AddItem_Core(const TCHAR *name, HTREEITEM parent, bool isDir,
int icon, int iconOpen);
void ExpandBranch(HTREEITEM parent);
void DeleteAllChild(HTREEITEM itm, bool isEmpty=true);
HTREEITEM AddItem(const TCHAR* path, HTREEITEM parent,
bool isDir=false, int iconEx=-1,int iconEx2=-1);
HTREEITEM m_desktop_root;
CString m_desktop_path;
HTREEITEM m_drives_root;
TCHAR m_drives_name[255];
CImageList m_img;
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnTvnItemexpanded(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
};
/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_DIRTREECTRL_H__1A45AE0D_BD63_45B6_B4FF_AF00C5882BB1__INCLUDED_)

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/130545.html

標籤:基礎類

上一篇:VS2005 VS2015編譯出程式執行速度的問題?

下一篇:OpenCV2.4.8 VC2010 MFC 記憶體泄露

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more