📄 filedlg.cpp
字号:
delete [] m_pszFilter;
m_pszFilter = NULL;
}
if (m_pszDefExt) {
delete [] m_pszDefExt;
m_pszDefExt = NULL;
}
if (m_pOrgListView) {
SetWindowLong(m_hwndLV, GWL_WNDPROC, (DWORD)m_pOrgListView);
m_pOrgListView = NULL;
}
m_helper.SHChangeNotifyDeregister(m_hwndDlg);
ClearFilter();
DeleteExtList();
DestroyListView();
CommandBar_Destroy(m_hwndCB);
::EndDialog(m_hwndDlg, nResult);
}
BOOL CALLBACK CFileDialog::FileDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
CFileDialog* pDlg = (CFileDialog*)GetWindowLong(hwndDlg, DWL_USER);
switch (uMsg) {
case WM_INITDIALOG:
pDlg = (CFileDialog*)lParam;
SetWindowLong(hwndDlg, DWL_USER, (DWORD)lParam);
return pDlg->OnInitDialog(hwndDlg);
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:
pDlg->OnOK();
return TRUE;
case IDCANCEL:
pDlg->EndDialog(LOWORD(wParam));
return TRUE;
case ID_LIST_STYLE_LIST:
pDlg->ChangeListStyle(LVS_LIST);
return TRUE;
case ID_LIST_STYLE_REPORT:
pDlg->ChangeListStyle(LVS_REPORT);
return TRUE;
case ID_LIST_SELECTALL:
pDlg->SelectAllItems();
return TRUE;
case ID_UP:
pDlg->OnUp();
return TRUE;
case ID_KEY_CTRL:
pDlg->m_fCtrl = !pDlg->m_fCtrl;
keybd_event(VK_CONTROL, 0x1e, pDlg->m_fCtrl ? 0 : KEYEVENTF_KEYUP, 1);
{
TBBUTTON tbb;
SendMessage(pDlg->m_hwndCB, TB_GETBUTTON, 1, (LPARAM)&tbb);
HMENU hMenu=HMENU(tbb.dwData);
if(hMenu)
CheckMenuItem(hMenu,ID_KEY_CTRL,MF_BYCOMMAND|(pDlg->m_fCtrl)?MF_CHECKED:MF_UNCHECKED);
}
return TRUE;
case IDC_COMBO_FILTER:
if (HIWORD(wParam) == CBN_SELCHANGE)
pDlg->OnCBSelChange();
return TRUE;
case ID_NEW_FOLDER:
pDlg->NewFolderDialog();
return TRUE;
}
break;
case WM_NOTIFY:
{
NMHDR* pnmh = (NMHDR*)lParam;
switch (pnmh->code) {
case LVN_GETDISPINFO:
pDlg->OnGetDispInfo((NMLVDISPINFO*)lParam);
return TRUE;
case NM_CLICK:
pDlg->OnListClick();
return TRUE;
case NM_DBLCLK:
case NM_RETURN:
pDlg->OnListDblClk();
return TRUE;
case LVN_KEYDOWN:
pDlg->OnListKeyDown((NMLVKEYDOWN*)lParam);
return TRUE;
case LVN_COLUMNCLICK:
pDlg->OnListColumnClick((NMLISTVIEW*)lParam);
return TRUE;
case LVN_ITEMCHANGED:
pDlg->OnListItemChanged((NMLISTVIEW*)lParam);
return TRUE;
}
break;
}
case WM_WININICHANGE:
SetWindowLong(hwndDlg,GWL_STYLE,GetWindowLong(hwndDlg,GWL_STYLE)&~WS_VSCROLL);
pDlg->CheckWindowSize();
return TRUE;
case WM_FILECHANGEINFO:
if(HIWORD(lParam))
{
pDlg->OnFileChangeInfo(&(((FILECHANGENOTIFY *)lParam)->fci));
pDlg->m_helper.SHChangeNotifyFree((FILECHANGENOTIFY *)lParam);
}
return TRUE;
case WM_CTLCOLORSTATIC:
return pDlg->m_helper.DefDlgCtlColorStaticProc(hwndDlg, wParam, lParam);
}
return FALSE;
}
int CFileDialog::GetDlgResourceID()
{
if (m_helper.IsPocketPC()) {
RECT rc;
HWND hwndTB = FindWindow(_T("HHTaskBar"), NULL);
GetWindowRect(hwndTB, &rc);
if (rc.top == 0) {
m_fDlgType = DLG_TYPE_PPC3;
return IDD_OPENFILEDLG_PPC;
}
}
else {
if (GetSystemMetrics(SM_CXSCREEN) > 320) {
m_fDlgType = DLG_TYPE_LARGE;
return IDD_OPENFILEDLG_LARGE;
}
else if (GetSystemMetrics(SM_CXSCREEN) > 240) {
m_fDlgType = DLG_TYPE_MEDIUM;
return IDD_OPENFILEDLG_MEDIUM;
}
}
m_fDlgType = DLG_TYPE_SMALL;
return IDD_OPENFILEDLG_SMALL;
}
void CFileDialog::CreateToolBar()
{
if (m_fDlgType == DLG_TYPE_PPC3) {
// PocketPC
TBBUTTON buttons[] = {
//iBitmap, idCommand, fsState, fsStyle, dwData, iString
{VIEW_PARENTFOLDER+2, ID_UP, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0},
{VIEW_NEWFOLDER+2, ID_NEW_FOLDER, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0},
{VIEW_LIST+2, ID_LIST_STYLE_LIST, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0},
{VIEW_DETAILS+2, ID_LIST_STYLE_REPORT, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0},
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0},
{0, ID_LIST_SELECTALL, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
{1, ID_KEY_CTRL, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0}
};
if(m_helper.IsWM5())//WM5 Later
{
HMENU hMenu=LoadMenu(m_hInst,MAKEINTRESOURCE(IDR_TITLE));
MENUITEMINFO mii;
WCHAR str[32];
mii.cbSize=sizeof(MENUITEMINFO);
mii.fMask=MIIM_TYPE;
mii.fType=MFT_STRING;
mii.dwTypeData=str;
m_helper.LoadString(IDS_MENU_UP, str, 32);
SetMenuItemInfo(hMenu,ID_UP,FALSE,&mii);
m_helper.LoadString(IDS_MENU_MENU, str, 32);
SetMenuItemInfo(hMenu,1,TRUE,&mii);
// remove by Y.N (It's buggy!)
//m_helper.LoadString(IDS_CAPTION_NEWFOLDER, str, 32);
//wcscat(str,L"...");
//SetMenuItemInfo(hMenu,ID_NEW_FOLDER,FALSE,&mii);
m_helper.LoadString(IDS_SMALLICONS, str, 32);
SetMenuItemInfo(hMenu,ID_LIST_STYLE_LIST,FALSE,&mii);
m_helper.LoadString(IDS_DETAIL, str, 32);
SetMenuItemInfo(hMenu,ID_LIST_STYLE_REPORT,FALSE,&mii);
int r = m_helper.LoadString(IDS_MENU_SELECTALL, str, 32);
SetMenuItemInfo(hMenu,ID_LIST_SELECTALL,FALSE,&mii);
// add by Y.N start
m_helper.LoadString(IDS_MENU_KEYCTRL, str, 32);
SetMenuItemInfo(hMenu,ID_KEY_CTRL,FALSE,&mii);
m_helper.LoadString(IDS_CAPTION_CANCEL, str, 32);
SetMenuItemInfo(hMenu,IDCANCEL,FALSE,&mii);
// add by Y.N end
//CheckMenuRadioItem(hMenu, ID_LIST_STYLE_LIST, ID_LIST_STYLE_REPORT, ID_LIST_STYLE_LIST, MF_BYCOMMAND); // modified by Y.N
if(m_fSave || !(m_pofn->Flags & OFN_ALLOWMULTISELECT))
{
DeleteMenu(hMenu,ID_LIST_SELECTALL,MF_BYCOMMAND);
DeleteMenu(hMenu,ID_KEY_CTRL,MF_BYCOMMAND);
}
// add by Y.N (It's buggy!)
DeleteMenu(hMenu, ID_NEW_FOLDER, MF_BYCOMMAND);
m_hwndCB = m_helper.SHCreateMenuBar(m_hwndDlg, m_hInst, (int)hMenu, 0, 0,0x0010/*SHCMBF_HMENU*/);
}
else
{
m_hwndCB = m_helper.SHCreateMenuBar(m_hwndDlg, m_hInst, IDR_DUMMY, IDR_TOOLBAR_PPC, 2);
CommandBar_AddBitmap(m_hwndCB, HINST_COMMCTRL , IDB_VIEW_SMALL_COLOR, 12, 16, 16);
if (!m_fSave && (m_pofn->Flags & OFN_ALLOWMULTISELECT)) {
// multi select (with Ctrl)
CommandBar_AddButtons(m_hwndCB, sizeof(buttons) / sizeof(TBBUTTON), buttons);
}
else {
// single select
CommandBar_AddButtons(m_hwndCB, 6, buttons);
}
}
if (m_pofn->lpstrTitle && _tcslen(m_pofn->lpstrTitle)) {
SetWindowText(m_hwndDlg, m_pofn->lpstrTitle);
SetDlgItemText(m_hwndDlg, IDC_TITLE, m_pofn->lpstrTitle);
}
else {
TCHAR sz[MAX_LOADSTRING];
m_helper.LoadString(m_fSave ? IDS_SAVE_TITLE : IDS_OPEN_TITLE, sz, MAX_LOADSTRING);
SetWindowText(m_hwndDlg, sz);
SetDlgItemText(m_hwndDlg, IDC_TITLE, sz);
}
}
else {
// other device
TCHAR sz[MAX_LOADSTRING] = _T("");
if (m_fDlgType != DLG_TYPE_SMALL && m_pofn->lpstrTitle && _tcslen(m_pofn->lpstrTitle))
_tcsncpy(sz, m_pofn->lpstrTitle, MAX_LOADSTRING - 1);
else {
m_helper.LoadString(m_fSave ? IDS_SAVE_TITLE : IDS_OPEN_TITLE, sz, MAX_LOADSTRING);
}
m_hwndRB = CommandBands_Create(m_hInst, m_hwndDlg, 0, WS_VISIBLE | CCS_TOP | RBBS_NOGRIPPER, NULL);
REBARBANDINFO rbi;
memset(&rbi, 0, sizeof(REBARBANDINFO));
rbi.cbSize = sizeof (REBARBANDINFO);
rbi.fMask = RBBIM_STYLE | RBBIM_TEXT;
rbi.fStyle = RBBS_NOGRIPPER;
rbi.lpText = sz;
CommandBands_AddBands(m_hwndRB, m_hInst, 1, &rbi);
m_hwndCB = CommandBands_GetCommandBar(m_hwndRB, 0);
CommandBar_AddBitmap(m_hwndCB, HINST_COMMCTRL , IDB_VIEW_SMALL_COLOR, 12, 16, 16);
TBBUTTON buttons[] = {
//iBitmap, idCommand, fsState, fsStyle, dwData, iString
{VIEW_PARENTFOLDER, ID_UP, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0},
{VIEW_NEWFOLDER, ID_NEW_FOLDER, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0},
{VIEW_LIST, ID_LIST_STYLE_LIST, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0},
{VIEW_DETAILS, ID_LIST_STYLE_REPORT, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0}
};
CommandBar_AddButtons(m_hwndCB, sizeof(buttons) / sizeof(TBBUTTON), buttons);
CommandBands_AddAdornments(m_hwndRB, m_hInst, CMDBAR_OK, 0);
}
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);
if (m_fDlgType != DLG_TYPE_PPC3)
SendMessage(m_hwndRB, WM_SETFONT, (WPARAM)m_hFnt, 0);
}
void CFileDialog::CheckWindowSize()
{
if (m_fDlgType == DLG_TYPE_PPC3) {
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);
//ComboBox_GetDroppedControlRect(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, 5/*rc.bottom - rc.top*/, TRUE);
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()
{
if (m_fDlgType == DLG_TYPE_PPC3) {
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 = rcParent.bottom - rc.top - m_helper.SipPanelHeight() +1;
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, CB_ADDSTRING, 0, (LPARAM)szFilter);
if (nIndex == CB_ERR)
break;
p = new TCHAR[_tcslen(szExt) + 1];
_tcscpy(p, szExt);
SendMessage(hwndCombo, CB_SETITEMDATA, nIndex, (LPARAM)p);
}
if (*pszSrc == NULL && *(pszSrc + 1) == NULL)
break;
pszSrc++;
}
nIndex = m_pofn->nFilterIndex > 0 ? m_pofn->nFilterIndex - 1 : 0;
SendMessage(hwndCombo, CB_SETCURSEL, nIndex, 0);
return;
fail:
ClearFilter();
*szFilter=0;
::LoadString(m_hInst,IDS_DEF_EXT, szExt, MAX_LOADSTRING);
p = new TCHAR[_tcslen(szExt) + 1];
_tcscpy(p, szExt);
SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM)szFilter);
SendMessage(hwndCombo, CB_SETITEMDATA, 0, (LPARAM)p);
SendMessage(hwndCombo, CB_SETCURSEL, 0, 0);
EnableWindow(hwndCombo,FALSE);//
}
void CFileDialog::ClearFilter()
{
HWND hwndCombo = GetDlgItem(m_hwndDlg, IDC_COMBO_FILTER);
int n = SendMessage(hwndCombo, CB_GETCOUNT, 0, 0);
for (int i = 0; i < n; i++) {
LPTSTR p = (LPTSTR)SendMessage(hwndCombo, CB_GETITEMDATA, i, 0);
delete [] p;
}
SendMessage(hwndCombo, CB_RESETCONTENT, 0, 0);
}
void CFileDialog::GetShellSettings()
{
HKEY hKey = 0;
_tcscpy(m_szRootName, bslash);
if (m_fDlgType == DLG_TYPE_PPC3)
{
m_helper.LoadString(IDS_DEF_ROOT_NAME, m_szRootName, MAX_LOADSTRING);
} else 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 dwSize = sizeof(m_fShowExt);
RegQueryValueEx(hKey, _T("ShowExt"), 0, NULL, (LPBYTE)&m_fShowExt, &dwSize);
dwSize = sizeof(m_fViewAll);
RegQueryValueEx(hKey, _T("ViewAll"), 0, NULL, (LPBYTE)&m_fViewAll, &dwSize);
RegCloseKey(hKey);
}
}
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;
int scale=GetSystemMetrics(SM_CXSMICON)/16;
for(int i=0;i<4;i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -