⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shellview.cpp

📁 Drive.dll is a dll that creates a drive to system directoryor drive similar to existing drives such
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -