📄 dlapi.c
字号:
// //{
// // Generate Full Qualified pidl
// pidl = IL_Create(g_lpMalloc,lpdl->pidl,lpdl->cbidl,lplvid->pidl,0);
// SHGetFileInfo((LPCSTR)pidl,0,&shfi,sizeof(SHFILEINFO),SHGFI_PIDL | SHGFI_SYSICONINDEX);
// lpdi->item.iImage = shfi.iIcon;
// g_lpMalloc->lpVtbl->Free(g_lpMalloc,pidl);
// //lpMalloc->lpVtbl->Release(lpMalloc);
// //}
// // It proved necessary to reset the state bits...
// lpdi->item.stateMask = 0;
// lpdi->item.state = 0;
// // Link and Share Overlay
// lplvid->lpsf->lpVtbl->GetAttributesOf(
// lplvid->lpsf,
// 1,&lplvid->pidl,
// &dwAttributes);
// if (dwAttributes & SFGAO_LINK)
// {
// lpdi->item.mask |= LVIF_STATE;
// lpdi->item.stateMask |= LVIS_OVERLAYMASK;
// lpdi->item.state |= INDEXTOOVERLAYMASK(2);
// }
// if (dwAttributes & SFGAO_SHARE)
// {
// lpdi->item.mask |= LVIF_STATE;
// lpdi->item.stateMask |= LVIS_OVERLAYMASK;
// lpdi->item.state |= INDEXTOOVERLAYMASK(1);
// }
// // Fade hidden/system files
// if (!bNoFadeHidden)
// {
// WIN32_FIND_DATA fd;
// if (NOERROR == SHGetDataFromIDList(lplvid->lpsf,lplvid->pidl,
// SHGDFIL_FINDDATA,&fd,sizeof(WIN32_FIND_DATA)))
// {
// if ((fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) ||
// (fd.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM))
// {
// lpdi->item.mask |= LVIF_STATE;
// lpdi->item.stateMask |= LVIS_CUT;
// lpdi->item.state |= LVIS_CUT;
// }
// }
// }
//}
// Set values
lpdi->item.mask |= LVIF_DI_SETITEM;
return TRUE;
}
//=============================================================================
//
// DirList_DeleteItem()
//
// Must be called in response to a WM_NOTIFY/LVN_DELETEITEM message
// from the control
//
BOOL DirList_DeleteItem(HWND hwnd,LPARAM lParam)
{
LPDLDATA lpdl = (LPVOID)GetProp(hwnd,pDirListProp);
LV_ITEM lvi;
//LPMALLOC lpMalloc;
NM_LISTVIEW *lpnmlv = (LPVOID)lParam;
lvi.iItem = lpnmlv->iItem;
lvi.iSubItem = 0;
lvi.mask = LVIF_PARAM;
if (ListView_GetItem(hwnd,&lvi))
{
//if (NOERROR == SHGetMalloc(&lpMalloc))
//{
// Free mem
LPLV_ITEMDATA lplvid = (LPLV_ITEMDATA)lvi.lParam;
g_lpMalloc->lpVtbl->Free(g_lpMalloc,lplvid->pidl);
lplvid->lpsf->lpVtbl->Release(lplvid->lpsf);
g_lpMalloc->lpVtbl->Free(g_lpMalloc,lplvid);
//lpMalloc->lpVtbl->Release(lpMalloc);
return TRUE;
//}
}
else
return FALSE;
}
//=============================================================================
//
// DirList_CompareProc()
//
// Compares two list items
//
int CALLBACK DirList_CompareProcFw(LPARAM lp1,LPARAM lp2,LPARAM lFlags)
{
HRESULT hr;
LPLV_ITEMDATA lplvid1 = (LPLV_ITEMDATA)lp1;
LPLV_ITEMDATA lplvid2 = (LPLV_ITEMDATA)lp2;
hr = (lplvid1->lpsf->lpVtbl->CompareIDs(
lplvid1->lpsf,
lFlags,
lplvid1->pidl,
lplvid2->pidl));
return(short)(SCODE_CODE(GetScode(hr)));
}
int CALLBACK DirList_CompareProcRw(LPARAM lp1,LPARAM lp2,LPARAM lFlags)
{
HRESULT hr;
LPLV_ITEMDATA lplvid1 = (LPLV_ITEMDATA)lp1;
LPLV_ITEMDATA lplvid2 = (LPLV_ITEMDATA)lp2;
hr = (lplvid1->lpsf->lpVtbl->CompareIDs(
lplvid1->lpsf,
lFlags,
lplvid1->pidl,
lplvid2->pidl));
return(-(short)(SCODE_CODE(GetScode(hr))));
}
//=============================================================================
//
// DirList_Sort()
//
// Sorts the listview control by the specified order
//
BOOL DirList_Sort(HWND hwnd,int lFlags,BOOL fRev)
{
LPDLDATA lpdl = (LPVOID)GetProp(hwnd,pDirListProp);
if (fRev)
return ListView_SortItems(hwnd,DirList_CompareProcRw,lFlags);
else
return ListView_SortItems(hwnd,DirList_CompareProcFw,lFlags);
}
//=============================================================================
//
// DirList_GetItem()
//
// Copies the data of the specified item in the listview control to a buffer
//
int DirList_GetItem(HWND hwnd,int iItem,LPDLITEM lpdli)
{
LV_ITEM lvi;
LPLV_ITEMDATA lplvid;
ULONG dwAttributes = SFGAO_FILESYSTEM;
if (iItem == -1)
{
if (ListView_GetSelectedCount(hwnd))
iItem = ListView_GetNextItem(hwnd,-1,LVNI_ALL | LVNI_SELECTED);
else
return(-1);
}
lvi.mask = LVIF_PARAM;
lvi.iItem = iItem;
lvi.iSubItem = 0;
if (!ListView_GetItem(hwnd,&lvi))
{
if (lpdli->mask & DLI_TYPE)
lpdli->ntype = DLE_NONE;
return(-1);
}
lplvid = (LPLV_ITEMDATA)lvi.lParam;
// Filename
if (lpdli->mask & DLI_FILENAME)
IL_GetDisplayName(lplvid->lpsf,lplvid->pidl,SHGDN_FORPARSING,
lpdli->szFileName,MAX_PATH);
// Displayname
if (lpdli->mask & DLI_DISPNAME)
IL_GetDisplayName(lplvid->lpsf,lplvid->pidl,SHGDN_INFOLDER,
lpdli->szDisplayName,MAX_PATH);
// Type (File / Directory)
if (lpdli->mask & DLI_TYPE)
{
WIN32_FIND_DATA fd;
if (NOERROR == SHGetDataFromIDList(lplvid->lpsf,
lplvid->pidl,
SHGDFIL_FINDDATA,
&fd,
sizeof(WIN32_FIND_DATA)))
lpdli->ntype = (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ?
DLE_DIR : DLE_FILE;
/*lplvid->lpsf->lpVtbl->GetAttributesOf(
lplvid->lpsf,
1,
&lplvid->pidl,
&dwAttributes);
lpdli->ntype = (dwAttributes & SFGAO_FOLDER) ? DLE_DIR : DLE_FILE;*/
}
return iItem;
}
//=============================================================================
//
// DirList_GetItemEx()
//
// Retrieves extended infomration on a dirlist item
//
int DirList_GetItemEx(HWND hwnd,int iItem,LPWIN32_FIND_DATA pfd)
{
LV_ITEM lvi;
LPLV_ITEMDATA lplvid;
if (iItem == -1)
{
if (ListView_GetSelectedCount(hwnd))
iItem = ListView_GetNextItem(hwnd,-1,LVNI_ALL | LVNI_SELECTED);
else
return(-1);
}
lvi.mask = LVIF_PARAM;
lvi.iItem = iItem;
lvi.iSubItem = 0;
if (!ListView_GetItem(hwnd,&lvi))
return(-1);
lplvid = (LPLV_ITEMDATA)lvi.lParam;
if (NOERROR == SHGetDataFromIDList(lplvid->lpsf,
lplvid->pidl,
SHGDFIL_FINDDATA,
pfd,
sizeof(WIN32_FIND_DATA)))
return iItem;
else
return(-1);
}
//=============================================================================
//
// DirList_PropertyDlg()
//
// Shows standard Win95 Property Dlg for selected Item
//
BOOL DirList_PropertyDlg(HWND hwnd,int iItem)
{
LV_ITEM lvi;
LPLV_ITEMDATA lplvid;
LPCONTEXTMENU lpcm;
CMINVOKECOMMANDINFO cmi;
BOOL bSuccess = TRUE;
static const char *lpVerb = "properties";
if (iItem == -1)
{
if (ListView_GetSelectedCount(hwnd))
iItem = ListView_GetNextItem(hwnd,-1,LVNI_ALL | LVNI_SELECTED);
else
return FALSE;
}
lvi.mask = LVIF_PARAM;
lvi.iItem = iItem;
lvi.iSubItem = 0;
if (!ListView_GetItem(hwnd,&lvi))
return FALSE;
lplvid = (LPLV_ITEMDATA)lvi.lParam;
if (NOERROR == lplvid->lpsf->lpVtbl->GetUIObjectOf(
lplvid->lpsf,
GetParent(hwnd), // Owner
1, // Number of objects
&lplvid->pidl, // pidl
&IID_IContextMenu,
NULL,
&lpcm))
{
cmi.cbSize = sizeof(CMINVOKECOMMANDINFO);
cmi.fMask = 0;
cmi.hwnd = GetParent(hwnd);
cmi.lpVerb = lpVerb;
cmi.lpParameters = NULL;
cmi.lpDirectory = NULL;
cmi.nShow = SW_SHOWNORMAL;
cmi.dwHotKey = 0;
cmi.hIcon = NULL;
if (NOERROR != lpcm->lpVtbl->InvokeCommand(lpcm,&cmi))
bSuccess = FALSE;
lpcm->lpVtbl->Release(lpcm);
}
else
bSuccess = FALSE;
return(bSuccess);
}
//=============================================================================
//
// DirList_DoDragDrop()
//
// Execute an OLE Drag & Drop Operation in response to LVN_BEGIN(R)DRAG
//
//extern LPDROPSOURCE CreateDropSource();
void DirList_DoDragDrop(HWND hwnd,LPARAM lParam)
{
//LV_ITEM lvi;
//LPLV_ITEMDATA lplvid;
//LPDATAOBJECT lpdo;
//LPDROPSOURCE lpds;
//DWORD dwEffect;
//NM_LISTVIEW *pnmlv = (LPVOID)lParam;
//lvi.iItem = pnmlv->iItem;
//lvi.iSubItem = 0;
//lvi.mask = LVIF_PARAM;
//if (ListView_GetItem(hwnd,&lvi))
//{
// lplvid = (LPLV_ITEMDATA)lvi.lParam;
// if (SUCCEEDED(lplvid->lpsf->lpVtbl->GetUIObjectOf(
// lplvid->lpsf,
// GetParent(hwnd),
// 1,
// &lplvid->pidl,
// &IID_IDataObject,
// NULL,
// &lpdo)))
// {
// lpds = CreateDropSource();
// DoDragDrop(lpdo,lpds,DROPEFFECT_COPY|DROPEFFECT_MOVE|DROPEFFECT_LINK,&dwEffect);
// lpdo->lpVtbl->Release(lpdo);
// lpds->lpVtbl->Release(lpds);
// }
//}
}
//=============================================================================
//
// DirList_GetLongPathName()
//
// Get long pathname for currently displayed directory
//
BOOL DirList_GetLongPathName(HWND hwnd,LPSTR lpszLongPath)
{
char tch[MAX_PATH];
LPDLDATA lpdl = (LPVOID)GetProp(hwnd,pDirListProp);
if (SHGetPathFromIDList(lpdl->pidl,tch))
{
lstrcpy(lpszLongPath,tch);
return(TRUE);
}
else
return(FALSE);
}
//=============================================================================
//
// DirList_SelectItem()
//
// Select specified item in the list
//
BOOL DirList_SelectItem(HWND hwnd,LPCSTR lpszDisplayName,LPCSTR lpszFullPath)
{
#define LVIS_FLAGS LVIS_SELECTED|LVIS_FOCUSED
char szShortPath[MAX_PATH];
SHFILEINFO shfi;
LV_FINDINFO lvfi;
DLITEM dli;
int i = -1;
if (!lpszFullPath || !lstrlen(lpszFullPath))
return(FALSE);
else
GetShortPathName(lpszFullPath,szShortPath,MAX_PATH);
if (!lpszDisplayName || !lstrlen(lpszDisplayName))
SHGetFileInfo(lpszFullPath,0,&shfi,sizeof(SHFILEINFO),SHGFI_DISPLAYNAME);
else
lstrcpyn(shfi.szDisplayName,lpszDisplayName,MAX_PATH);
lvfi.flags = LVFI_STRING;
lvfi.psz = shfi.szDisplayName;
dli.mask = DLI_ALL;
while ((i = ListView_FindItem(hwnd,i,&lvfi)) != -1)
{
DirList_GetItem(hwnd,i,&dli);
GetShortPathName(dli.szFileName,dli.szFileName,MAX_PATH);
if (!lstrcmpi(dli.szFileName,szShortPath))
{
ListView_SetItemState(hwnd,i,LVIS_FLAGS,LVIS_FLAGS);
ListView_EnsureVisible(hwnd,i,FALSE);
return(TRUE);
}
}
return(FALSE);
}
//=============================================================================
//
// DirList_CreateFilter()
//
// Create a valid DL_FILTER structure
//
void DirList_CreateFilter(PDL_FILTER pdlf,LPCSTR lpszFileSpec,
BOOL bExcludeFilter)
{
char *p;
ZeroMemory(pdlf,sizeof(DL_FILTER));
lstrcpyn(pdlf->tFilterBuf,lpszFileSpec,(DL_FILTER_BUFSIZE-1));
pdlf->bExcludeFilter = bExcludeFilter;
if (!lstrcmp(lpszFileSpec,"*.*") || !lstrlen(lpszFileSpec))
return;
pdlf->nCount = 1;
pdlf->pFilter[0] = &pdlf->tFilterBuf[0]; // Zeile zum Ausprobieren
while (p = strchr(pdlf->pFilter[pdlf->nCount-1],';'))
{
*p = '\0'; // Replace ';' by '\0'
pdlf->pFilter[pdlf->nCount] = (p + 1); // Next position after ';'
pdlf->nCount++; // Increase number of filters
}
}
//=============================================================================
//
// DirList_MatchFilter()
//
// Check if a specified item matches a given filter
//
BOOL DirList_MatchFilter(LPSHELLFOLDER lpsf,LPCITEMIDLIST pidl,PDL_FILTER pdlf)
{
int i;
WIN32_FIND_DATA fd;
BOOL bMatchSpec;
// Immediately return true if lpszFileSpec is *.* or NULL
if (pdlf->nCount == 0 && !pdlf->bExcludeFilter)
return TRUE;
SHGetDataFromIDList(lpsf,pidl,SHGDFIL_FINDDATA,&fd,sizeof(WIN32_FIND_DATA));
// All the directories are added
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
return(TRUE);
// Check if exclude *.* after directories have been added
if (pdlf->nCount == 0 && pdlf->bExcludeFilter)
return FALSE;
for (i = 0; i < pdlf->nCount; i++)
{
if (*pdlf->pFilter[i]) // Filters like "\0" are ignored
{
bMatchSpec = PathMatchSpec(fd.cFileName,pdlf->pFilter[i]);
if (bMatchSpec)
{
if (!pdlf->bExcludeFilter)
return(TRUE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -