/************************************************************************* * FileMenu_DrawItem [SHELL32.105] */ LRESULT WINAPI FileMenu_DrawItem( HWND hWnd, LPDRAWITEMSTRUCT lpdis) { LPFMITEM pMyItem = (LPFMITEM)(lpdis->itemData); COLORREF clrPrevText, clrPrevBkgnd; int xi,yi,xt,yt; HIMAGELIST hImageList; RECT TextRect; LPFMINFO menuinfo; TRACE("%p %p %s\n", hWnd, lpdis, debugstr_w(pMyItem->szItemText)); if (lpdis->itemState & ODS_SELECTED) { clrPrevText = SetTextColor(lpdis->hDC, GetSysColor (COLOR_HIGHLIGHTTEXT)); clrPrevBkgnd = SetBkColor(lpdis->hDC, GetSysColor (COLOR_HIGHLIGHT)); } else { clrPrevText = SetTextColor(lpdis->hDC, GetSysColor (COLOR_MENUTEXT)); clrPrevBkgnd = SetBkColor(lpdis->hDC, GetSysColor (COLOR_MENU)); } CopyRect(&TextRect, &(lpdis->rcItem)); /* add the menubitmap */ menuinfo = FM_GetMenuInfo(pMyItem->hMenu); if (menuinfo->nBorderWidth) TextRect.left += menuinfo->nBorderWidth; TextRect.left += FM_LEFTBORDER; xi = TextRect.left + FM_SPACE1; yi = TextRect.top + FM_Y_SPACE/2; TextRect.bottom -= FM_Y_SPACE/2; xt = xi + FM_ICON_SIZE + FM_SPACE2; yt = yi; ExtTextOutW (lpdis->hDC, xt , yt, ETO_OPAQUE, &TextRect, pMyItem->szItemText, pMyItem->cchItemText, NULL); Shell_GetImageLists(0, &hImageList); ImageList_Draw(hImageList, pMyItem->iIconIndex, lpdis->hDC, xi, yi, ILD_NORMAL); TRACE("-- 0x%04x 0x%04x 0x%04x 0x%04x\n", TextRect.left, TextRect.top, TextRect.right, TextRect.bottom); SetTextColor(lpdis->hDC, clrPrevText); SetBkColor(lpdis->hDC, clrPrevBkgnd); return TRUE; }
void Explorerplusplus::CreateAddressBar(void) { m_hAddressBar = CreateComboBox(m_hMainRebar,WS_CHILD|WS_VISIBLE|WS_TABSTOP| CBS_DROPDOWN|CBS_AUTOHSCROLL|WS_CLIPSIBLINGS|WS_CLIPCHILDREN); HIMAGELIST SmallIcons; Shell_GetImageLists(NULL,&SmallIcons); SendMessage(m_hAddressBar,CBEM_SETIMAGELIST,0,reinterpret_cast<LPARAM>(SmallIcons)); HWND hEdit = reinterpret_cast<HWND>(SendMessage(m_hAddressBar,CBEM_GETEDITCONTROL,0,0)); SetWindowSubclass(hEdit,EditSubclassStub,0,reinterpret_cast<DWORD_PTR>(this)); /* Turn on auto complete for the edit control within the combobox. This will let the os complete paths as they are typed. */ SHAutoComplete(hEdit,SHACF_FILESYSTEM|SHACF_AUTOSUGGEST_FORCE_ON); }
HWND CreateTreeView(HWND hParent, DWORD dwStyle) { HWND hTreeView = CreateWindow(WC_TREEVIEW, EMPTY_STRING, dwStyle, 0, 0, 0, 0, hParent, NULL, GetModuleHandle(0), NULL); if(hTreeView != NULL) { /* Retrieve the small version of the system image list. */ HIMAGELIST SmallIcons; BOOL bRet = Shell_GetImageLists(NULL, &SmallIcons); if(bRet) { TreeView_SetImageList(hTreeView, SmallIcons, TVSIL_NORMAL); } } return hTreeView; }
/************************************************************************** * IExtractIconW::Extract */ static HRESULT WINAPI IExtractIconW_fnExtract(IExtractIconW * iface, LPCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize) { IExtractIconWImpl *This = impl_from_IExtractIconW(iface); int index; HIMAGELIST big_icons, small_icons; FIXME("(%p) (file=%s index=%d %p %p size=%08x) semi-stub\n", This, debugstr_w(pszFile), (signed)nIconIndex, phiconLarge, phiconSmall, nIconSize); index = SIC_GetIconIndex(pszFile, nIconIndex, 0); Shell_GetImageLists( &big_icons, &small_icons ); if (phiconLarge) *phiconLarge = ImageList_GetIcon(big_icons, index, ILD_TRANSPARENT); if (phiconSmall) *phiconSmall = ImageList_GetIcon(small_icons, index, ILD_TRANSPARENT); return S_OK; }
void CGh0stView::OnInitialUpdate() { CListView::OnInitialUpdate(); ////////////////////////////////////////////////////////////////////////// NONCLIENTMETRICS ncm; memset(&ncm, 0, sizeof(NONCLIENTMETRICS)); ncm.cbSize = sizeof(NONCLIENTMETRICS); VERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0)); ncm.lfMessageFont.lfWeight = 500; m_headerCtrl.m_HeaderFont.CreateFontIndirect(&ncm.lfMessageFont); SetFont(&(m_headerCtrl.m_HeaderFont)); ////////////////////////////////////////////////////////////////////////// m_pListCtrl = &GetListCtrl(); HIMAGELIST hImageListSmall = NULL; Shell_GetImageLists(NULL, &hImageListSmall); ListView_SetImageList(m_pListCtrl->m_hWnd, hImageListSmall, LVSIL_SMALL); m_pListCtrl->SetExtendedStyle(LVS_EX_FLATSB | LVS_EX_FULLROWSELECT); for (int i = 0; i < g_Column_Count; i++) { m_pListCtrl->InsertColumn(i, g_Column_Data[i].title); m_pListCtrl->SetColumnWidth(i, g_Column_Data[i].nWidth); g_Column_Width += g_Column_Data[i].nWidth; // 总宽度 } // 设置数据段 SetColumnNumeric(0); SetColumnNumeric(6); PostMessage(WM_MYINITIALUPDATE); // TODO: You may populate your ListView with items by directly accessing // its list control through a call to GetListCtrl(). }
void DynamicDisplayItem::DrawIcon(HDC theDC, bool theSelected, const RECT & theContainer, const Theme * theTheme) { gDisplayItemCS.Enter(); int aIconSite = theTheme->GetMetric(WIDTH_ICONSITE); int aLeftIndent = theTheme->GetMetric(WIDTH_INDENT_LEFT); RECT aRect; aRect.left = theContainer.left + aLeftIndent; aRect.top = theContainer.top + (theContainer.bottom - theContainer.top - aIconSite) / 2; aRect.right = aRect.left + aIconSite; aRect.bottom = aRect.top + aIconSite; DWORD aPrevLayout = GetLayout(theDC); DWORD aNewLayout = aPrevLayout | LAYOUT_BITMAPORIENTATIONPRESERVED; SetLayout(theDC, aNewLayout); int aDrawItemFlags = theSelected ? DIIF_NORMAL : DIIF_SELECTED; if (myIconData.IsIconDimmed) aDrawItemFlags |= DIIF_DIMMED; theTheme->DrawItemIcon(theDC, aDrawItemFlags, aRect, myIconData.ImageList, myIconData.IconIndex); if (myIconData.OverlayIndex != -1) { HIMAGELIST aSmall, aLarge; BOOL aRet = Shell_GetImageLists(&aLarge, &aSmall); if (aRet && aSmall != 0) ImageList_Draw(aSmall, myIconData.OverlayIndex, theDC, aRect.left, aRect.top, ILD_TRANSPARENT); } SetLayout(theDC, aPrevLayout); gDisplayItemCS.Leave(); }
int GetSystemImageLists(HMODULE * hShell32, HIMAGELIST * phLarge, HIMAGELIST * phSmall) { SHGIL_PROC Shell_GetImageLists; FII_PROC FileIconInit; if (phLarge == 0 || phSmall == 0) return FALSE; if (*hShell32 == NULL) *hShell32 = LoadLibrary("shell32.dll"); if (*hShell32 == NULL) return FALSE; Shell_GetImageLists = (SHGIL_PROC) GetProcAddress(*hShell32, (LPCSTR) 71); FileIconInit = (FII_PROC) GetProcAddress(*hShell32, (LPCSTR) 660); // FreeIconList@8 = ord 227 if (Shell_GetImageLists == 0) { FreeLibrary(*hShell32); *hShell32 = NULL; return FALSE; }; // Initialize imagelist for this process - function not present on win95/98 if (FileIconInit != 0) FileIconInit(TRUE); // Get handles to the large+small system image lists! Shell_GetImageLists(phLarge, phSmall); return TRUE; }
/************************************************************************* * SHGetFileInfoW [SHELL32.@] * */ DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path,DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags ) { WCHAR szLocation[MAX_PATH], szFullPath[MAX_PATH]; int iIndex; DWORD_PTR ret = TRUE; DWORD dwAttributes = 0; IShellFolder * psfParent = NULL; IExtractIconW * pei = NULL; LPITEMIDLIST pidlLast = NULL, pidl = NULL; HRESULT hr = S_OK; BOOL IconNotYetLoaded=TRUE; UINT uGilFlags = 0; HIMAGELIST big_icons, small_icons; TRACE("%s fattr=0x%x sfi=%p(attr=0x%08x) size=0x%x flags=0x%x\n", (flags & SHGFI_PIDL)? "pidl" : debugstr_w(path), dwFileAttributes, psfi, psfi->dwAttributes, sizeofpsfi, flags); if (!path) return FALSE; /* windows initializes these values regardless of the flags */ if (psfi != NULL) { psfi->szDisplayName[0] = '\0'; psfi->szTypeName[0] = '\0'; psfi->iIcon = 0; } if (!(flags & SHGFI_PIDL)) { /* SHGetFileInfo should work with absolute and relative paths */ if (PathIsRelativeW(path)) { GetCurrentDirectoryW(MAX_PATH, szLocation); PathCombineW(szFullPath, szLocation, path); } else { lstrcpynW(szFullPath, path, MAX_PATH); } } if (flags & SHGFI_EXETYPE) { if (flags != SHGFI_EXETYPE) return 0; return shgfi_get_exe_type(szFullPath); } /* * psfi is NULL normally to query EXE type. If it is NULL, none of the * below makes sense anyway. Windows allows this and just returns FALSE */ if (psfi == NULL) return FALSE; /* * translate the path into a pidl only when SHGFI_USEFILEATTRIBUTES * is not specified. * The pidl functions fail on not existing file names */ if (flags & SHGFI_PIDL) { pidl = ILClone((LPCITEMIDLIST)path); } else if (!(flags & SHGFI_USEFILEATTRIBUTES)) { hr = SHILCreateFromPathW(szFullPath, &pidl, &dwAttributes); } if ((flags & SHGFI_PIDL) || !(flags & SHGFI_USEFILEATTRIBUTES)) { /* get the parent shellfolder */ if (pidl) { hr = SHBindToParent( pidl, &IID_IShellFolder, (LPVOID*)&psfParent, (LPCITEMIDLIST*)&pidlLast ); if (SUCCEEDED(hr)) pidlLast = ILClone(pidlLast); ILFree(pidl); } else { ERR("pidl is null!\n"); return FALSE; } } /* get the attributes of the child */ if (SUCCEEDED(hr) && (flags & SHGFI_ATTRIBUTES)) { if (!(flags & SHGFI_ATTR_SPECIFIED)) { psfi->dwAttributes = 0xffffffff; } if (psfParent) IShellFolder_GetAttributesOf( psfParent, 1, (LPCITEMIDLIST*)&pidlLast, &(psfi->dwAttributes) ); } /* get the displayname */ if (SUCCEEDED(hr) && (flags & SHGFI_DISPLAYNAME)) { if (flags & SHGFI_USEFILEATTRIBUTES && !(flags & SHGFI_PIDL)) { lstrcpyW (psfi->szDisplayName, PathFindFileNameW(szFullPath)); } else { STRRET str; hr = IShellFolder_GetDisplayNameOf( psfParent, pidlLast, SHGDN_INFOLDER, &str); StrRetToStrNW (psfi->szDisplayName, MAX_PATH, &str, pidlLast); } } /* get the type name */ if (SUCCEEDED(hr) && (flags & SHGFI_TYPENAME)) { static const WCHAR szFile[] = { 'F','i','l','e',0 }; static const WCHAR szDashFile[] = { '-','f','i','l','e',0 }; if (!(flags & SHGFI_USEFILEATTRIBUTES) || (flags & SHGFI_PIDL)) { char ftype[80]; _ILGetFileType(pidlLast, ftype, 80); MultiByteToWideChar(CP_ACP, 0, ftype, -1, psfi->szTypeName, 80 ); } else { if (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) strcatW (psfi->szTypeName, szFile); else { WCHAR sTemp[64]; lstrcpyW(sTemp,PathFindExtensionW(szFullPath)); if (!( HCR_MapTypeToValueW(sTemp, sTemp, 64, TRUE) && HCR_MapTypeToValueW(sTemp, psfi->szTypeName, 80, FALSE ))) { lstrcpynW (psfi->szTypeName, sTemp, 64); strcatW (psfi->szTypeName, szDashFile); } } } } /* ### icons ###*/ Shell_GetImageLists( &big_icons, &small_icons ); if (flags & SHGFI_OPENICON) uGilFlags |= GIL_OPENICON; if (flags & SHGFI_LINKOVERLAY) uGilFlags |= GIL_FORSHORTCUT; else if ((flags&SHGFI_ADDOVERLAYS) || (flags&(SHGFI_ICON|SHGFI_SMALLICON))==SHGFI_ICON) { if (SHELL_IsShortcut(pidlLast)) uGilFlags |= GIL_FORSHORTCUT; } if (flags & SHGFI_OVERLAYINDEX) FIXME("SHGFI_OVERLAYINDEX unhandled\n"); if (flags & SHGFI_SELECTED) FIXME("set icon to selected, stub\n"); if (flags & SHGFI_SHELLICONSIZE) FIXME("set icon to shell size, stub\n"); /* get the iconlocation */ if (SUCCEEDED(hr) && (flags & SHGFI_ICONLOCATION )) { UINT uDummy,uFlags; if (flags & SHGFI_USEFILEATTRIBUTES && !(flags & SHGFI_PIDL)) { if (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { lstrcpyW(psfi->szDisplayName, swShell32Name); psfi->iIcon = -IDI_SHELL_FOLDER; } else { WCHAR* szExt; static const WCHAR p1W[] = {'%','1',0}; WCHAR sTemp [MAX_PATH]; szExt = PathFindExtensionW(szFullPath); TRACE("szExt=%s\n", debugstr_w(szExt)); if ( szExt && HCR_MapTypeToValueW(szExt, sTemp, MAX_PATH, TRUE) && HCR_GetDefaultIconW(sTemp, sTemp, MAX_PATH, &psfi->iIcon)) { if (lstrcmpW(p1W, sTemp)) strcpyW(psfi->szDisplayName, sTemp); else { /* the icon is in the file */ strcpyW(psfi->szDisplayName, szFullPath); } } else ret = FALSE; } } else { hr = IShellFolder_GetUIObjectOf(psfParent, 0, 1, (LPCITEMIDLIST*)&pidlLast, &IID_IExtractIconW, &uDummy, (LPVOID*)&pei); if (SUCCEEDED(hr)) { hr = IExtractIconW_GetIconLocation(pei, uGilFlags, szLocation, MAX_PATH, &iIndex, &uFlags); if (uFlags & GIL_NOTFILENAME) ret = FALSE; else { lstrcpyW (psfi->szDisplayName, szLocation); psfi->iIcon = iIndex; } IExtractIconW_Release(pei); } } } /* get icon index (or load icon)*/ if (SUCCEEDED(hr) && (flags & (SHGFI_ICON | SHGFI_SYSICONINDEX))) { if (flags & SHGFI_USEFILEATTRIBUTES && !(flags & SHGFI_PIDL)) { WCHAR sTemp [MAX_PATH]; WCHAR * szExt; int icon_idx=0; lstrcpynW(sTemp, szFullPath, MAX_PATH); if (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) psfi->iIcon = SIC_GetIconIndex(swShell32Name, -IDI_SHELL_FOLDER, 0); else { static const WCHAR p1W[] = {'%','1',0}; psfi->iIcon = 0; szExt = PathFindExtensionW(sTemp); if ( szExt && HCR_MapTypeToValueW(szExt, sTemp, MAX_PATH, TRUE) && HCR_GetDefaultIconW(sTemp, sTemp, MAX_PATH, &icon_idx)) { if (!lstrcmpW(p1W,sTemp)) /* icon is in the file */ strcpyW(sTemp, szFullPath); if (flags & SHGFI_SYSICONINDEX) { psfi->iIcon = SIC_GetIconIndex(sTemp,icon_idx,0); if (psfi->iIcon == -1) psfi->iIcon = 0; } else { UINT ret; if (flags & SHGFI_SMALLICON) ret = PrivateExtractIconsW( sTemp,icon_idx, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ), &psfi->hIcon, 0, 1, 0); else ret = PrivateExtractIconsW( sTemp, icon_idx, GetSystemMetrics( SM_CXICON), GetSystemMetrics( SM_CYICON), &psfi->hIcon, 0, 1, 0); if (ret != 0 && ret != (UINT)-1) { IconNotYetLoaded=FALSE; psfi->iIcon = icon_idx; } } } } } else { if (!(PidlToSicIndex(psfParent, pidlLast, !(flags & SHGFI_SMALLICON), uGilFlags, &(psfi->iIcon)))) { ret = FALSE; } } if (ret && (flags & SHGFI_SYSICONINDEX)) { if (flags & SHGFI_SMALLICON) ret = (DWORD_PTR)small_icons; else ret = (DWORD_PTR)big_icons; } } /* icon handle */ if (SUCCEEDED(hr) && (flags & SHGFI_ICON) && IconNotYetLoaded) { if (flags & SHGFI_SMALLICON) psfi->hIcon = ImageList_GetIcon( small_icons, psfi->iIcon, ILD_NORMAL); else psfi->hIcon = ImageList_GetIcon( big_icons, psfi->iIcon, ILD_NORMAL); } if (flags & ~SHGFI_KNOWN_FLAGS) FIXME("unknown flags %08x\n", flags & ~SHGFI_KNOWN_FLAGS); if (psfParent) IShellFolder_Release(psfParent); if (hr != S_OK) ret = FALSE; SHFree(pidlLast); TRACE ("icon=%p index=0x%08x attr=0x%08x name=%s type=%s ret=0x%08lx\n", psfi->hIcon, psfi->iIcon, psfi->dwAttributes, debugstr_w(psfi->szDisplayName), debugstr_w(psfi->szTypeName), ret); return ret; }
/****************************************************************************** * InitializeTreeView [Internal] * * Called from WM_INITDIALOG handler. * * PARAMS * hwndParent [I] The BrowseForFolder dialog * root [I] ITEMIDLIST of the root shell folder */ static void InitializeTreeView( browse_info *info ) { LPITEMIDLIST pidlParent, pidlChild; HIMAGELIST hImageList; HRESULT hr; IShellFolder *lpsfParent, *lpsfRoot; IEnumIDList * pEnumChildren = NULL; HTREEITEM item; DWORD flags; LPCITEMIDLIST root = info->lpBrowseInfo->pidlRoot; TRACE("%p\n", info ); Shell_GetImageLists(NULL, &hImageList); if (hImageList) SendMessageW( info->hwndTreeView, TVM_SETIMAGELIST, 0, (LPARAM)hImageList ); /* We want to call InsertTreeViewItem down the code, in order to insert * the root item of the treeview. Due to InsertTreeViewItem's signature, * we need the following to do this: * * + An ITEMIDLIST corresponding to _the parent_ of root. * + An ITEMIDLIST, which is a relative path from root's parent to root * (containing a single SHITEMID). * + An IShellFolder interface pointer of root's parent folder. * * If root is 'Desktop', then root's parent is also 'Desktop'. */ pidlParent = ILClone(root); ILRemoveLastID(pidlParent); pidlChild = ILClone(ILFindLastID(root)); if (_ILIsDesktop(pidlParent)) { hr = SHGetDesktopFolder(&lpsfParent); } else { IShellFolder *lpsfDesktop; hr = SHGetDesktopFolder(&lpsfDesktop); if (!SUCCEEDED(hr)) { WARN("SHGetDesktopFolder failed! hr = %08x\n", hr); return; } hr = IShellFolder_BindToObject(lpsfDesktop, pidlParent, 0, &IID_IShellFolder, (LPVOID*)&lpsfParent); IShellFolder_Release(lpsfDesktop); } if (!SUCCEEDED(hr)) { WARN("Could not bind to parent shell folder! hr = %08x\n", hr); return; } if (pidlChild && pidlChild->mkid.cb) { hr = IShellFolder_BindToObject(lpsfParent, pidlChild, 0, &IID_IShellFolder, (LPVOID*)&lpsfRoot); } else { lpsfRoot = lpsfParent; hr = IShellFolder_AddRef(lpsfParent); } if (!SUCCEEDED(hr)) { WARN("Could not bind to root shell folder! hr = %08x\n", hr); IShellFolder_Release(lpsfParent); return; } flags = BrowseFlagsToSHCONTF( info->lpBrowseInfo->ulFlags ); hr = IShellFolder_EnumObjects( lpsfRoot, info->hWnd, flags, &pEnumChildren ); if (!SUCCEEDED(hr)) { WARN("Could not get child iterator! hr = %08x\n", hr); IShellFolder_Release(lpsfParent); IShellFolder_Release(lpsfRoot); return; } SendMessageW( info->hwndTreeView, TVM_DELETEITEM, 0, (LPARAM)TVI_ROOT ); item = InsertTreeViewItem( info, lpsfParent, pidlChild, pidlParent, pEnumChildren, TVI_ROOT ); SendMessageW( info->hwndTreeView, TVM_EXPAND, TVE_EXPAND, (LPARAM)item ); IShellFolder_Release(lpsfRoot); IShellFolder_Release(lpsfParent); }
INT_PTR CDestroyFilesDialog::OnInitDialog() { m_hDialogIcon = LoadIcon(GetModuleHandle(0),MAKEINTRESOURCE(IDI_MAIN_SMALL)); SetClassLongPtr(m_hDlg,GCLP_HICONSM,reinterpret_cast<LONG_PTR>(m_hDialogIcon)); HWND hListView = GetDlgItem(m_hDlg,IDC_DESTROYFILES_LISTVIEW); HIMAGELIST himlSmall; Shell_GetImageLists(NULL,&himlSmall); ListView_SetImageList(hListView,himlSmall,LVSIL_SMALL); SetWindowTheme(hListView,L"Explorer",NULL); ListView_SetExtendedListViewStyleEx(hListView, LVS_EX_DOUBLEBUFFER|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES, LVS_EX_DOUBLEBUFFER|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); LVCOLUMN lvColumn; TCHAR szTemp[128]; LoadString(GetInstance(),IDS_DESTROY_FILES_COLUMN_FILE, szTemp,SIZEOF_ARRAY(szTemp)); lvColumn.mask = LVCF_TEXT; lvColumn.pszText = szTemp; ListView_InsertColumn(hListView,0,&lvColumn); LoadString(GetInstance(),IDS_DESTROY_FILES_COLUMN_TYPE, szTemp,SIZEOF_ARRAY(szTemp)); lvColumn.mask = LVCF_TEXT; lvColumn.pszText = szTemp; ListView_InsertColumn(hListView,1,&lvColumn); LoadString(GetInstance(),IDS_DESTROY_FILES_COLUMN_SIZE, szTemp,SIZEOF_ARRAY(szTemp)); lvColumn.mask = LVCF_TEXT; lvColumn.pszText = szTemp; ListView_InsertColumn(hListView,2,&lvColumn); LoadString(GetInstance(),IDS_DESTROY_FILES_COLUMN_DATE_MODIFIED, szTemp,SIZEOF_ARRAY(szTemp)); lvColumn.mask = LVCF_TEXT; lvColumn.pszText = szTemp; ListView_InsertColumn(hListView,3,&lvColumn); int iItem = 0; for each(auto strFullFilename in m_FullFilenameList) { TCHAR szFullFilename[MAX_PATH]; StringCchCopy(szFullFilename,SIZEOF_ARRAY(szFullFilename), strFullFilename.c_str()); /* TODO: Perform in background thread. */ SHFILEINFO shfi; SHGetFileInfo(szFullFilename,0,&shfi,sizeof(shfi),SHGFI_SYSICONINDEX| SHGFI_TYPENAME); LVITEM lvItem; lvItem.mask = LVIF_TEXT|LVIF_IMAGE; lvItem.iItem = iItem; lvItem.iSubItem = 0; lvItem.pszText = szFullFilename; lvItem.iImage = shfi.iIcon; ListView_InsertItem(hListView,&lvItem); ListView_SetItemText(hListView,iItem,1,shfi.szTypeName); WIN32_FILE_ATTRIBUTE_DATA wfad; GetFileAttributesEx(szFullFilename,GetFileExInfoStandard,&wfad); TCHAR szFileSize[32]; ULARGE_INTEGER lFileSize = {wfad.nFileSizeLow,wfad.nFileSizeHigh}; FormatSizeString(lFileSize,szFileSize,SIZEOF_ARRAY(szFileSize)); ListView_SetItemText(hListView,iItem,2,szFileSize); TCHAR szDateModified[32]; CreateFileTimeString(&wfad.ftLastWriteTime,szDateModified, SIZEOF_ARRAY(szDateModified),m_bShowFriendlyDates); ListView_SetItemText(hListView,iItem,3,szDateModified); iItem++; }
INT_PTR CSearchDialog::OnInitDialog() { HIMAGELIST himl = ImageList_Create(16,16,ILC_COLOR32|ILC_MASK,0,48); HBITMAP hBitmap = LoadBitmap(GetModuleHandle(0),MAKEINTRESOURCE(IDB_SHELLIMAGES)); ImageList_Add(himl,hBitmap,NULL); m_hDirectoryIcon = ImageList_GetIcon(himl,SHELLIMAGES_NEWTAB,ILD_NORMAL); m_hDialogIcon = ImageList_GetIcon(himl,SHELLIMAGES_SEARCH,ILD_NORMAL); SendMessage(GetDlgItem(m_hDlg,IDC_BUTTON_DIRECTORY),BM_SETIMAGE, IMAGE_ICON,reinterpret_cast<LPARAM>(m_hDirectoryIcon)); SetClassLongPtr(m_hDlg,GCLP_HICONSM,reinterpret_cast<LONG_PTR>(m_hDialogIcon)); DeleteObject(hBitmap); ImageList_Destroy(himl); HWND hListView = GetDlgItem(m_hDlg,IDC_LISTVIEW_SEARCHRESULTS); ListView_SetExtendedListViewStyleEx(hListView,LVS_EX_GRIDLINES|LVS_EX_DOUBLEBUFFER, LVS_EX_GRIDLINES|LVS_EX_DOUBLEBUFFER); HIMAGELIST himlSmall; Shell_GetImageLists(NULL,&himlSmall); ListView_SetImageList(hListView,himlSmall,LVSIL_SMALL); SetWindowTheme(hListView,L"Explorer",NULL); int i = 0; for each(auto ci in m_sdps->m_Columns) { TCHAR szTemp[128]; LoadString(GetInstance(),ci.uStringID,szTemp,SIZEOF_ARRAY(szTemp)); LVCOLUMN lvColumn; lvColumn.mask = LVCF_TEXT; lvColumn.pszText = szTemp; ListView_InsertColumn(hListView,i,&lvColumn); i++; } RECT rc; GetClientRect(hListView,&rc); ListView_SetColumnWidth(hListView,0,(1.0/3.0) * GetRectWidth(&rc)); ListView_SetColumnWidth(hListView,1,(1.80/3.0) * GetRectWidth(&rc)); UpdateListViewHeader(); lCheckDlgButton(m_hDlg,IDC_CHECK_ARCHIVE,m_sdps->m_bArchive); lCheckDlgButton(m_hDlg,IDC_CHECK_HIDDEN,m_sdps->m_bHidden); lCheckDlgButton(m_hDlg,IDC_CHECK_READONLY,m_sdps->m_bReadOnly); lCheckDlgButton(m_hDlg,IDC_CHECK_SYSTEM,m_sdps->m_bSystem); lCheckDlgButton(m_hDlg,IDC_CHECK_SEARCHSUBFOLDERS,m_sdps->m_bSearchSubFolders); lCheckDlgButton(m_hDlg,IDC_CHECK_CASEINSENSITIVE,m_sdps->m_bCaseInsensitive); lCheckDlgButton(m_hDlg,IDC_CHECK_USEREGULAREXPRESSIONS,m_sdps->m_bUseRegularExpressions); for each(auto strDirectory in *m_sdps->m_pSearchDirectories) { SendDlgItemMessage(m_hDlg,IDC_COMBO_DIRECTORY,CB_INSERTSTRING,static_cast<WPARAM>(-1), reinterpret_cast<LPARAM>(strDirectory.c_str())); } for each(auto strPattern in *m_sdps->m_pSearchPatterns) { SendDlgItemMessage(m_hDlg,IDC_COMBO_NAME,CB_INSERTSTRING,static_cast<WPARAM>(-1), reinterpret_cast<LPARAM>(strPattern.c_str())); } SetDlgItemText(m_hDlg,IDC_COMBO_NAME,m_sdps->m_szSearchPattern); SetDlgItemText(m_hDlg,IDC_COMBO_DIRECTORY,m_szSearchDirectory); CComboBox::CreateNew(GetDlgItem(m_hDlg,IDC_COMBO_NAME)); CComboBox::CreateNew(GetDlgItem(m_hDlg,IDC_COMBO_DIRECTORY)); if(m_sdps->m_bStateSaved) { /* These dummy values will be in use if these values have not previously been saved. */ if(m_sdps->m_iColumnWidth1 != -1 && m_sdps->m_iColumnWidth2 != -1) { ListView_SetColumnWidth(hListView,0,m_sdps->m_iColumnWidth1); ListView_SetColumnWidth(hListView,1,m_sdps->m_iColumnWidth2); } } m_sdps->RestoreDialogPosition(m_hDlg,true); SetFocus(GetDlgItem(m_hDlg,IDC_COMBO_NAME)); return FALSE; }
INT_PTR CMergeFilesDialog::OnInitDialog() { m_hDialogIcon = LoadIcon(GetModuleHandle(0),MAKEINTRESOURCE(IDI_MAIN_SMALL)); SetClassLongPtr(m_hDlg,GCLP_HICONSM,reinterpret_cast<LONG_PTR>(m_hDialogIcon)); std::wregex rxPattern; bool bAllMatchPattern = true; rxPattern.assign(_T(".*[\\.]?part[0-9]+"),std::regex_constants::icase); /* If the files all match the pattern .*[\\.]?part[0-9]+ (e.g. document.txt.part1), order them alphabetically. */ for each(auto strFullFilename in m_FullFilenameList) { if(!std::tr1::regex_match(strFullFilename,rxPattern)) { bAllMatchPattern = false; break; } } std::wstring strOutputFilename; if(bAllMatchPattern) { m_FullFilenameList.sort(CompareFilenames); /* Since the filenames all match the pattern, construct the output filename from the first files name. */ rxPattern.assign(_T("[\\.]?part[0-9]+"),std::regex_constants::icase); strOutputFilename = std::tr1::regex_replace(m_FullFilenameList.front(), rxPattern,std::wstring(_T(""))); } else { /* TODO: Improve output name. */ strOutputFilename = _T("output"); } TCHAR szOutputFile[MAX_PATH]; PathCombine(szOutputFile,m_strOutputDirectory.c_str(),strOutputFilename.c_str()); SetDlgItemText(m_hDlg,IDC_MERGE_EDIT_FILENAME,szOutputFile); HWND hListView = GetDlgItem(m_hDlg,IDC_MERGE_LISTVIEW); HIMAGELIST himlSmall; Shell_GetImageLists(NULL,&himlSmall); ListView_SetImageList(hListView,himlSmall,LVSIL_SMALL); SetWindowTheme(hListView,L"Explorer",NULL); ListView_SetExtendedListViewStyleEx(hListView, LVS_EX_DOUBLEBUFFER|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES, LVS_EX_DOUBLEBUFFER|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); LVCOLUMN lvColumn; TCHAR szTemp[32]; LoadString(GetInstance(),IDS_MERGE_FILES_COLUMN_FILE, szTemp,SIZEOF_ARRAY(szTemp)); lvColumn.mask = LVCF_TEXT; lvColumn.pszText = szTemp; ListView_InsertColumn(hListView,0,&lvColumn); LoadString(GetInstance(),IDS_MERGE_FILES_COLUMN_TYPE, szTemp,SIZEOF_ARRAY(szTemp)); lvColumn.mask = LVCF_TEXT; lvColumn.pszText = szTemp; ListView_InsertColumn(hListView,1,&lvColumn); LoadString(GetInstance(),IDS_MERGE_FILES_COLUMN_SIZE, szTemp,SIZEOF_ARRAY(szTemp)); lvColumn.mask = LVCF_TEXT; lvColumn.pszText = szTemp; ListView_InsertColumn(hListView,2,&lvColumn); LoadString(GetInstance(),IDS_MERGE_FILES_COLUMN_DATE_MODIFIED, szTemp,SIZEOF_ARRAY(szTemp)); lvColumn.mask = LVCF_TEXT; lvColumn.pszText = szTemp; ListView_InsertColumn(hListView,3,&lvColumn); int iItem = 0; for each(auto strFullFilename in m_FullFilenameList) { TCHAR szFullFilename[MAX_PATH]; StringCchCopy(szFullFilename,SIZEOF_ARRAY(szFullFilename), strFullFilename.c_str()); /* TODO: Perform in background thread. */ SHFILEINFO shfi; SHGetFileInfo(szFullFilename,0,&shfi,sizeof(SHFILEINFO), SHGFI_SYSICONINDEX|SHGFI_TYPENAME); LVITEM lvItem; lvItem.mask = LVIF_TEXT|LVIF_IMAGE; lvItem.iItem = iItem; lvItem.iSubItem = 0; lvItem.pszText = szFullFilename; lvItem.iImage = shfi.iIcon; ListView_InsertItem(hListView,&lvItem); ListView_SetItemText(hListView,iItem,1,shfi.szTypeName); WIN32_FILE_ATTRIBUTE_DATA wfad; GetFileAttributesEx(szFullFilename,GetFileExInfoStandard,&wfad); TCHAR szFileSize[32]; ULARGE_INTEGER lFileSize = {wfad.nFileSizeLow,wfad.nFileSizeHigh}; FormatSizeString(lFileSize,szFileSize,SIZEOF_ARRAY(szFileSize)); ListView_SetItemText(hListView,iItem,2,szFileSize); TCHAR szDateModified[32]; CreateFileTimeString(&wfad.ftLastWriteTime,szDateModified, SIZEOF_ARRAY(szDateModified),m_bShowFriendlyDates); ListView_SetItemText(hListView,iItem,3,szDateModified); iItem++; }
BOOL AddPathsToComboBoxEx(HWND hComboBoxEx, const TCHAR *Path) { HIMAGELIST SmallIcons; BOOL bRet = Shell_GetImageLists(NULL, &SmallIcons); if(!bRet) { return FALSE; } SendMessage(hComboBoxEx, CBEM_SETIMAGELIST, 0, reinterpret_cast<LPARAM>(SmallIcons)); /* Remove all items that are currently in the list. */ SendMessage(hComboBoxEx, CB_RESETCONTENT, 0, 0); TCHAR FindPath[MAX_PATH]; StringCchCopy(FindPath, SIZEOF_ARRAY(FindPath), Path); bRet = PathAppend(FindPath, _T("*")); if(!bRet) { return FALSE; } WIN32_FIND_DATA wfd; HANDLE hFirstFile = FindFirstFile(FindPath, &wfd); if(hFirstFile == INVALID_HANDLE_VALUE) { return FALSE; } BOOL success = TRUE; while(FindNextFile(hFirstFile, &wfd)) { if((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY && StrCmp(wfd.cFileName, _T("..")) != 0) { TCHAR FullFileName[MAX_PATH]; LPTSTR szRet = PathCombine(FullFileName, Path, wfd.cFileName); if(szRet == NULL) { success = FALSE; break; } SHFILEINFO shfi; SHGetFileInfo(Path, NULL, &shfi, NULL, SHGFI_SYSICONINDEX); COMBOBOXEXITEM cbItem; cbItem.mask = CBEIF_TEXT | CBEIF_IMAGE | CBEIF_INDENT | CBEIF_SELECTEDIMAGE; cbItem.iItem = -1; cbItem.iImage = shfi.iIcon; cbItem.iSelectedImage = shfi.iIcon; cbItem.iIndent = 1; cbItem.iOverlay = 1; cbItem.pszText = wfd.cFileName; LRESULT lRet = SendMessage(hComboBoxEx, CBEM_INSERTITEM, 0, reinterpret_cast<LPARAM>(&cbItem)); if(lRet == -1) { success = FALSE; break; } } } FindClose(hFirstFile); return success; }
// 初始化文件树和列表 void HsLoadFileTreeList(CFileDlg *cFleDlg) { WCHAR* pDrive = NULL; HTREEITEM hRoot; // 树的根节点的句柄 HTREEITEM hDriverItem; // 可表示任一磁盘节点的句柄 HTREEITEM hFolderItem; // 可表示任一目录节点的句柄 HIMAGELIST hImageListLarge = NULL; HIMAGELIST hImageListSmall = NULL; Shell_GetImageLists(&hImageListLarge, &hImageListSmall); ListView_SetImageList(cFleDlg->m_fileList.m_hWnd, hImageListLarge, LVSIL_NORMAL); ListView_SetImageList(cFleDlg->m_fileList.m_hWnd, hImageListSmall, LVSIL_SMALL); HsInitDriveList(&cFleDlg->m_fileList); cFleDlg->m_fileList.DeleteAllItems(); cFleDlg->m_dirTree.DeleteAllItems(); LPITEMIDLIST ppidl = {0}; SHGetSpecialFolderLocation(NULL,CSIDL_DRIVES,&ppidl); //SHGetPathFromIDList(ppidl,TempPath); SHFILEINFO sfi; SHGetFileInfoW ( (LPCWSTR)ppidl, 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_PIDL ); hRoot = cFleDlg->m_dirTree.InsertItem(_T("计算机"),sfi.iIcon,sfi.iIcon,0,0); GetLogicalDriveStrings(sizeof(DriveString), DriveString); pDrive = DriveString; CString DriveName; WCHAR FileSystem[MAX_PATH]; unsigned __int64 HDAmount = 0; unsigned __int64 HDFreeSpace = 0; unsigned long AmntMB = 0; // 总大小 unsigned long FreeMB = 0; // 剩余空间 cFleDlg->m_dirTree.Expand(hRoot,TVE_EXPAND); for (int i = 0; *pDrive != '\0'; i++, pDrive += lstrlen(pDrive) + 1) { // 得到磁盘相关信息 memset(FileSystem, 0, sizeof(FileSystem)); // 得到文件系统信息及大小 GetVolumeInformation(pDrive, NULL, 0, NULL, NULL, NULL, FileSystem, MAX_PATH); int nFileSystemLen = lstrlen(FileSystem) + 1; if (GetDiskFreeSpaceEx(pDrive, (PULARGE_INTEGER)&HDFreeSpace, (PULARGE_INTEGER)&HDAmount, NULL)) { AmntMB = (ULONG)(HDAmount / 1024 / 1024); FreeMB = (ULONG)(HDFreeSpace / 1024 / 1024); } else { AmntMB = 0; FreeMB = 0; } //获得磁盘类别 SHFILEINFO sfi; SHGetFileInfo(pDrive, FILE_ATTRIBUTE_NORMAL, &sfi,sizeof(SHFILEINFO), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES); DriveName = sfi.szTypeName; DriveName += L" ("; DriveName += pDrive; DriveName.Delete(DriveName.GetLength()-1); DriveName += L")"; int icon = GetIconIndex(pDrive,GetFileAttributes(pDrive)); int nItem = cFleDlg->m_fileList.InsertItem(i, DriveName, icon); //插入列表框 cFleDlg->m_fileList.SetItemData(nItem, (DWORD_PTR)pDrive); hDriverItem = cFleDlg->m_dirTree.InsertItem(DriveName,icon,icon,hRoot,0); //插入树形列表 cFleDlg->m_dirTree.SetItemData(hDriverItem, (DWORD_PTR)pDrive); cFleDlg->m_dirTree.Expand(hRoot,TVE_EXPAND); cFleDlg->m_fileList.SetItemText(nItem, 1, sfi.szTypeName); //插入磁盘类别 CString str; str.Format(L"%10.1f GB", (float)AmntMB / 1024); cFleDlg->m_fileList.SetItemText(nItem, 2, str); str.Format(L"%10.1f GB", (float)FreeMB / 1024); cFleDlg->m_fileList.SetItemText(nItem, 3, str); } // 重置本地当前路径 cFleDlg->m_filePath.ResetContent(); cFleDlg->m_filePath.SetWindowTextW(L"计算机"); }