📄 ieshellcombobox.cpp
字号:
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 + -