tc31415
May 19th, 2006, 10:25 AM
Hi :) !
I'm trying to create "browse for folder" in treeview like in WindowsExplorer. Everything work ok but when i want to get full path to folder:
1. When select folder GetDisplayNameOf() return text with double name like:
C:\WINDOWS\WINDOWS
\\Computer\path\folder\folder
2. When select Local Disk ( like "Local Disc (C: )" ) GetDisplayNameOf() return error
Can you help me :( ? Here is little part of my source. I hope it is enough:
char txtBuf[MAX_PATH];
typedef struct {
BOOL bRoot;
LPITEMIDLIST lpi;
LPSHELLFOLDER lpsfParent;
LPITEMIDLIST lpifq;
} LPTVITEMDATA;
BOOL GetName(LPSHELLFOLDER lpsf,LPITEMIDLIST lpi,DWORD dwFlags,LPSTR lpFriendlyName) {
BOOL bSuccess = TRUE;
STRRET str;
if(NOERROR == lpsf->GetDisplayNameOf(lpi,dwFlags,&str)) {
...
}
else bSuccess = FALSE;
return bSuccess;
}
void GetItemPath(TV_ITEM tvi) {
LPMALLOC pMalloc;
LPTVITEMDATA* lptvid=NULL;
IShellFolder *psfProgFiles=NULL;
if(FAILED(SHGetMalloc(&pMalloc))) return;
lptvid = (LPTVITEMDATA*) pMalloc->Alloc(sizeof (LPTVITEMDATA));
if(!lptvid) {pMalloc->Release();return;}
lptvid=(LPTVITEMDATA*)tvi.lParam;
if(!lptvid) {pMalloc->Release();return;}
if(lptvid->bRoot) psfProgFiles=lptvid->lpsfParent;
else {
if(FAILED(lptvid->lpsfParent->BindToObject(lptvid->lpi,
NULL,IID_IShellFolder,
(LPVOID *)&psfProgFiles)))
{pMalloc->Release();return;}
}
GetName(psfProgFiles,lptvid->lpi,SHGDN_FORPARSING,txtBuf);
pMalloc->Release();
}
//----- In WndProcedure ---------------
...
case WM_NOTIFY:
switch(((NMHDR*)lParam)->idFrom) {
case ID_TREEVIEW:
tvItem=((NM_TREEVIEW*)lParam)->itemNew;
...
if(((NMHDR *)lParam)->code==TVN_SELCHANGING) {
GetItemPath(tvItem);
SendMessage(hStatus,SB_SETTEXT,0,(LPARAM)txtBuf);
}
...
break;
}
break;
// ...
Thanks in advance :( :) !
I'm trying to create "browse for folder" in treeview like in WindowsExplorer. Everything work ok but when i want to get full path to folder:
1. When select folder GetDisplayNameOf() return text with double name like:
C:\WINDOWS\WINDOWS
\\Computer\path\folder\folder
2. When select Local Disk ( like "Local Disc (C: )" ) GetDisplayNameOf() return error
Can you help me :( ? Here is little part of my source. I hope it is enough:
char txtBuf[MAX_PATH];
typedef struct {
BOOL bRoot;
LPITEMIDLIST lpi;
LPSHELLFOLDER lpsfParent;
LPITEMIDLIST lpifq;
} LPTVITEMDATA;
BOOL GetName(LPSHELLFOLDER lpsf,LPITEMIDLIST lpi,DWORD dwFlags,LPSTR lpFriendlyName) {
BOOL bSuccess = TRUE;
STRRET str;
if(NOERROR == lpsf->GetDisplayNameOf(lpi,dwFlags,&str)) {
...
}
else bSuccess = FALSE;
return bSuccess;
}
void GetItemPath(TV_ITEM tvi) {
LPMALLOC pMalloc;
LPTVITEMDATA* lptvid=NULL;
IShellFolder *psfProgFiles=NULL;
if(FAILED(SHGetMalloc(&pMalloc))) return;
lptvid = (LPTVITEMDATA*) pMalloc->Alloc(sizeof (LPTVITEMDATA));
if(!lptvid) {pMalloc->Release();return;}
lptvid=(LPTVITEMDATA*)tvi.lParam;
if(!lptvid) {pMalloc->Release();return;}
if(lptvid->bRoot) psfProgFiles=lptvid->lpsfParent;
else {
if(FAILED(lptvid->lpsfParent->BindToObject(lptvid->lpi,
NULL,IID_IShellFolder,
(LPVOID *)&psfProgFiles)))
{pMalloc->Release();return;}
}
GetName(psfProgFiles,lptvid->lpi,SHGDN_FORPARSING,txtBuf);
pMalloc->Release();
}
//----- In WndProcedure ---------------
...
case WM_NOTIFY:
switch(((NMHDR*)lParam)->idFrom) {
case ID_TREEVIEW:
tvItem=((NM_TREEVIEW*)lParam)->itemNew;
...
if(((NMHDR *)lParam)->code==TVN_SELCHANGING) {
GetItemPath(tvItem);
SendMessage(hStatus,SB_SETTEXT,0,(LPARAM)txtBuf);
}
...
break;
}
break;
// ...
Thanks in advance :( :) !