📄 fileopendlg.cpp
字号:
//---------------------------------------------------------------------------
//
// CFileOpenDlg message handlers
//
//---------------------------------------------------------------------------
// CFileOpenDlg::OnInitDialog
//
// Initialize the dialog
//
BOOL CFileOpenDlg::OnInitDialog()
{
CWinApp* pApp = AfxGetApp();
HTREEITEM hItemRoot;
HIMAGELIST hImlSys;
SHFILEINFO ssfi;
CWaitCursor wait;
TCHAR szRoot[] = _T("\\");
CExDialog::OnInitDialog();
//
// Create the toolbar
//
#ifdef WIN32_PLATFORM_PSPC
if(!m_wndCommandBar.Create(this) ||
!m_wndCommandBar.InsertMenuBar(IDR_MAINFRAME) ||
!m_wndCommandBar.AddAdornments() ||
!m_wndCommandBar.LoadToolBar(IDR_FILEOPEN))
{
TRACE0("Failed to create CommandBar\n");
return -1; // fail to create
}
#endif
#ifdef WIN32_PLATFORM_WFSP
if (!m_wndCommandBar.Create(this) ||
!m_wndCommandBar.InsertMenuBar(IDR_MAINFRAME) ||
!m_wndCommandBar.AddAdornments())
{
TRACE0("Failed to create CommandBar\n");
return -1; // fail to create
}
CWnd* pWnd = CWnd::FromHandlePermanent(m_wndCommandBar.m_hWnd);
RECT rect, rectDesktop;
pWnd->GetWindowRect(&rect);
pWnd->GetDesktopWindow()->GetWindowRect(&rectDesktop);
int cx = rectDesktop.right - rectDesktop.left;
int cy = (rectDesktop.bottom - rectDesktop.top) - (rect.bottom - rect.top);
this->SetWindowPos(NULL, 0, 0, cx, cy, SWP_NOMOVE | SWP_NOZORDER);
#endif
//
// Position the tree.
//
GetClientRect(&m_rcTree);
m_rcTree.top = GetHeaderHeight() + 1;
m_rcTree.bottom = m_ySplit;
m_treeFolder.MoveWindow(&m_rcTree);
//
// Position the list
//
GetClientRect(&m_rcList);
m_rcList.top = m_ySplit + nTrackHeight + 1;
m_listFile.MoveWindow(&m_rcList);
//
// Hide the OK button
//
ModifyStyle(0, WS_NONAVDONEBUTTON, SWP_NOSIZE);
::SHDoneButton(m_hWnd, SHDB_HIDE);
//
// Retrieve the small system image list
//
hImlSys = (HIMAGELIST)SHGetFileInfo(_T("dummy.txt"), 0, &ssfi,
sizeof(SHFILEINFO),
SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
m_imlSystem.Attach(hImlSys);
m_listFile.SetImageList(&m_imlSystem, LVSIL_SMALL);
m_treeFolder.SetImageList(&m_imlSystem, TVSIL_NORMAL);
m_imlSystem.Detach();
//
// Initialize the tree
//
hItemRoot = TVI_ROOT;//m_treeFolder.InsertItem(GetSystemName(), 0, 1);
if(hItemRoot)
{
TVINSERTSTRUCT tvi;
int iIcon = GetIconIndex(szRoot);
tvi.hParent = TVI_ROOT;
tvi.hInsertAfter = TVI_LAST;
tvi.item.mask = TVIF_CHILDREN | TVIF_IMAGE | TVIF_SELECTEDIMAGE |
TVIF_TEXT | TVIF_PARAM;
tvi.item.pszText = szRoot;
tvi.item.iImage = iIcon;
tvi.item.iSelectedImage = iIcon;
tvi.item.cChildren = I_CHILDRENCALLBACK;
tvi.item.lParam = -1;
m_treeFolder.InsertItem(&tvi);
//m_treeFolder.SetItemData(hItemRoot, 0);
//EnumDirs(_T("\\"), _T("*"), hItemRoot);
//m_treeFolder.Expand(hItemRoot, TVE_EXPAND);
}
//
// Initialize the list
//
m_listFile.InsertColumn(0, _T("Name"), LVCFMT_LEFT, 80, -1);
m_listFile.InsertColumn(1, _T("Size"), LVCFMT_RIGHT, 60, 1);
m_listFile.InsertColumn(2, _T("Date"), LVCFMT_LEFT, 60, 2);
EnumFiles(szRoot, m_strFilter);
//
// Initialize the header imagelist
//
if(m_imlHeader.Create(IDB_SORT_ARROWS, 16, 8, RGB(255,0,255)))
{
CHeaderCtrl* pHeader = m_listFile.GetHeaderCtrl();
if(pHeader)
pHeader->SetImageList(&m_imlHeader);
}
SetColumnIcons();
//
// Update toolbar buttons
//
UpdateControls();
OnViewTree();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CFileOpenDlg::OnOK( )
{
}
// CFileOpenDlg::OnSelchangedFolderTree
//
// The tree has changed its selection
//
void CFileOpenDlg::OnSelchangedFolderTree(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
HTREEITEM hItem;
hItem = pNMTreeView->itemNew.hItem;
if(hItem)
{
m_strPath = GetFullPath(hItem);
//
// If displaying only the tree, do not enumerate files
//
if(m_nState != vsTreeOnly)
EnumFiles(m_strPath, m_strFilter);
}
*pResult = 0;
}
// CFileOpenDlg::OnClickFileList
//
// The user clicked the file list
//
void CFileOpenDlg::OnClickFileList(NMHDR* pNMHDR, LRESULT* pResult)
{
int iItem;
iItem = m_listFile.GetNextItem(-1, LVNI_SELECTED);
if(iItem != -1)
{
m_strFile = m_listFile.GetItemText(iItem, 0);
}
//
// Enable or disable the OK button
//
m_bOk = iItem != -1;
UpdateControls();
*pResult = 0;
}
// CFileOpenDlg::OnLButtonDown
//
// Processes the button down message.
void CFileOpenDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
if(m_nState == vsStandard)
{
SetCapture();
m_bTracking = TRUE;
m_yTrackDel = point.y - m_ySplit;
m_yTrack = m_ySplit;
}
Default();
}
// CFileOpenDlg::OnLButtonUp
//
// The user stopped dragging
//
void CFileOpenDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
if(m_nState == vsStandard)
{
ReleaseCapture();
m_bTracking = FALSE;
InvalidateRect(NULL);
UpdateWindow();
}
CExDialog::OnLButtonUp(nFlags, point);
}
// CFileOpenDlg::OnMouseMove
//
// The user is dragging the stylus.
//
void CFileOpenDlg::OnMouseMove(UINT nFlags, CPoint point)
{
if(m_nState == vsStandard && m_bTracking)
{
m_yTrack = point.y - m_yTrack;
m_ySplit = point.y - m_yTrackDel;
//
// Position the controls
//
m_rcTree.bottom = m_ySplit;
m_treeFolder.MoveWindow(&m_rcTree);
m_rcList.top = m_ySplit + nTrackHeight + 1;
m_listFile.MoveWindow(&m_rcList);
InvalidateRect(NULL);
UpdateWindow();
}
CExDialog::OnMouseMove(nFlags, point);
}
// CFileOpenDlg::OnHeaderClickFileList
//
// The header was clicked: sort the file list
//
void CFileOpenDlg::OnHeaderClickFileList(NMHDR* pNMHDR, LRESULT* pResult)
{
HD_NOTIFY* phdn = (HD_NOTIFY *) pNMHDR;
int iItem;
iItem = phdn->iItem + 1;
if(m_nSort == iItem)
m_nSort = -iItem;
else
m_nSort = iItem;
SetColumnIcons();
DoSortList();
*pResult = 0;
}
// CFileOpenDlg::OnCustomDrawList
//
// Draws the list with stripes
//
void CFileOpenDlg::OnCustomDrawList(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLVCUSTOMDRAW* pLVCD = (NMLVCUSTOMDRAW*) pNMHDR;
DWORD dwDrawStage;
*pResult = CDRF_DODEFAULT;
dwDrawStage = pLVCD->nmcd.dwDrawStage;
if(dwDrawStage == CDDS_PREPAINT)
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if(dwDrawStage == CDDS_ITEMPREPAINT)
{
*pResult = CDRF_NOTIFYSUBITEMDRAW;
}
else if(dwDrawStage == (CDDS_ITEMPREPAINT | CDDS_SUBITEM))
{
COLORREF colBack;
int /*iItem,*/
iSubItem;
//
// Get the list column pointer
//
// iItem = pLVCD->nmcd.dwItemSpec;
iSubItem = pLVCD->iSubItem;
if(iSubItem + 1 == abs(m_nSort))
colBack = RGB(224, 224, 255); // Light blue?
else
colBack = RGB(255, 255, 255); // White
pLVCD->clrTextBk = colBack;
*pResult = CDRF_DODEFAULT;
}
}
// CFileOpenDlg::OnItemExpandingFolderTree
//
// The user is expanding a tree node
//
void CFileOpenDlg::OnItemExpandingFolderTree(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
if(pNMTreeView->action & TVE_EXPAND)
{
TVITEM item;
item.mask = TVIF_HANDLE | TVIF_PARAM;
item.hItem = pNMTreeView->itemNew.hItem;
if(pNMTreeView->itemNew.lParam == -1)
{
CString strFullPath = GetFullPath(item.hItem);
RECT rc;
// if(strFullPath != _T("\\"))
// strFullPath += _T("\\");
if(EnumDirs(strFullPath, _T("*"), item.hItem))
item.lParam = 1;
else
item.lParam = 0;
m_treeFolder.SetItem(&item);
m_treeFolder.GetItemRect(item.hItem, &rc, FALSE);
m_treeFolder.InvalidateRect(&rc);
m_treeFolder.UpdateWindow();
}
}
*pResult = 0;
}
// CFileOpenDlg::OnGetDispInfoFolderTree
//
//
void CFileOpenDlg::OnGetDispInfoFolderTree(NMHDR* pNMHDR, LRESULT* pResult)
{
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
if(pTVDispInfo->item.mask & TVIF_CHILDREN)
{
if(pTVDispInfo->item.lParam)
pTVDispInfo->item.cChildren = 1;
else
pTVDispInfo->item.cChildren = 0;
}
*pResult = 0;
}
//---------------------------------------------------------------------------
//
// CFileOpenDlg command handlers
//
//---------------------------------------------------------------------------
// CFileOpenDlg::OnViewStandard
//
// Enables the standard view
//
void CFileOpenDlg::OnViewStandard()
{
m_treeFolder.ShowWindow(SW_SHOW);
m_treeFolder.MoveWindow(&m_rcTree);
m_listFile.ShowWindow(SW_SHOW);
m_listFile.MoveWindow(&m_rcList);
if(m_nState == vsTreeOnly)
EnumFiles(m_strPath, m_strFilter);
m_nState = vsStandard;
UpdateControls();
}
// CFileOpenDlg::OnViewTree
//
// Enables the tree view only
//
void CFileOpenDlg::OnViewTree()
{
m_treeFolder.ShowWindow(SW_SHOW);
m_treeFolder.MoveWindow(m_rcTree.left,
m_rcTree.top,
m_rcList.right - m_rcList.left,
m_rcList.bottom - m_rcTree.top);
m_listFile.ShowWindow(SW_HIDE);
m_nState = vsTreeOnly;
UpdateControls();
}
// CFileOpenDlg::OnViewList
//
// Enables the list view only
//
void CFileOpenDlg::OnViewList()
{
m_treeFolder.ShowWindow(SW_HIDE);
m_listFile.ShowWindow(SW_SHOW);
m_listFile.MoveWindow(m_rcTree.left,
m_rcTree.top,
m_rcList.right - m_rcList.left,
m_rcList.bottom - m_rcTree.top);
if(m_nState == vsTreeOnly)
EnumFiles(m_strPath, m_strFilter);
m_nState = vsListOnly;
UpdateControls();
}
// CFileOpenDlg::OnBarOk
//
// Confirms the selection
//
void CFileOpenDlg::OnBarOk()
{
EndDialog(IDOK);
}
// CFileOpenDlg::OnBarCancel
//
// Cancels the operation
//
void CFileOpenDlg::OnBarCancel()
{
EndDialog(IDCANCEL);
}
//---------------------------------------------------------------------------
//
// Sorting functions
//
//---------------------------------------------------------------------------
static int SortNameAsc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CFileInfoCont* pCont = (CFileInfoCont*)lParamSort;
return _wcsicmp((*pCont)[lParam1].cFileName, (*pCont)[lParam2].cFileName);
}
static int SortNameDes(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CFileInfoCont* pCont = (CFileInfoCont*)lParamSort;
return _wcsicmp((*pCont)[lParam2].cFileName, (*pCont)[lParam1].cFileName);
}
static int SortSizeAsc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CFileInfoCont* pCont = (CFileInfoCont*)lParamSort;
return (int)(*pCont)[lParam1].nFileSizeLow -
(int)(*pCont)[lParam2].nFileSizeLow;
}
static int SortSizeDes(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CFileInfoCont* pCont = (CFileInfoCont*)lParamSort;
return (int)(*pCont)[lParam2].nFileSizeLow -
(int)(*pCont)[lParam1].nFileSizeLow;
}
static int SortDateAsc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CFileInfoCont* pCont = (CFileInfoCont*)lParamSort;
return CompareFileTime(&(*pCont)[lParam1].ftLastWriteTime,
&(*pCont)[lParam2].ftLastWriteTime);
}
static int SortDateDes(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CFileInfoCont* pCont = (CFileInfoCont*)lParamSort;
return CompareFileTime(&(*pCont)[lParam2].ftLastWriteTime,
&(*pCont)[lParam1].ftLastWriteTime);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -