📄 shellview.cpp
字号:
LPENUMIDLIST pEnumIDList;
if (SUCCEEDED(m_pSF->EnumObjects(m_hWnd, SHCONTF_NONFOLDERS | SHCONTF_FOLDERS, &pEnumIDList) ) )
{
SendMessage(m_hWndListCtrl, WM_SETREDRAW, FALSE, 0);
DWORD dwFetched = 0;
LPITEMIDLIST pidl = NULL;
while((S_OK == pEnumIDList->Next(1, &pidl, &dwFetched)) && dwFetched)
{
// TODO : Add extra code here
}
pEnumIDList->Release();
// Sort the items...
ListView_SortItems(m_hWndListCtrl, compareItems, (LPARAM)m_pSF);
SendMessage(m_hWndListCtrl, WM_SETREDRAW, TRUE, 0);
InvalidateRect(m_hWndListCtrl, NULL, TRUE);
UpdateWindow(m_hWndListCtrl);
}
}
int CALLBACK CShellView::compareItems(LPARAM lParam1, LPARAM lParam2, LPARAM lpData)
{
// Let the code in shellfolder do the comparing...
CShellFolder *pFolder = (CShellFolder*)lpData;
if(!pFolder)
{
return 0;
}
return (int)pFolder->CompareIDs(0, (LPITEMIDLIST)lParam1, (LPITEMIDLIST)lParam2);
}
LRESULT CShellView::onCommand(HWND hWndCtrl, DWORD dwNotifyCode, DWORD dwID)
{
// TODO : Add extra code here
switch (dwID)
{
case ID_FILEPOPUPMENU_FOLDER:
// TODO : Handle ID_FILEPOPUPMENU_FOLDER here
::MessageBox(NULL, "New Folder", "File", MB_OK);
break;
// TODO : Handle other menu commands here...
case ID_FILEPOPUPMENU_FILE:
::MessageBox(NULL, "New File", "File", MB_OK);
break;
case ID_EDITPOPUP_CUT:
::MessageBox(NULL, "Cut", "Edit", MB_OK);
break;
case ID_EDITPOPUP_COPY:
::MessageBox(NULL, "Copy", "Edit", MB_OK);
break;
case ID_EDITPOPUP_PASTE:
::MessageBox(NULL, "Paste", "Edit", MB_OK);
break;
case ID_EDITPOPUP_UNDO:
::MessageBox(NULL, "Undo", "Edit", MB_OK);
break;
case ID_EDITPOPUP_PASTESHORTCUT:
::MessageBox(NULL, "Paste shortcut", "Edit", MB_OK);
break;
case ID_EDITPOPUP_SELECTALL:
::MessageBox(NULL, "Select All", "Edit", MB_OK);
break;
case ID_EDITPOPUP_INVERTSELECTION:
::MessageBox(NULL, "Invert Selection", "Edit", MB_OK);
break;
case ID_VIEWPOPUP_LARGEICONS:
onViewStyle(LVS_ICON);
break;
case ID_VIEWPOPUP_SMALLICONS:
onViewStyle(LVS_SMALLICON);
break;
case ID_VIEWPOPUP_LIST:
onViewStyle(LVS_LIST);
break;
case ID_VIEWPOPUP_DETAILS:
onViewStyle(LVS_REPORT);
default:
break;
}
return 0L;
}
void CShellView::onViewStyle(UINT uiStyle)
{
DWORD dwStyle = GetWindowLong(m_hWndListCtrl, GWL_STYLE);
dwStyle &= ~LVS_TYPEMASK;
switch (uiStyle)
{
case LVS_ICON:
m_fsFolderSettings.ViewMode = FVM_ICON;
dwStyle |= LVS_ICON;
break;
case LVS_SMALLICON:
m_fsFolderSettings.ViewMode = FVM_SMALLICON;
dwStyle |= LVS_SMALLICON;
break;
case LVS_LIST:
m_fsFolderSettings.ViewMode = FVM_LIST;
dwStyle |= LVS_LIST;
break;
case LVS_REPORT:
m_fsFolderSettings.ViewMode = FVM_DETAILS;
dwStyle |= LVS_REPORT;
break;
}
SetWindowLong(m_hWndListCtrl, GWL_STYLE, dwStyle);
}
LRESULT CShellView::onSetFocus(HWND hWndOld)
{
if (m_pShellBrowser)
{
m_pShellBrowser->OnViewWindowActive((IShellView *) this);
onActivate(SVUIA_ACTIVATE_FOCUS);
}
return 0L;
}
LRESULT CShellView::onActivate(UINT uiState)
{
if (m_uiState == uiState)
{
return 0L;
}
// ondeactivate
if(m_uiState != SVUIA_DEACTIVATE)
{
if(m_hMenu)
{
m_pShellBrowser->SetMenuSB(NULL, NULL, NULL);
m_pShellBrowser->RemoveMenusSB(m_hMenu);
::DestroyMenu(m_hMenu);
m_hMenu = NULL;
}
m_uiState = SVUIA_DEACTIVATE;
}
if (uiState != SVUIA_DEACTIVATE)
{
mergeMenus();
}
updateToolbar();
return 0L;
}
void CShellView::mergeMenus()
{
// Notes to Callers
// The shell view object must call this method before calling the
// IShellBrowser::InsertMenusSB method. This method will insert a
// different set of menu items depending on whether the view has
// the focus.
if (m_hMenu)
{
::DestroyMenu(m_hMenu);
m_hMenu = NULL;
}
m_hMenu = ::CreateMenu();
if (m_hMenu)
{
OLEMENUGROUPWIDTHS omgw = { 0 };
HRESULT hr = m_pShellBrowser->InsertMenusSB(m_hMenu, &omgw);
// fortunately FCIDM_SHVIEWFIRST is zero.. however handle it...
mergeFileMenu();
mergeEditMenu();
mergeViewMenu();
hr = m_pShellBrowser->SetMenuSB(m_hMenu, NULL, m_hWnd);
}
}
void CShellView::mergeToolBars()
{
TBADDBITMAP tbab;
LRESULT lOffsetFile;
LRESULT lOffsetView;
LRESULT lOffsetOther;
HRESULT hr;
hr = m_pShellBrowser->SetToolbarItems(NULL, 0, FCT_MERGE);
// Add the file toolbar
tbab.hInst = HINST_COMMCTRL;
tbab.nID = (int)IDB_STD_SMALL_COLOR;
hr = m_pShellBrowser->SendControlMsg(FCW_TOOLBAR, TB_ADDBITMAP, 0, (LPARAM)&tbab, &lOffsetFile);
tbab.hInst = HINST_COMMCTRL;
tbab.nID = (int)IDB_VIEW_SMALL_COLOR;
hr = m_pShellBrowser->SendControlMsg(FCW_TOOLBAR, TB_ADDBITMAP, 0, (LPARAM)&tbab, &lOffsetView);
tbab.hInst = g_hInstance;
tbab.nID = (int) IDB_BITMAP_NEWFOLDER;
hr = m_pShellBrowser->SendControlMsg(FCW_TOOLBAR, TB_ADDBITMAP, 1, (LPARAM)&tbab, &lOffsetOther);
for (int nButtons =0; g_tbInfo[nButtons].tb.iBitmap != -1; nButtons++)
{
}
LPTBBUTTON ptbb = (LPTBBUTTON)GlobalAlloc(GPTR, sizeof(TBBUTTON) * (nButtons));
if(ptbb)
{
for(int j = 0; g_tbInfo[j].tb.idCommand != -1; j++)
{
if (g_tbInfo[j].nType == STD)
{
(ptbb + j)->iBitmap = lOffsetFile + g_tbInfo[j].tb.iBitmap;
}
else if (g_tbInfo[j].nType == VIEW)
{
(ptbb + j)->iBitmap = lOffsetView + g_tbInfo[j].tb.iBitmap;
}
else if (g_tbInfo[j].nType == INTHIS_DLL)
{
(ptbb + j)->iBitmap = lOffsetOther + g_tbInfo[j].tb.iBitmap;
}
(ptbb + j)->idCommand = g_tbInfo[j].tb.idCommand;
(ptbb + j)->fsState = g_tbInfo[j].tb.fsState;
(ptbb + j)->fsStyle = g_tbInfo[j].tb.fsStyle;
(ptbb + j)->dwData = g_tbInfo[j].tb.dwData;
(ptbb + j)->iString = g_tbInfo[j].tb.iString;
}
}
m_pShellBrowser->SetToolbarItems(ptbb, nButtons, FCT_MERGE);
GlobalFree((HGLOBAL)ptbb);
}
void CShellView::updateToolbar()
{
LRESULT lResult;
UINT uiCmd;
//enable/disable/check the toolbar items here
switch(m_fsFolderSettings.ViewMode)
{
case FVM_ICON:
uiCmd = ID_VIEWPOPUP_LARGEICONS;
break;
case FVM_SMALLICON:
uiCmd = ID_VIEWPOPUP_SMALLICONS;
break;
case FVM_LIST:
uiCmd = ID_VIEWPOPUP_LIST;
break;
case FVM_DETAILS:
default:
uiCmd = ID_VIEWPOPUP_DETAILS;
break;
}
m_pShellBrowser->SendControlMsg( FCW_TOOLBAR,
TB_CHECKBUTTON,
uiCmd,
MAKELPARAM(TRUE, 0),
&lResult);
}
void CShellView::mergeFileMenu()
{
MENUITEMINFO mii = { 0 };
mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_SUBMENU;
if (GetMenuItemInfo(m_hMenu, FCIDM_MENU_FILE, FALSE, &mii))
{
HMENU hMenu = mii.hSubMenu;
InsertMenu(hMenu, 0, MF_BYPOSITION|MF_SEPARATOR, NULL, NULL);
HMENU hMenuTemp = ::LoadMenu(g_hInstance, MAKEINTRESOURCE(IDR_MENU_FILEPOPUP));
HMENU hPopup = ::GetSubMenu(hMenuTemp, 0);
InsertMenu(hMenu, 0, MF_POPUP|MF_BYPOSITION, (UINT) hPopup, TEXT("&New"));
}
}
void CShellView::mergeEditMenu()
{
MENUITEMINFO mii = { 0 };
mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_SUBMENU;
if (GetMenuItemInfo(m_hMenu, FCIDM_MENU_EDIT, FALSE, &mii))
{
HMENU hMenu = mii.hSubMenu;
InsertMenu(hMenu, 0, MF_BYPOSITION|MF_SEPARATOR, NULL, NULL);
HMENU hMenuTemp = ::LoadMenu(g_hInstance, MAKEINTRESOURCE(IDR_MENU_EDITPOPUP));
HMENU hEditMenu = ::GetSubMenu(hMenuTemp, 0);
if (hEditMenu == NULL)
{
return;
}
// iterate thro' the hEditMenu and add them to hMenu
int nMenuItems = ::GetMenuItemCount(hEditMenu);
if (nMenuItems == -1)
{
return;
}
int i = 0;
while (i < nMenuItems)
{
MENUITEMINFO mii = { 0 };
mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_CHECKMARKS|MIIM_DATA|MIIM_ID|MIIM_STATE|MIIM_TYPE;//all
if (GetMenuItemInfo(hEditMenu, i, TRUE, &mii))
{
TCHAR szMenuText[MAX_PATH];
GetMenuString(hEditMenu, i, szMenuText, MAX_PATH, MF_BYPOSITION);
MENUITEMINFO miiInsert = { 0 };
miiInsert.cbSize = sizeof(MENUITEMINFO);
miiInsert.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
miiInsert.fType = mii.fType;
miiInsert.fState = MFS_ENABLED;
miiInsert.dwTypeData= szMenuText;
miiInsert.wID = mii.wID;
InsertMenuItem(hMenu, i, FALSE, &miiInsert);
}
i++;
}
}
}
void CShellView::mergeViewMenu()
{
MENUITEMINFO mii = { 0 };
mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_SUBMENU;
if (GetMenuItemInfo(m_hMenu, FCIDM_MENU_VIEW, FALSE, &mii))
{
HMENU hMenu = mii.hSubMenu;
InsertMenu(hMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, MF_BYCOMMAND|MF_SEPARATOR, NULL, NULL);
HMENU hMenuTemp = ::LoadMenu(g_hInstance, MAKEINTRESOURCE(IDR_MENU_VIEWPOPUP));
HMENU hViewMenu = ::GetSubMenu(hMenuTemp, 0);
if (hViewMenu == NULL)
{
return;
}
// iterate thro' the hEditMenu and add them to hMenu
int nMenuItems = ::GetMenuItemCount(hViewMenu);
if (nMenuItems == -1)
{
return;
}
int i = 0;
while (i < nMenuItems)
{
MENUITEMINFO mii = { 0 };
mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_CHECKMARKS|MIIM_DATA|MIIM_ID|MIIM_STATE|MIIM_TYPE;//all
if (GetMenuItemInfo(hViewMenu, i, TRUE, &mii))
{
TCHAR szMenuText[MAX_PATH];
GetMenuString(hViewMenu, i, szMenuText, MAX_PATH, MF_BYPOSITION);
MENUITEMINFO miiInsert = { 0 };
miiInsert.cbSize = sizeof(MENUITEMINFO);
miiInsert.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
miiInsert.fType = mii.fType;
miiInsert.fState = MFS_ENABLED;
miiInsert.dwTypeData= szMenuText;
miiInsert.wID = mii.wID;
InsertMenuItem(hMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, &miiInsert);
}
i++;
}
}
}
long CShellView::onContextMenu(int x, int y, BOOL bDefault)
{
UINT uiSel = 0;
UINT uiCount = 0;
if(m_uiState != SVUIA_ACTIVATE_NOFOCUS)
{
uiSel= ListView_GetSelectedCount(m_hWndListCtrl);
}
LPITEMIDLIST *aSelPidls = NULL;
aSelPidls = (LPITEMIDLIST*) m_pMalloc->Alloc((uiSel+1) * sizeof(LPITEMIDLIST));
if (uiSel)
{
uiCount = uiSel;
int iItem = 0;
int nItem = -1;
LONGLONG llTotal = 0;
while ((nItem = ListView_GetNextItem(m_hWndListCtrl, nItem, LVNI_SELECTED)) != -1)
{
LVITEM lvi = { 0 };
lvi.mask = LVIF_PARAM;
lvi.iItem = nItem;
ListView_GetItem(m_hWndListCtrl, &lvi);
aSelPidls[iItem] = m_pPidlMgr->Concatenate(m_pSF->m_pidl, (LPITEMIDLIST)lvi.lParam);
iItem++;
}
}
else
{
aSelPidls[0] = m_pidl;
uiCount = 1;
}
LPCONTEXTMENU pCtxMenu = NULL;
m_pSF->GetUIObjectOf(m_hWndParent,
uiCount,
(LPCITEMIDLIST*)aSelPidls,
IID_IContextMenu,
NULL,
(LPVOID*)&pCtxMenu);
if (pCtxMenu)
{
HMENU hMenu = CreatePopupMenu();
if (hMenu && SUCCEEDED(pCtxMenu->QueryContextMenu(hMenu,
0,
0,
0x7FFF,
0)))
{
if (bDefault)
{
// TODO : search for default menu item from hMenu
}
else // if not default
{
UINT uiCmd = TrackPopupMenu(hMenu,
TPM_LEFTALIGN | TPM_RETURNCMD,
x,
y,
0,
m_hWnd,
NULL);
if(uiCmd > 0)
{
// TODO : handle commands that need to be handled by
// the view itself
switch(uiCmd)
{
default:
{
CMINVOKECOMMANDINFO cmi = { 0 };
cmi.cbSize = sizeof(CMINVOKECOMMANDINFO);
cmi.hwnd = m_hWnd;
cmi.lpVerb = (LPCSTR)MAKEINTRESOURCE(uiCmd);
pCtxMenu->InvokeCommand(&cmi);
}
break;
}
}
} // if not default
DestroyMenu(hMenu);
} // if able to create a menu and get menu items from the Contextmenu class
pCtxMenu->Release();
} // if able to create a context menu object
m_pMalloc->Free(aSelPidls);
return 0;
}
//EOF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -