📄 shlview.c
字号:
pidl = (LPCITEMIDLIST)((LPBYTE)pIDList+pIDList->aoffset[i]);
attribs = SFGAO_FOLDER;
hr = IShellFolder_GetAttributesOf(This->pSFParent, 1, &pidl, &attribs);
if (SUCCEEDED(hr) && ! (attribs & SFGAO_FOLDER))
{
SHELLEXECUTEINFOW shexinfo;
shexinfo.cbSize = sizeof(SHELLEXECUTEINFOW);
shexinfo.fMask = SEE_MASK_INVOKEIDLIST; /* SEE_MASK_IDLIST is also possible. */
shexinfo.hwnd = NULL;
shexinfo.lpVerb = NULL;
shexinfo.lpFile = NULL;
shexinfo.lpParameters = NULL;
shexinfo.lpDirectory = parent_dir;
shexinfo.nShow = SW_NORMAL;
shexinfo.lpIDList = ILCombine(parent_pidl, pidl);
ShellExecuteExW(&shexinfo); /* Discard error/success info */
ILFree((LPITEMIDLIST)shexinfo.lpIDList);
}
}
GlobalUnlock(stgm.u.hGlobal);
ReleaseStgMedium(&stgm);
IDataObject_Release(selection);
return S_OK;
}
/**********************************************************
* ShellView_DoContextMenu()
*/
static void ShellView_DoContextMenu(IShellViewImpl * This, WORD x, WORD y, BOOL bDefault)
{ UINT uCommand;
DWORD wFlags;
HMENU hMenu;
BOOL fExplore = FALSE;
HWND hwndTree = 0;
LPCONTEXTMENU pContextMenu = NULL;
IContextMenu2 *pCM = NULL;
CMINVOKECOMMANDINFO cmi;
TRACE("(%p)->(0x%08x 0x%08x 0x%08x) stub\n",This, x, y, bDefault);
/* look, what's selected and create a context menu object of it*/
if( ShellView_GetSelections(This) )
{
IShellFolder_GetUIObjectOf( This->pSFParent, This->hWndParent, This->cidl, (LPCITEMIDLIST*)This->apidl,
(REFIID)&IID_IContextMenu, NULL, (LPVOID *)&pContextMenu);
if(pContextMenu)
{
TRACE("-- pContextMenu\n");
hMenu = CreatePopupMenu();
if( hMenu )
{
/* See if we are in Explore or Open mode. If the browser's tree is present, we are in Explore mode.*/
if(SUCCEEDED(IShellBrowser_GetControlWindow(This->pShellBrowser,FCW_TREE, &hwndTree)) && hwndTree)
{
TRACE("-- explore mode\n");
fExplore = TRUE;
}
/* build the flags depending on what we can do with the selected item */
wFlags = CMF_NORMAL | (This->cidl != 1 ? 0 : CMF_CANRENAME) | (fExplore ? CMF_EXPLORE : 0);
/* let the ContextMenu merge its items in */
if (SUCCEEDED(IContextMenu_QueryContextMenu( pContextMenu, hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, wFlags )))
{
if (This->FolderSettings.fFlags & FWF_DESKTOP)
SetMenuDefaultItem(hMenu, FCIDM_SHVIEW_OPEN, MF_BYCOMMAND);
if( bDefault )
{
TRACE("-- get menu default command\n");
uCommand = GetMenuDefaultItem(hMenu, FALSE, GMDI_GOINTOPOPUPS);
}
else
{
TRACE("-- track popup\n");
uCommand = TrackPopupMenu( hMenu,TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,This->hWnd,NULL);
}
if(uCommand > 0)
{
TRACE("-- uCommand=%u\n", uCommand);
if (uCommand==FCIDM_SHVIEW_OPEN && IsInCommDlg(This))
{
TRACE("-- dlg: OnDefaultCommand\n");
if (OnDefaultCommand(This) != S_OK)
{
ShellView_OpenSelectedItems(This);
}
}
else
{
TRACE("-- explore -- invoke command\n");
ZeroMemory(&cmi, sizeof(cmi));
cmi.cbSize = sizeof(cmi);
cmi.hwnd = This->hWndParent; /* this window has to answer CWM_GETISHELLBROWSER */
cmi.lpVerb = (LPCSTR)MAKEINTRESOURCEA(uCommand);
IContextMenu_InvokeCommand(pContextMenu, &cmi);
}
}
DestroyMenu(hMenu);
}
}
if (pContextMenu)
IContextMenu_Release(pContextMenu);
}
}
else /* background context menu */
{
hMenu = CreatePopupMenu();
pCM = ISvBgCm_Constructor(This->pSFParent, FALSE);
IContextMenu2_QueryContextMenu(pCM, hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, 0);
uCommand = TrackPopupMenu( hMenu, TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,This->hWnd,NULL);
DestroyMenu(hMenu);
TRACE("-- (%p)->(uCommand=0x%08x )\n",This, uCommand);
ZeroMemory(&cmi, sizeof(cmi));
cmi.cbSize = sizeof(cmi);
cmi.lpVerb = (LPCSTR)MAKEINTRESOURCEA(uCommand);
cmi.hwnd = This->hWndParent;
IContextMenu2_InvokeCommand(pCM, &cmi);
IContextMenu2_Release(pCM);
}
}
/**********************************************************
* ##### message handling #####
*/
/**********************************************************
* ShellView_OnSize()
*/
static LRESULT ShellView_OnSize(IShellViewImpl * This, WORD wWidth, WORD wHeight)
{
TRACE("%p width=%u height=%u\n",This, wWidth,wHeight);
/*resize the ListView to fit our window*/
if(This->hWndList)
{
MoveWindow(This->hWndList, 0, 0, wWidth, wHeight, TRUE);
}
return S_OK;
}
/**********************************************************
* ShellView_OnDeactivate()
*
* NOTES
* internal
*/
static void ShellView_OnDeactivate(IShellViewImpl * This)
{
TRACE("%p\n",This);
if(This->uState != SVUIA_DEACTIVATE)
{
if(This->hMenu)
{
IShellBrowser_SetMenuSB(This->pShellBrowser,0, 0, 0);
IShellBrowser_RemoveMenusSB(This->pShellBrowser,This->hMenu);
DestroyMenu(This->hMenu);
This->hMenu = 0;
}
This->uState = SVUIA_DEACTIVATE;
}
}
/**********************************************************
* ShellView_OnActivate()
*/
static LRESULT ShellView_OnActivate(IShellViewImpl * This, UINT uState)
{ OLEMENUGROUPWIDTHS omw = { {0, 0, 0, 0, 0, 0} };
MENUITEMINFOA mii;
CHAR szText[MAX_PATH];
TRACE("%p uState=%x\n",This,uState);
/*don't do anything if the state isn't really changing */
if(This->uState == uState)
{
return S_OK;
}
ShellView_OnDeactivate(This);
/*only do This if we are active */
if(uState != SVUIA_DEACTIVATE)
{
/*merge the menus */
This->hMenu = CreateMenu();
if(This->hMenu)
{
IShellBrowser_InsertMenusSB(This->pShellBrowser, This->hMenu, &omw);
TRACE("-- after fnInsertMenusSB\n");
/*build the top level menu get the menu item's text*/
strcpy(szText,"dummy 31");
ZeroMemory(&mii, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_STATE;
mii.fType = MFT_STRING;
mii.fState = MFS_ENABLED;
mii.dwTypeData = szText;
mii.hSubMenu = ShellView_BuildFileMenu(This);
/*insert our menu into the menu bar*/
if(mii.hSubMenu)
{
InsertMenuItemA(This->hMenu, FCIDM_MENU_HELP, FALSE, &mii);
}
/*get the view menu so we can merge with it*/
ZeroMemory(&mii, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_SUBMENU;
if(GetMenuItemInfoA(This->hMenu, FCIDM_MENU_VIEW, FALSE, &mii))
{
ShellView_MergeViewMenu(This, mii.hSubMenu);
}
/*add the items that should only be added if we have the focus*/
if(SVUIA_ACTIVATE_FOCUS == uState)
{
/*get the file menu so we can merge with it */
ZeroMemory(&mii, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_SUBMENU;
if(GetMenuItemInfoA(This->hMenu, FCIDM_MENU_FILE, FALSE, &mii))
{
ShellView_MergeFileMenu(This, mii.hSubMenu);
}
}
TRACE("-- before fnSetMenuSB\n");
IShellBrowser_SetMenuSB(This->pShellBrowser, This->hMenu, 0, This->hWnd);
}
}
This->uState = uState;
TRACE("--\n");
return S_OK;
}
/**********************************************************
* ShellView_OnSetFocus()
*
*/
static LRESULT ShellView_OnSetFocus(IShellViewImpl * This)
{
TRACE("%p\n",This);
/* Tell the browser one of our windows has received the focus. This
should always be done before merging menus (OnActivate merges the
menus) if one of our windows has the focus.*/
IShellBrowser_OnViewWindowActive(This->pShellBrowser,(IShellView*) This);
ShellView_OnActivate(This, SVUIA_ACTIVATE_FOCUS);
/* Set the focus to the listview */
SetFocus(This->hWndList);
/* Notify the ICommDlgBrowser interface */
OnStateChange(This,CDBOSC_SETFOCUS);
return 0;
}
/**********************************************************
* ShellView_OnKillFocus()
*/
static LRESULT ShellView_OnKillFocus(IShellViewImpl * This)
{
TRACE("(%p) stub\n",This);
ShellView_OnActivate(This, SVUIA_ACTIVATE_NOFOCUS);
/* Notify the ICommDlgBrowser */
OnStateChange(This,CDBOSC_KILLFOCUS);
return 0;
}
/**********************************************************
* ShellView_OnCommand()
*
* NOTES
* the CmdID's are the ones from the context menu
*/
static LRESULT ShellView_OnCommand(IShellViewImpl * This,DWORD dwCmdID, DWORD dwCmd, HWND hwndCmd)
{
TRACE("(%p)->(0x%08x 0x%08x %p) stub\n",This, dwCmdID, dwCmd, hwndCmd);
switch(dwCmdID)
{
case FCIDM_SHVIEW_SMALLICON:
This->FolderSettings.ViewMode = FVM_SMALLICON;
SetStyle (This, LVS_SMALLICON, LVS_TYPEMASK);
CheckToolbar(This);
break;
case FCIDM_SHVIEW_BIGICON:
This->FolderSettings.ViewMode = FVM_ICON;
SetStyle (This, LVS_ICON, LVS_TYPEMASK);
CheckToolbar(This);
break;
case FCIDM_SHVIEW_LISTVIEW:
This->FolderSettings.ViewMode = FVM_LIST;
SetStyle (This, LVS_LIST, LVS_TYPEMASK);
CheckToolbar(This);
break;
case FCIDM_SHVIEW_REPORTVIEW:
This->FolderSettings.ViewMode = FVM_DETAILS;
SetStyle (This, LVS_REPORT, LVS_TYPEMASK);
CheckToolbar(This);
break;
/* the menu-ID's for sorting are 0x30... see shrec.rc */
case 0x30:
case 0x31:
case 0x32:
case 0x33:
This->ListViewSortInfo.nHeaderID = (LPARAM) (dwCmdID - 0x30);
This->ListViewSortInfo.bIsAscending = TRUE;
This->ListViewSortInfo.nLastHeaderID = This->ListViewSortInfo.nHeaderID;
SendMessageA(This->hWndList, LVM_SORTITEMS, (WPARAM) &This->ListViewSortInfo, (LPARAM)ShellView_ListViewCompareItems);
break;
default:
TRACE("-- COMMAND 0x%04x unhandled\n", dwCmdID);
}
return 0;
}
/**********************************************************
* ShellView_OnNotify()
*/
static LRESULT ShellView_OnNotify(IShellViewImpl * This, UINT CtlID, LPNMHDR lpnmh)
{ LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)lpnmh;
NMLVDISPINFOA *lpdi = (NMLVDISPINFOA *)lpnmh;
LPITEMIDLIST pidl;
TRACE("%p CtlID=%u lpnmh->code=%x\n",This,CtlID,lpnmh->code);
switch(lpnmh->code)
{
case NM_SETFOCUS:
TRACE("-- NM_SETFOCUS %p\n",This);
ShellView_OnSetFocus(This);
break;
case NM_KILLFOCUS:
TRACE("-- NM_KILLFOCUS %p\n",This);
ShellView_OnDeactivate(This);
/* Notify the ICommDlgBrowser interface */
OnStateChange(This,CDBOSC_KILLFOCUS);
break;
case NM_CUSTOMDRAW:
TRACE("-- NM_CUSTOMDRAW %p\n",This);
return CDRF_DODEFAULT;
case NM_RELEASEDCAPTURE:
TRACE("-- NM_RELEASEDCAPTURE %p\n",This);
break;
case NM_CLICK:
TRACE("-- NM_CLICK %p\n",This);
break;
case NM_RCLICK:
TRACE("-- NM_RCLICK %p\n",This);
break;
case NM_DBLCLK:
TRACE("-- NM_DBLCLK %p\n",This);
if (OnDefaultCommand(This) != S_OK) ShellView_OpenSelectedItems(This);
break;
case NM_RETURN:
TRACE("-- NM_DBLCLK %p\n",This);
if (OnDefaultCommand(This) != S_OK) ShellView_OpenSelectedItems(This);
break;
case HDN_ENDTRACKA:
TRACE("-- HDN_ENDTRACKA %p\n",This);
/*nColumn1 = ListView_GetColumnWidth(This->hWndList, 0);
nColumn2 = ListView_GetColumnWidth(This->hWndList, 1);*/
break;
case LVN_DELETEITEM:
TRACE("-- LVN_DELETEITEM %p\n",This);
SHFree((LPITEMIDLIST)lpnmlv->lParam); /*delete the pidl because we made a copy of it*/
break;
case LVN_DELETEALLITEMS:
TRACE("-- LVN_DELETEALLITEMS %p\n",This);
return FALSE;
case LVN_INSERTITEM:
TRACE("-- LVN_INSERTITEM (STUB)%p\n",This);
break;
case LVN_ITEMACTIVATE:
TRACE("-- LVN_ITEMACTIVATE %p\n",This);
OnStateChange(This, CDBOSC_SELCHANGE); /* the browser will get the IDataObject now */
break;
case LVN_COLUMNCLICK:
This->ListViewSortInfo.nHeaderID = lpnmlv->iSubItem;
if(This->ListViewSortInfo.nLastHeaderID == This->ListViewSortInfo.nHeaderID)
{
This->ListViewSortInfo.bIsAscending = !This->ListViewSortInfo.bIsAscending;
}
else
{
This->ListViewSortInfo.bIsAscending = TRUE;
}
This->ListViewSortInfo.nLastHeaderID = This->ListViewSortInfo.nHeaderID;
SendMessageA(lpnmlv->hdr.hwndFrom, LVM_SORTITEMS, (WPARAM) &This->ListViewSortInfo, (LPARAM)ShellView_ListViewCompareItems);
break;
case LVN_GETDISPINFOA:
case LVN_GETDISPINFOW:
TRACE("-- LVN_GETDISPINFO %p\n",This);
pidl = (LPITEMIDLIST)lpdi->item.lParam;
if(lpdi->item.mask & LVIF_TEXT) /* text requested */
{
if (This->pSF2Parent)
{
SHELLDETAILS sd;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -