📄 filedlg.cpp
字号:
break;
}
case WM_WININICHANGE:
pDlg->CheckListHeight();
return TRUE;
case WM_PAINT:
return pDlg->m_helper.DefDlgPaintProc(hwndDlg, wParam, lParam);
case WM_CTLCOLORSTATIC:
return pDlg->m_helper.DefDlgCtlColorStaticProc(hwndDlg, wParam, lParam);
case WM_INITMENUPOPUP:
pDlg->OnInitMenuPopup((HMENU)wParam);
return TRUE;
case WM_SIZE:
pDlg->CheckWindowSize();
return TRUE;
}
return FALSE;
}
int CFileDialog::GetDlgResourceID()
{
if (m_helper.IsPocketPC()) {
m_fDlgType = DLG_TYPE_PPC3;
return IDD_OPENFILEDLG_PPC;
}
else if (m_helper.IsSmartPhone()) {
m_fDlgType = DLG_TYPE_SP;
return IDD_OPENFILEDLG_SP;
}
return 0;
}
void CFileDialog::CreateToolBar()
{
BOOL bMultiSel = FALSE;
if ((m_pofn->Flags & OFN_ALLOWMULTISELECT) && !m_fSave)
bMultiSel = TRUE;
m_hwndCB = m_helper.SHCreateMenuBar(m_hwndDlg, bMultiSel ? IDR_MAIN_MULTI : IDR_MAIN_SINGLE);
if (m_hFnt) {
DeleteObject(m_hFnt);
}
m_hFnt = CreatePointFont(90, _T(""), TRUE);
SendMessage(GetDlgItem(m_hwndDlg, IDC_STATIC_CURRENT_TEXT), WM_SETFONT, (WPARAM)m_hFnt, 0);
}
void CFileDialog::CheckWindowSize()
{
RECT rcParent;
GetClientRect(m_hwndDlg, &rcParent);
int nRight = rcParent.right - 5;
RECT rc;
GetWindowRect(GetDlgItem(m_hwndDlg, IDCANCEL), &rc);
ScreenToClient(m_hwndDlg, (LPPOINT)&rc);
ScreenToClient(m_hwndDlg, (LPPOINT)(&rc) + 1);
MoveWindow(GetDlgItem(m_hwndDlg, IDCANCEL), nRight - (rc.right - rc.left), rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE);
GetWindowRect(GetDlgItem(m_hwndDlg, IDC_EDIT_NAME), &rc);
ScreenToClient(m_hwndDlg, (LPPOINT)&rc);
ScreenToClient(m_hwndDlg, (LPPOINT)(&rc) + 1);
MoveWindow(GetDlgItem(m_hwndDlg, IDC_EDIT_NAME), rc.left, rc.top, nRight - rc.left, rc.bottom - rc.top, TRUE);
GetWindowRect(GetDlgItem(m_hwndDlg, IDC_COMBO_FILTER), &rc);
ScreenToClient(m_hwndDlg, (LPPOINT)&rc);
ScreenToClient(m_hwndDlg, (LPPOINT)(&rc) + 1);
MoveWindow(GetDlgItem(m_hwndDlg, IDC_COMBO_FILTER), rc.left, rc.top, nRight - rc.left, rc.bottom - rc.top, TRUE);
if (m_fDlgType == DLG_TYPE_SP) {
SendMessage(GetDlgItem(m_hwndDlg, IDC_SPIN_FILTER), UDM_SETBUDDY, (WPARAM)GetDlgItem(m_hwndDlg, IDC_LIST_FILTER), 0);
}
nRight += 5;
GetWindowRect(GetDlgItem(m_hwndDlg, IDC_LIST_FILE), &rc);
ScreenToClient(m_hwndDlg, (LPPOINT)&rc);
ScreenToClient(m_hwndDlg, (LPPOINT)(&rc) + 1);
MoveWindow(GetDlgItem(m_hwndDlg, IDC_LIST_FILE), rc.left, rc.top, nRight - rc.left, rc.bottom - rc.top, TRUE);
CheckListHeight();
}
void CFileDialog::CheckListHeight()
{
RECT rc, rcParent;
GetClientRect(m_hwndDlg, &rcParent);
GetWindowRect(GetDlgItem(m_hwndDlg, IDC_LIST_FILE), &rc);
ScreenToClient(m_hwndDlg, (LPPOINT)&rc);
ScreenToClient(m_hwndDlg, (LPPOINT)(&rc) + 1);
int nHeight = m_helper.IsSipPanelVisible() ?
rcParent.bottom - rc.top - 80 : rcParent.bottom - rc.top;
MoveWindow(GetDlgItem(m_hwndDlg, IDC_LIST_FILE), rc.left, rc.top,
rc.right - rc.left, nHeight, TRUE);
}
void CFileDialog::ParseFilter()
{
int nIndex;
TCHAR szFilter[MAX_LOADSTRING];
TCHAR szExt[MAX_LOADSTRING];
LPTSTR pszSrc, p;
HWND hwndCombo = GetDlgItem(m_hwndDlg, IDC_COMBO_FILTER);
if (!m_pofn->lpstrFilter)
goto fail;
pszSrc = (LPTSTR)m_pofn->lpstrFilter;
while (TRUE) {
// filter
p = szFilter;
while (*pszSrc != NULL) {
*p++ = *pszSrc;
pszSrc++;
}
*p = NULL;
if (*pszSrc == NULL && *(pszSrc + 1) == NULL)
break;
pszSrc++;
// ext
p = szExt;
while (*pszSrc != NULL) {
*p++ = *pszSrc;
pszSrc++;
}
*p = NULL;
if (_tcslen(szFilter) && _tcslen(szExt)) {
int nIndex = SendMessage(hwndCombo, CLB_ADDSTRING, 0, (LPARAM)szFilter);
if (nIndex == CB_ERR)
break;
p = new TCHAR[_tcslen(szExt) + 1];
_tcscpy(p, szExt);
SendMessage(hwndCombo, CLB_SETITEMDATA, nIndex, (LPARAM)p);
}
if (*pszSrc == NULL && *(pszSrc + 1) == NULL)
break;
pszSrc++;
}
nIndex = m_pofn->nFilterIndex > 0 ? m_pofn->nFilterIndex - 1 : 0;
SendMessage(hwndCombo, CLB_SETCURSEL, nIndex, 0);
return;
fail:
ClearFilter();
LoadString(g_hInst, IDS_DEF_FILTER, szFilter, MAX_LOADSTRING);
LoadString(g_hInst, IDS_DEF_EXT, szExt, MAX_LOADSTRING);
p = new TCHAR[_tcslen(szExt) + 1];
_tcscpy(p, szExt);
SendMessage(hwndCombo, CLB_ADDSTRING, 0, (LPARAM)szFilter);
SendMessage(hwndCombo, CLB_SETITEMDATA, 0, (LPARAM)p);
SendMessage(hwndCombo, CLB_SETCURSEL, 0, 0);
}
void CFileDialog::ClearFilter()
{
HWND hwndCombo = GetDlgItem(m_hwndDlg, IDC_COMBO_FILTER);
int n = SendMessage(hwndCombo, CLB_GETCOUNT, 0, 0);
for (int i = 0; i < n; i++) {
LPTSTR p = (LPTSTR)SendMessage(hwndCombo, CLB_GETITEMDATA, i, 0);
delete p;
}
SendMessage(hwndCombo, CLB_RESETCONTENT, 0, 0);
}
void CFileDialog::GetShellSettings()
{
LoadString(g_hInst, IDS_DEF_ROOT_NAME, m_szRootName, MAX_LOADSTRING);
#if 0
if (m_fDlgType == DLG_TYPE_PPC3)
return;
HKEY hKey = 0;
if (RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("{000214A0-0000-0000-C000-000000000046}"), 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
DWORD dwType, dwSize = sizeof(m_szRootName);
RegQueryValueEx(hKey, _T("DisplayName"), 0, &dwType, (LPBYTE)m_szRootName, &dwSize);
RegCloseKey(hKey);
}
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Explorer"), 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
DWORD dwType, dwSize = sizeof(m_fShowExt);
RegQueryValueEx(hKey, _T("ShowExt"), 0, &dwType, (LPBYTE)&m_fShowExt, &dwSize);
RegCloseKey(hKey);
}
#endif
}
void CFileDialog::InitListView()
{
TCHAR sz[MAX_LOADSTRING];
if (!(m_pofn->Flags & OFN_ALLOWMULTISELECT) || m_fSave)
SetWindowLong(m_hwndLV, GWL_STYLE, GetWindowLong(m_hwndLV, GWL_STYLE) | LVS_SINGLESEL);
LVCOLUMN lvc;
lvc.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
lvc.pszText = sz;
lvc.fmt = LVCFMT_LEFT;
lvc.cx = s_nListColumnWidth[0];
lvc.iSubItem = 0;
LoadString(g_hInst, IDS_COLUMN_NAME, sz, MAX_LOADSTRING);
ListView_InsertColumn(m_hwndLV, 0, &lvc);
lvc.fmt = LVCFMT_RIGHT;
lvc.cx = s_nListColumnWidth[1];
lvc.iSubItem = 1;
LoadString(g_hInst, IDS_COLUMN_SIZE, sz, MAX_LOADSTRING);
ListView_InsertColumn(m_hwndLV, 1, &lvc);
lvc.fmt = LVCFMT_LEFT;
lvc.cx = s_nListColumnWidth[2];
lvc.iSubItem = 2;
LoadString(g_hInst, IDS_COLUMN_TYPE, sz, MAX_LOADSTRING);
ListView_InsertColumn(m_hwndLV, 2, &lvc);
lvc.fmt = LVCFMT_LEFT;
lvc.cx = s_nListColumnWidth[3];
lvc.iSubItem = 3;
LoadString(g_hInst, IDS_COLUMN_DATE, sz, MAX_LOADSTRING);
ListView_InsertColumn(m_hwndLV, 3, &lvc);
m_ImageList.Init();
ListView_SetImageList(m_hwndLV, (HIMAGELIST)m_ImageList, LVSIL_SMALL);
}
void CFileDialog::DestroyListView()
{
DeleteAllListItem();
m_ImageList.Destroy();
}
void CFileDialog::DeleteAllListItem()
{
for (int i = 0; i < ListView_GetItemCount(m_hwndLV); i++) {
LIST_ITEM_INFO* pDel = GetListItemInfo(i);
if (pDel->pszDispName) delete[] pDel->pszDispName;
if (pDel->pszDispSize) delete[] pDel->pszDispSize;
if (pDel->pszDispType) delete[] pDel->pszDispType;
if (pDel->pszDispTime) delete[] pDel->pszDispTime;
delete[] pDel->pszName;
delete pDel;
}
ListView_DeleteAllItems(m_hwndLV);
}
BOOL CFileDialog::LoadFolderItem(LPCTSTR pszPath, BOOL fFocus)
{
if (!pszPath)
return FALSE;
DWORD dwAttr = GetFileAttributes(pszPath);
if (dwAttr == 0xFFFFFFFF ||
!(dwAttr & FILE_ATTRIBUTE_DIRECTORY))
return FALSE;
HCURSOR hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
ShowWindow(m_hwndLV, SW_HIDE);
m_fSelMode = FALSE;
DeleteAllListItem();
TCHAR sz[MAX_PATH];
TCHAR szPath[MAX_PATH];
WIN32_FIND_DATA wfd;
_tcscpy(szPath, pszPath);
LPTSTR psz = _tcsrchr(szPath, _T('\\'));
if (psz && *(psz + 1) == NULL)
*psz = NULL;
// folder
wsprintf(sz, _T("%s\\*.*"), szPath);
HANDLE hFind = FindFirstFile(sz, &wfd);
if (hFind != INVALID_HANDLE_VALUE) {
do {
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
AddListItem(szPath, &wfd);
else if (m_listExt.IsEmpty())
AddListItem(szPath, &wfd);
else if (IsFolderShortcut(szPath, wfd.cFileName))
AddListItem(szPath, &wfd);
}
while (FindNextFile(hFind, &wfd));
FindClose(hFind);
}
// files
if (m_pszFilter) {
wsprintf(sz, _T("%s\\%s"), szPath, m_pszFilter);
hFind = FindFirstFile(sz, &wfd);
if (hFind != INVALID_HANDLE_VALUE) {
do {
if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
!IsFolderShortcut(szPath, wfd.cFileName))
AddListItem(szPath, &wfd);
}
while (FindNextFile(hFind, &wfd));
FindClose(hFind);
}
}
else {
int n = m_listExt.GetCount();
for (int i = 0; i < n; i++) {
LPTSTR p = (LPTSTR)m_listExt.GetAt(i);
wsprintf(sz, _T("%s\\%s"), szPath, p);
hFind = FindFirstFile(sz, &wfd);
if (hFind != INVALID_HANDLE_VALUE) {
do {
if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
!IsFolderShortcut(szPath, wfd.cFileName))
AddListItem(szPath, &wfd);
}
while (FindNextFile(hFind, &wfd));
FindClose(hFind);
}
}
}
if (ListView_GetItemCount(m_hwndLV)) {
SortList();
ListView_SetItemState(m_hwndLV, 0, LVIS_FOCUSED, LVIS_FOCUSED);
}
_tcscpy(m_szCurrent, szPath);
SetDlgItemText(m_hwndDlg, IDC_STATIC_CURRENT_TEXT, GetDisplayName(m_szCurrent));
BOOL fUp = (_tcslen(szPath) && _tcscmp(szPath, _T("\\")) != 0);
SendMessage(m_hwndCB, TB_SETSTATE, ID_UP, fUp ? TBSTATE_ENABLED : TBSTATE_INDETERMINATE);
SetCursor(hCursor);
ShowWindow(m_hwndLV, SW_SHOW);
UpdateWindow(m_hwndLV);
if (fFocus)
SetFocus(m_hwndLV);
return TRUE;
}
void CFileDialog::SortList()
{
m_fSelMode = FALSE;
switch (m_nListSort)
{
case LIST_SORT_NAME:
ListView_SortItems(m_hwndLV, ListSortCompareFuncByName, m_fSortOrder);
break;
case LIST_SORT_EXT:
ListView_SortItems(m_hwndLV, ListSortCompareFuncByExt, m_fSortOrder);
break;
case LIST_SORT_SIZE:
ListView_SortItems(m_hwndLV, ListSortCompareFuncBySize, m_fSortOrder);
break;
case LIST_SORT_TIME:
ListView_SortItems(m_hwndLV, ListSortCompareFuncByTime, m_fSortOrder);
break;
default:
ListView_SortItems(m_hwndLV, ListSortCompareFuncByName, m_fSortOrder);
break;
}
}
void CFileDialog::AddListItem(LPCTSTR pszPath, WIN32_FIND_DATA* pwfd)
{
LVITEM li;
LIST_ITEM_INFO* p;
if (pwfd->dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
return;
if (pwfd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
p = new LIST_ITEM_INFO;
p->type = ITEM_TYPE_DIR;
p->pszName = new TCHAR[_tcslen(pwfd->cFileName) + 1];
memset(p->pszName, 0, sizeof(TCHAR) * (_tcslen(pwfd->cFileName) + 1));
_tcscpy(p->pszName, pwfd->cFileName);
p->llSize = 0;
p->ft = pwfd->ftCreationTime;
li.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
li.iItem = 0;
li.iSubItem = 0;
li.iImage = I_IMAGECALLBACK;
li.lParam = (DWORD)p;
li.pszText = LPSTR_TEXTCALLBACK;
ListView_InsertItem(m_hwndLV, &li);
ListView_SetItemText(m_hwndLV, 0, 2, LPSTR_TEXTCALLBACK);
}
else {
p = new LIST_ITEM_INFO;
p->type = ITEM_TYPE_FILE;
p->pszName = new TCHAR[_tcslen(pwfd->cFileName) + 1];
memset(p->pszName, 0, sizeof(TCHAR) * (_tcslen(pwfd->cFileName) + 1));
_tcscpy(p->pszName, pwfd->cFileName);
p->llSize = ((ULONGLONG)pwfd->nFileSizeHigh << 32) | pwfd->nFileSizeLow;
p->ft = pwfd->ftLastWriteTime;
FileTimeToLocalFileTime(&p->ft, &p->ft);
li.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
li.iItem = 0;
li.iSubItem = 0;
li.iImage = I_IMAGECALLBACK;
li.lParam = (DWORD)p;
li.pszText = LPSTR_TEXTCALLBACK;
ListView_InsertItem(m_hwndLV, &li);
ListView_SetItemText(m_hwndLV, 0, 1, LPSTR_TEXTCALLBACK);
ListView_SetItemText(m_hwndLV, 0, 2, LPSTR_TEXTCALLBACK);
ListView_SetItemText(m_hwndLV, 0, 3, LPSTR_TEXTCALLBACK);
}
}
LIST_ITEM_INFO* CFileDialog::GetListItemInfo(int nIndex)
{
LVITEM li;
li.iItem = nIndex;
li.iSubItem = 0;
li.mask = LVIF_PARAM;
ListView_GetItem(m_hwndLV, &li);
return (LIST_ITEM_INFO*)li.lParam;
}
int CFileDialog::GetSelectedItemIndex(int nStart)
{
int nIndex = -1;
int nItemCount = ListView_GetItemCount(m_hwndLV);
for (int i = nStart; i < nItemCount; i++) {
if (ListView_GetItemState(m_hwndLV, i, LVIS_SELECTED) == LVIS_SELECTED)
return i;
}
return -1;
}
void CFileDialog::OnGetDispInfo(NMLVDISPINFO* pnmdi)
{
LIST_ITEM_INFO* p = GetListItemInfo(pnmdi->item.iItem);
if (pnmdi->item.mask & LVIF_IMAGE) {
if (p->nIcon == -1)
p->nIcon = m_ImageList.GetImageListIndex(p->pszName, m_szCurrent);
pnmdi->item.iImage = p->nIcon;
}
if ((pnmdi->item.mask & LVIF_TEXT)) {
if (p->type == ITEM_TYPE_DIR) {
switch (pnmdi->item.iSubItem) {
case 0: //Name
pnmdi->item.pszText = p->pszName;
break;
case 2: //Type
{
if (!p->pszDispType) {
TCHAR sz[MAX_PATH];
SHFILEINFO shfi;
p->pszDispType = new TCHAR[80]; // ???
wsprintf(sz, _T("%s\\%s"), m_szCurrent, p->pszName);
SHGetFileInfo(sz, NULL, &shfi, sizeof(shfi), SHGFI_TYPENAME);
_tcscpy(p->pszDispType, shfi.szTypeName);
}
pnmdi->item.pszText = p->pszDispType;
break;
}
default: break;
}
}
else
{
switch (pnmdi->item.iSubItem) {
case 0: //Name
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -