📄 browser.c
字号:
CMINVOKECOMMANDINFO cmi ;
DWORD dwAttribs = 0 ;
int idCmd ;
HMENU hMenu ;
BOOL bSuccess = TRUE ;
hr=lpsfParent -> lpVtbl -> GetUIObjectOf( lpsfParent, hwnd,
1, //Number of objects to get attributes of
&lpi,
&IID_IContextMenu,
0,
(LPVOID *)&lpcm) ;
if( SUCCEEDED( hr))
{
hMenu = CreatePopupMenu() ;
if( hMenu)
{
hr=lpcm -> lpVtbl -> QueryContextMenu( lpcm, hMenu,
0,
1,
0x7fff,
CMF_EXPLORE) ;
if( SUCCEEDED( hr))
{
idCmd = TrackPopupMenu( hMenu,
TPM_LEFTALIGN | TPM_RETURNCMD | TPM_RIGHTBUTTON,
lppt -> x,
lppt -> y,
0,
hwnd,
NULL) ;
if( idCmd)
{
cmi.cbSize = sizeof( CMINVOKECOMMANDINFO) ;
cmi.fMask = 0 ;
cmi.hwnd = hwnd ;
cmi.lpVerb = MAKEINTRESOURCE( idCmd - 1) ;
cmi.lpParameters = NULL ;
cmi.lpDirectory = NULL ;
cmi.nShow = SW_SHOWNORMAL ;
cmi.dwHotKey = 0 ;
cmi.hIcon = NULL ;
hr=lpcm -> lpVtbl -> InvokeCommand( lpcm, &cmi) ;
if( SUCCEEDED(hr))
; //Do nothing
else
{
MessageBox( hwnd, "InvokeCommand failed!!", "Shell Extension Sample", MB_OK) ;
wsprintf( szTemp, "hr=%lx", hr) ;
MessageBox( hwnd, szTemp, "Shell Extension Sample", MB_OK) ;
}
}
}
else
bSuccess = FALSE ;
DestroyMenu( hMenu) ;
}
else
bSuccess = FALSE ;
lpcm -> lpVtbl -> Release( lpcm) ;
}
else
{
MessageBox( hwnd, "GetUIObjectOf failed!!", "Shell Extension Sample", MB_OK) ;
wsprintf(szTemp, "hr=%lx", hr) ;
MessageBox( hwnd, szTemp, "Shell Extension Sample", MB_OK) ;
bSuccess = FALSE ;
}
return bSuccess;
}
BOOL WINAPI InitListViewImageLists( HWND hwndLV)
{
HIMAGELIST himlSmall ;
HIMAGELIST himlLarge ;
SHFILEINFO sfi ;
BOOL bSuccess = TRUE ;
himlSmall = (HIMAGELIST)SHGetFileInfo((LPCSTR)"C:\\",
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON) ;
himlLarge = (HIMAGELIST)SHGetFileInfo((LPCSTR)"C:\\",
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_LARGEICON) ;
if( himlSmall && himlLarge)
{
ListView_SetImageList(hwndLV, himlSmall, LVSIL_SMALL) ;
ListView_SetImageList(hwndLV, himlLarge, LVSIL_NORMAL) ;
}
else
bSuccess = FALSE;
return bSuccess;
}
BOOL WINAPI InitListViewItems( HWND hwndLV,
LPTVITEMDATA lptvid,
LPSHELLFOLDER lpsf)
{
LV_ITEM lvi ;
int iCtr ;
HRESULT hr ;
LPMALLOC lpMalloc ;
LPITEMIDLIST lpifqThisItem ;
LPITEMIDLIST lpi = 0 ;
LPENUMIDLIST lpe = 0 ;
LPLVITEMDATA lplvid ;
ULONG ulFetched, ulAttrs ;
HWND hwnd=GetParent( hwndLV) ;
char szBuff[ MAX_PATH] ;
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM ;
hr=SHGetMalloc( &lpMalloc) ;
if( FAILED(hr))
return FALSE ;
// Hourglass on!
SetCapture( GetParent( hwndLV)) ;
SetCursor( LoadCursor( NULL, IDC_WAIT)) ;
if( SUCCEEDED( hr))
{
hr = lpsf -> lpVtbl -> EnumObjects( lpsf, hwnd, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &lpe) ;
if( SUCCEEDED( hr))
{
iCtr = 0 ;
while( S_OK==lpe -> lpVtbl -> Next( lpe, 1, &lpi, &ulFetched))
{
// OK, let's get some memory for our ITEMDATA struct
lplvid = (LPLVITEMDATA)lpMalloc -> lpVtbl -> Alloc( lpMalloc, sizeof(LVITEMDATA)) ;
if( !lplvid)
goto Done ;
// now get the friendly name that we'll put in the treeview...
GetName( lpsf, lpi, SHGDN_NORMAL, szBuff) ;
lpsf -> lpVtbl -> GetAttributesOf( lpsf, 1, &lpi, &ulAttrs) ;
lplvid -> ulAttribs=ulAttrs;
lpifqThisItem=ConcatPidls(lptvid -> lpifq, lpi) ;
lvi.iItem = iCtr++ ;
lvi.iSubItem = 0 ;
lvi.pszText = szBuff ;
lvi.cchTextMax = MAX_PATH ;
lvi.iImage = GetIcon( lpifqThisItem, SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON) ;
lplvid -> lpsfParent = lpsf ;
lpsf -> lpVtbl -> AddRef( lpsf) ;
// now, make a copy of the ITEMIDLIST
lplvid -> lpi=CopyITEMID( lpMalloc, lpi) ;
lvi.lParam = (LPARAM)lplvid ;
// add the item to the listview
if( ListView_InsertItem( hwndLV, &lvi) == -1)
return FALSE ;
lpMalloc -> lpVtbl -> Free( lpMalloc, lpifqThisItem) ;
lpifqThisItem = 0 ;
lpMalloc -> lpVtbl -> Free( lpMalloc, lpi) ;
lpi = 0 ;
}
}
}
Done:
// Hourglass off!
ReleaseCapture() ;
SetCursor(LoadCursor(NULL, IDC_ARROW)) ;
if( lpe)
lpe -> lpVtbl -> Release( lpe) ;
//The following 2 if statements will only be TRUE if we got here on an
//error condition from the "goto" statement. Otherwise, we free this memory
//at the end of the while loop above.
if( lpi && lpMalloc)
lpMalloc -> lpVtbl -> Free(lpMalloc, lpi) ;
if( lpifqThisItem && lpMalloc)
lpMalloc -> lpVtbl -> Free(lpMalloc, lpifqThisItem) ;
if( lpMalloc)
lpMalloc -> lpVtbl -> Release(lpMalloc) ;
return TRUE ;
}
HWND WINAPI CreateListView( HWND hwndParent, HINSTANCE hInstance)
{
HWND hwndLV ;
RECT rc ;
// Force the common controls DLL to be loaded.
InitCommonControls() ;
// Create the control.
GetClientRect(hwndParent, &rc) ;
hwndLV = CreateWindowEx(WS_EX_CLIENTEDGE,
WC_LISTVIEW, "",
WS_VISIBLE | WS_CHILD | WS_BORDER | LVS_EDITLABELS |
LVS_LIST | LVS_AUTOARRANGE | LVS_SHAREIMAGELISTS,
0, 0,
rc.right-rc.left, rc.bottom-rc.top,
hwndParent,
(HMENU)IDD_LISTVIEW,
hInstance,
NULL) ;
return hwndLV ;
}
void SwitchView(HWND hwndLV, DWORD dwView)
{
DWORD dwStyle = GetWindowLong(hwndLV, GWL_STYLE) ;
if( (dwStyle & LVS_TYPEMASK) != dwView)
SetWindowLong(hwndLV, GWL_STYLE, (dwStyle & ~LVS_TYPEMASK) | dwView) ;
}
int CALLBACK ListViewCompareProc(LPARAM lParam1,
LPARAM lParam2,
LPARAM lParamSort)
{
LPLVITEMDATA lplvid1=(LPLVITEMDATA)lParam1;
LPLVITEMDATA lplvid2=(LPLVITEMDATA)lParam2;
char szTemp1[MAX_PATH];
char szTemp2[MAX_PATH];
int iResult = 1;
if( lplvid1 && lplvid2)
{
if( (lplvid1 -> ulAttribs & SFGAO_FOLDER) &&
!(lplvid2 -> ulAttribs & SFGAO_FOLDER) )
return -1;
if( !(lplvid1 -> ulAttribs & SFGAO_FOLDER) &&
(lplvid2 -> ulAttribs & SFGAO_FOLDER) )
return 1;
GetName(lplvid1 -> lpsfParent, lplvid1 -> lpi, SHGDN_NORMAL, szTemp1) ;
GetName(lplvid2 -> lpsfParent, lplvid2 -> lpi, SHGDN_NORMAL, szTemp2) ;
iResult = lstrcmpi(szTemp1, szTemp2) ;
}
return iResult;
}
BOOL PopulateListView(HWND hwndLV,
LPTVITEMDATA lptvid,
LPSHELLFOLDER lpsf)
{
ListView_DeleteAllItems(hwndLV) ;
if( !InitListViewImageLists(hwndLV) ||
!InitListViewItems(hwndLV, lptvid, lpsf))
{
return FALSE;
}
ListView_SortItems(hwndLV,
ListViewCompareProc,
0) ;
}
LPITEMIDLIST Next(LPCITEMIDLIST pidl)
{
LPSTR lpMem=(LPSTR)pidl;
lpMem+=pidl -> mkid.cb;
return (LPITEMIDLIST)lpMem;
}
UINT GetSize(LPCITEMIDLIST pidl)
{
UINT cbTotal = 0;
if( pidl)
{
cbTotal += sizeof(pidl -> mkid.cb) ; // Null terminator
while (pidl -> mkid.cb)
{
cbTotal += pidl -> mkid.cb;
pidl = Next(pidl) ;
}
}
return cbTotal;
}
LPITEMIDLIST Create(UINT cbSize)
{
LPMALLOC lpMalloc;
HRESULT hr;
LPITEMIDLIST pidl=0;
hr=SHGetMalloc(&lpMalloc) ;
if( FAILED(hr))
return 0;
pidl=(LPITEMIDLIST)lpMalloc -> lpVtbl -> Alloc(lpMalloc, cbSize) ;
if( pidl)
_fmemset(pidl, 0, cbSize) ; // zero-init for external task alloc
if( lpMalloc) lpMalloc -> lpVtbl -> Release(lpMalloc) ;
return pidl;
}
LPITEMIDLIST ConcatPidls(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
{
LPITEMIDLIST pidlNew;
UINT cb1;
UINT cb2;
if( pidl1) //May be NULL
cb1 = GetSize(pidl1) - sizeof(pidl1 -> mkid.cb) ;
else
cb1 = 0;
cb2 = GetSize(pidl2) ;
pidlNew = Create(cb1 + cb2) ;
if( pidlNew)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -