📄 filedlgex.cpp
字号:
{
if(m_bNewPage)
{
tc.pszText="新建";
m_wndTab.InsertItem(iPage++,&tc);
}
tc.pszText="现存";
m_wndTab.InsertItem(iPage++,&tc);
tc.pszText="最新";
m_wndTab.InsertItem(iPage++,&tc);
}
pFD->CenterWindow();
pFD->SetWindowText(m_strCaption);
//-----------------------------------------
// Set dilaog icons:
//-----------------------------------------
if (m_hIconSmall!=NULL)
pFD->SetIcon(m_hIconSmall,FALSE);
if (m_hIconBig!=NULL)
pFD->SetIcon(m_hIconBig,TRUE);
//------------------------------------------
// Setup parent window proc:
//------------------------------------------
m_wndProc=(WNDPROC)SetWindowLong(pFD->m_hWnd, GWL_WNDPROC,
(long)CFileDlgEx::WindowProcNew);
}
//******************************************************************************************
void CFileDlgEx::OnTabSelchange()
{
int nPage = m_wndTab.GetCurSel();
if (!m_bNewPage)
{
nPage ++;
}
switch (nPage)
{
case 0:
m_nPage = FileDlgExNew;
break;
case 1:
m_nPage = FileDlgExOpen;
break;
case 2:
m_nPage = FileDlgExRecent;
break;
default:
ASSERT (FALSE);
}
//---------------------
// Show/hide file list:
//---------------------
CWnd* pWnd = GetParent();
ASSERT (pWnd != NULL);
CWnd* pWndChild = pWnd->GetWindow (GW_CHILD);
while (pWndChild != NULL)
{
TCHAR szClass [256];
::GetClassName (pWndChild->GetSafeHwnd (), szClass, 255);
CString strClass = szClass;
if (strClass.CompareNoCase (_T("SHELLDLL_DefView")) == 0)
{
pWndChild->ShowWindow (m_nPage == FileDlgExOpen ? SW_SHOW : SW_HIDE);
break;
}
pWndChild = pWndChild->GetNextWindow ();
}
//--------------------------
// Show/hide other controls:
//--------------------------
for (POSITION pos = m_lstFDControls.GetHeadPosition (); pos != NULL;)
{
pWnd = CWnd::FromHandle (m_lstFDControls.GetNext (pos));
ASSERT (pWnd != NULL);
pWnd->ShowWindow(m_nPage == FileDlgExOpen ? SW_SHOW : SW_HIDE);
}
m_wndNewList.ShowWindow (m_nPage == FileDlgExNew ? SW_SHOW : SW_HIDE);
m_wndRecentList.ShowWindow (m_nPage == FileDlgExRecent ? SW_SHOW : SW_HIDE);
}
//***************************************************************************************
void CFileDlgEx::OnItemDblClick ()
{
ASSERT (m_nPage != FileDlgExOpen);
CListCtrl& list = (m_nPage == FileDlgExRecent) ? m_wndRecentList : m_wndNewList;
int iSelIndex = list.GetNextItem (-1, LVNI_ALL | LVNI_SELECTED);
if (iSelIndex == -1)
{
return;
}
if (m_nPage == FileDlgExRecent)
{
CString strPath = list.GetItemText (iSelIndex, 1);
CString strName = list.GetItemText (iSelIndex, 0);
if (strPath.IsEmpty ())
{
m_strRecentFilePath = strName;
}
else
{
m_strRecentFilePath = strPath;
m_strRecentFilePath += _T('\\');
m_strRecentFilePath += strName;
}
}
else
{
ASSERT (m_nPage == FileDlgExNew);
m_iNewItemIndex = iSelIndex;
}
CDialog* pWnd = (CDialog*) GetParent();
ASSERT (pWnd != NULL);
pWnd->EndDialog (IDOK);
}
//****************************************************************************************
void CFileDlgEx::CollectControls ()
{
CWnd* pWnd = GetParent();
ASSERT (pWnd != NULL);
CRect rectList (0, 0, 0, 0);
CWnd* pWndChild = pWnd->GetWindow (GW_CHILD);
while (pWndChild != NULL)
{
BOOL bIsFileList = FALSE;
UINT uiID = pWndChild->GetDlgCtrlID();
TCHAR szClass [256];
::GetClassName (pWndChild->GetSafeHwnd (), szClass, 255);
CString strClass = szClass;
CRect rectCtl;
pWndChild->GetClientRect (rectCtl);
pWndChild->MapWindowPoints (pWnd, rectCtl);
if (strClass.CompareNoCase (_T("SHELLDLL_DefView")) == 0)
{
rectList.left = rectCtl.left;
rectList.right = rectCtl.right;
rectList.bottom = rectCtl.bottom - 10;
bIsFileList = TRUE;
}
if (strClass.CompareNoCase (_T("ToolbarWindow32")) == 0)
{
rectList.top = rectCtl.top;
}
if ((((strClass.CompareNoCase (_T("BUTTON")) != 0) ||
uiID != IDOK &&
uiID != IDCANCEL &&
uiID != pshHelp) &&
pWndChild->GetStyle () & WS_VISIBLE) &&
uiID != iTabCtrlId &&
uiID != iNewListCtrlId &&
uiID != iRecentListCtrlId &&
!bIsFileList)
{
m_lstFDControls.AddTail (pWndChild->GetSafeHwnd ());
}
pWndChild = pWndChild->GetNextWindow ();
}
m_wndNewList.MoveWindow (rectList);
m_wndRecentList.MoveWindow (rectList);
OnTabSelchange();
}
//**************************************************************************************
void CFileDlgEx::AddNewItem (LPCTSTR lpszName, LPCTSTR lpszExt, int iIconIndex)
{
m_lstNewItems.AddTail(new CNewItemInfo (lpszName, lpszExt, iIconIndex));
}
//**************************************************************************************
void CFileDlgEx::SetDlgIcon (HICON hIconBig, HICON hIconSmall/* = NULL*/)
{
m_hIconBig = hIconBig;
m_hIconSmall = (hIconSmall == NULL) ? m_hIconBig : hIconSmall;
}
//**************************************************************************************
void CFileDlgEx::CollectRecentFiles()
{
while(!m_FileList.IsEmpty())
m_FileList.RemoveHead();
HKEY hKey;
LONG hRes;
CString path(_T("SOFTWARE\\Program of F.R.Wen\\"));
path+=AfxGetApp()->m_pszAppName;
// open or create register by path
hRes=RegCreateKeyEx(HKEY_CURRENT_USER,
path,0,NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,&hKey,
NULL);
if(hRes==ERROR_SUCCESS)
{ // if open or create success then search recently file
CHAR achValue[MAX_PATH];
DWORD cchValue=MAX_PATH;
BYTE bData[MAX_PATH];
DWORD bcData=MAX_PATH;
RegQueryInfoKey(hKey,NULL,NULL,NULL,
NULL,NULL,NULL,&nNum,NULL,
NULL,NULL,NULL);
for(DWORD i=0;i<nNum;i++)
{
achValue[0]='\0';
cchValue=MAX_PATH;
hRes=RegEnumValue(hKey,i,achValue,
&cchValue,NULL,NULL,bData,&bcData);
if(hRes!=ERROR_SUCCESS){
i--;
continue;
}
CString strtemp(TEXT(bData));
m_FileList.AddTail(strtemp);
}
}
else // if open or create fail then return directly
{
return;
}
return;
}
//**************************************************************************************
int CFileDlgEx::DoModal()
{
// add default filter based on AddNewItem()
CString strAllFilter(_T(""));
CString strFilter(m_ofn.lpstrFilter);
for(POSITION pos=m_lstNewItems.GetHeadPosition();pos!=NULL;)
{
CNewItemInfo* pInfo=(CNewItemInfo*)m_lstNewItems.GetNext(pos);
strAllFilter += pInfo->m_strFileDescription;
strAllFilter += _T(" (*.");
strAllFilter += pInfo->m_strExtName;
strAllFilter += _T(")");
strAllFilter += (TCHAR)'\0';
strAllFilter += _T("*.");
strAllFilter += pInfo->m_strExtName;
strAllFilter += (TCHAR)'\0';
}
strAllFilter += _T("All Files (*.*)");
strAllFilter += (TCHAR)'\0';
strAllFilter += _T("*.*");
strAllFilter += (TCHAR)'\0';
strAllFilter += strFilter;
m_ofn.lpstrFilter=strAllFilter;
int nResult=CFileDialog::DoModal();
// update recently file list
if(nResult==IDOK&&GetPage()==CFileDlgEx::FileDlgExOpen)
{
if(m_FileList.Find(GetPathName())==NULL)
{
if(nNum>=MAX_NUM)
m_FileList.RemoveHead();
m_FileList.AddTail(GetPathName());
}
// write recently file to registery
HKEY hKey;
LONG hRes;
CString path(_T("SOFTWARE\\Program of F.R.Wen\\"));
path+=AfxGetApp()->m_pszAppName;
// open or create register by path
hRes=RegCreateKeyEx(HKEY_CURRENT_USER,
path,0,NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,&hKey,NULL);
int i=0;
POSITION pos=m_FileList.GetHeadPosition();
while(pos!=NULL)
{
CString cur=m_FileList.GetNext(pos);
CString lpSubKey;
lpSubKey.Format("File%d",i);
unsigned char tmp[256];
sprintf((char *)tmp,"%s",cur);
DWORD size=cur.GetLength()+1;
RegSetValueEx(hKey,(LPCTSTR)lpSubKey,0,REG_SZ,tmp,size);
i++;
}
RegCloseKey(hKey);
}
return nResult;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -