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

📄 ieshellcombobox.cpp

📁 vc座的资源管理器源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					Item.SetText(sDisplayName);
					Item.SetImage(nImage);
					Item.SetSelImage(nSelImage);
					LPTVITEMDATA lptvid = (LPTVITEMDATA)m_pMalloc->Alloc(sizeof(TVITEMDATA));
					lptvid->lpi = GetShellPidl().CopyItemID(pidlAbs);
					lptvid->lpifq = pidlAbs;
					LPTVITEMDATA dt_lptvid = (LPTVITEMDATA)pItem->GetItemData();
					lptvid->lpsfParent = dt_lptvid->lpsfParent;
					lptvid->lpsfParent->AddRef();
					Item.SetItemData((DWORD)lptvid);
					Item.SetIndent(i);
					m_vecItemData.push_back(lptvid);
					nItem = AddItem(&Item);
				}
			}
			if (nSelItem == -1)
				nSelItem = nItem;
			if (sPath.Find(_T("::")) == 0)
				GetShellPidl().GetDisplayName(pidlAbsSel,sPath);
			else if(sPath.IsEmpty())
				sPath = pItem->GetText();
		}			
		if (pidlCompare)
		{
			m_pMalloc->Free(pidlCompare);
			pidlCompare = NULL;
		}
		n++;
	}
	if (nSelItem >= 0)
		GetComboBoxCtrl()->SetCurSel(nSelItem);
	GetEditCtrl()->SetWindowText(sPath);
	m_bInternet = false;
}

int CIEShellComboBox::AddItem(const CShCMSort *pItem)
{
	// add the node to the combo box
	COMBOBOXEXITEM item;
	ZeroMemory(&item,sizeof(item));
	item.mask |= (CBEIF_IMAGE | CBEIF_INDENT | CBEIF_LPARAM | CBEIF_TEXT | CBEIF_SELECTEDIMAGE);	
	item.iItem = -1;
	item.pszText = (LPTSTR)(LPCTSTR)pItem->GetText();
	item.cchTextMax = lstrlen(item.pszText);
	item.iImage = pItem->GetImage();
	item.iSelectedImage = pItem->GetSelImage();
	item.iOverlay = pItem->GetOverlayImage();
	item.iIndent = pItem->GetIndent();
	item.lParam = (LPARAM)pItem->GetItemData();
	return InsertItem(&item);
}

void CIEShellComboBox::AddItems(vecCMSort &vItems,IShellFolder* pFolder,LPITEMIDLIST pidlAbs,int nIndent)
{
	IEnumIDList* pItems = NULL;
	LPITEMIDLIST pidlNext = NULL;
	LPITEMIDLIST pidlCopy = NULL;
	LPTSTR pszFilePath = NULL;
	STRRET StrRetFilePath;
	// Enumerate all object in the given folder
	HRESULT hr = pFolder->EnumObjects(NULL, SHCONTF_FOLDERS|SHCONTF_NONFOLDERS, &pItems);
	SHFILEINFO fileinfo;
	while (NOERROR == hr)
	{
		hr = pItems->Next(1, &pidlNext, NULL);
		if (hr == S_FALSE || pidlNext == NULL || pidlNext == pidlCopy)
			break;
		pidlCopy = pidlNext;
		pFolder->GetDisplayNameOf(pidlNext,SHGDN_INFOLDER,&StrRetFilePath);
		GetShellPidl().StrRetToStr(StrRetFilePath, &pszFilePath, pidlNext);
		ZeroMemory(&fileinfo,sizeof(fileinfo));
		fileinfo.dwAttributes=SFGAO_HASSUBFOLDER | SFGAO_FOLDER;
		hr = pFolder->GetAttributesOf(1,(const struct _ITEMIDLIST **)&pidlCopy,&fileinfo.dwAttributes);
		if (SUCCEEDED(hr))
			lstrcpy(fileinfo.szDisplayName,pszFilePath);
		// Create a submenu if this item is a folder
		if (fileinfo.dwAttributes & (SFGAO_HASSUBFOLDER | SFGAO_FOLDER))
		{
			if (fileinfo.dwAttributes & SFGAO_FOLDER)
			{			
				AddFolder(vItems,fileinfo,pidlAbs,pidlNext,pFolder,nIndent);
			}
		}
		if (pszFilePath)
			m_pMalloc->Free(pszFilePath);
	}
	if (pidlNext)
		m_pMalloc->Free(pidlNext);
	if (pItems)
		pItems->Release();
}

void CIEShellComboBox::AddFolder(vecCMSort &vItems,const SHFILEINFO &FileInfo,LPITEMIDLIST pidlAbs,LPITEMIDLIST pidl,LPSHELLFOLDER pFolder,int nIndent)
{
	ASSERT(m_pMalloc);
	// allocate new itemdata
	LPTVITEMDATA lptvid = (LPTVITEMDATA)m_pMalloc->Alloc(sizeof(TVITEMDATA));
	if (lptvid == NULL)
		return;
	ZeroMemory(lptvid,sizeof(TVITEMDATA));
	// create new fully qualified pidl
	lptvid->lpifq = m_ShellPidl.ConcatPidl(pidlAbs,pidl);
	// Now make a copy of the last item in the pidl.
	lptvid->lpi = pidl;
	int nImage=0;
	int nSelImage=0;
	// get icons for new fq pidl
	m_ShellPidl.GetNormalAndSelectedIcons(lptvid->lpifq, nImage, nSelImage);
	// save folder for later use(when node is expanded)
	lptvid->lpsfParent = pFolder; // pointer to parent folder
	// keep hold of it(will be released in clean up)
	lptvid->lpsfParent->AddRef();
	CShCMSort *pSMI = new CShCMSort;
	pSMI->SetPidl(pidl);
	pSMI->SetText(FileInfo.szDisplayName);
	pSMI->SetImage(nImage);
	pSMI->SetSelImage(nSelImage);
	pSMI->SetItemData((DWORD)lptvid);
	pSMI->SetIndent(nIndent);
	STL_ADD_ITEM(vItems,pSMI);
}

void CIEShellComboBox::SetShellImageList()
{
	// TODO: Add your specialized creation code here
	HKEY hKey;
	if (RegOpenKeyEx(HKEY_CLASSES_ROOT,strIEKey,0,KEY_READ,&hKey) == ERROR_SUCCESS)
	{
		BYTE szValueName[_MAX_PATH];
		DWORD dwType=0;
		DWORD dwSizeData = sizeof(szValueName)-1;
		RegQueryValueEx(hKey,NULL,0,&dwType,szValueName,&dwSizeData);
		CString sPath((LPCTSTR)szValueName);
		if (sPath.Left(1) == _T('"'))
			sPath = sPath.Right(sPath.GetLength()-1);
		if (sPath.Right(1) == _T('"'))
			sPath = sPath.Left(sPath.GetLength()-1);
		if (sPath.Find(_T("%")) != -1)
		{
			TCHAR szPath[MAX_PATH];
			if (ExpandEnvironmentStrings(sPath,szPath,sizeof(szPath)) > 0)
				sPath = szPath;
		}
		if (sPath.Find(_T("~")) != -1)
		{
			TCHAR szPath[MAX_PATH];
			if (GetLongPathName(sPath,szPath,sizeof(szPath)) > 0)
				sPath = szPath;
		}
		ExtractIconEx(sPath, 1, NULL, &m_hIcon, 1);		
		// create the small icon image list	
		UINT cxSmallIcon = ::GetSystemMetrics(SM_CXSMICON);
		UINT cySmallIcon = ::GetSystemMetrics(SM_CYSMICON);
		if (m_ImageList.GetSafeHandle() != NULL)
			m_ImageList.DeleteImageList();	
		m_ImageList.Create(cxSmallIcon,
							cySmallIcon,
							ILC_MASK | ILC_COLOR16,	
							1,
							1);	
		if (m_hIcon)
			m_ImageList.Add(m_hIcon);
	}
    SHFILEINFO    sfi;
    m_hImageList = (HIMAGELIST)SHGetFileInfo((LPCTSTR)_T("C:\\"), 
                                           0,
                                           &sfi, 
                                           sizeof(SHFILEINFO), 
                                           SHGFI_SYSICONINDEX | SHGFI_SMALLICON);

    // Attach ImageList to the window
    if (m_hImageList)
	    ::SendMessage(m_hWnd, CBEM_SETIMAGELIST, 0, (LPARAM)m_hImageList);
}

void CIEShellComboBox::SelectionChanged(bool bEnter)
{
	LPITEMIDLIST pidlSel = GetSelectedPidl();
	GetEditCtrl()->GetWindowText(m_sText);
	UINT mess=WM_APP_CB_IE_SEL_CHANGE;
	if (bEnter)
		mess=WM_APP_CB_IE_HIT_ENTER;
	if (m_hTreeWnd)
	{
		if (mess == WM_APP_CB_IE_SEL_CHANGE)
			::SendMessage(m_hTreeWnd,mess,(WPARAM)pidlSel,(LPARAM)(LPCTSTR)m_sText);
		else
			::SendMessage(m_hTreeWnd,mess,(WPARAM)m_bInternet,(LPARAM)(LPCTSTR)m_sText);
	}
}

int CIEShellComboBox::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CComboBoxEx::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	SetShellImageList();
	
	if (m_cbEdit.GetSafeHwnd() == NULL)
	{
		m_cbEdit.SubclassWindow(GetEditCtrl()->GetSafeHwnd());
		m_cbEdit.SetTreeWnd(m_hTreeWnd);	
	}
	return 0;
}

void CIEShellComboBox::OnDestroy() 
{
	SetImageList(NULL);

	CComboBoxEx::OnDestroy();
	
	// TODO: Add your message handler code here
	
}

LRESULT CIEShellComboBox::OnCBIEPopulate(WPARAM wParam,LPARAM lParam)
{
	Populate((LPITEMIDLIST)wParam);
	return 1L;
}

void CIEShellComboBox::OnDropDown()
{
}

void CIEShellComboBox::OnSelChange()
{
	SelectionChanged(false);
}

void CIEShellComboBox::OnKillFocus(CWnd *pNewWnd)
{
	CComboBoxEx::OnKillFocus(pNewWnd);
	SetEditSel(-1,0);
}

void CIEShellComboBox::OnSetFocus(CWnd *pWnd)
{
	CComboBoxEx::OnSetFocus(pWnd);
	SetEditSel(-1,-1);
}

BOOL CIEShellComboBoxEdit::PreTranslateMessage(MSG* pMsg)
{
	// TODO: Add your specialized code here and/or call the base class
	if (pMsg->message == WM_KEYDOWN)
	{
		if (pMsg->wParam == VK_RETURN)
		{
			GetParent()->GetParent()->PostMessage(WM_APP_CB_IE_HIT_ENTER);
			return TRUE;
		}
	}
	return CEdit::PreTranslateMessage(pMsg);
}

void CIEShellComboBox::PreSubclassWindow()
{
	// TODO: Add your specialized code here and/or call the base class
	CComboBoxEx::PreSubclassWindow();

	if (m_cbEdit.GetSafeHwnd() == NULL)
	{
		m_cbEdit.SubclassWindow(GetEditCtrl()->GetSafeHwnd());
		m_cbEdit.SetTreeWnd(m_hTreeWnd);	
	}
}

LRESULT CIEShellComboBox::OnAppCbIeHitEnter(WPARAM wParam, LPARAM lParam)
{
	SelectionChanged(true);
	return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -