📄 filedlg.cpp
字号:
/********************************************************************
Copyright 2006-2008 ZHANG Luduo. All Rights Reserved.
Permission to use, copy, modify, distribute and sell this software
and its documentation for any purpose is hereby granted without fee,
provided that the above copyright notice appear in all copies and
that both that copyright notice and this permission notice appear
in supporting documentation.
********************************************************************/
/*
代码描述:
通用对话框之[文件打开], [文件保存], [目录浏览]
关于作者:
姓名 - 张鲁夺, ZHANG Luduo
MSN - zhangluduo@msn.com
Email - zhangluduo@163.com
QQ群 - 34064264, 56918155, 56918241
网站 - http://www.oopfans.com
为所有爱我的人和我爱的人努力!
*/
#include "stdafx.h"
#include "FileDlg.h"
FileDlg::FileDlg()
{
m_NameBuf = NULL;
m_bBrowseInit = FALSE;
m_dwBufferSize = 1024;
memset(&m_OFNOpen, 0, sizeof(OPENFILENAME));
memset(&m_OFNSave, 0, sizeof(OPENFILENAME));
memset(&m_BIFBrowse, 0, sizeof(BROWSEINFO));
TCHAR tbuf[MAX_PATH] = { 0 };
GetModuleFileName(NULL, tbuf, MAX_PATH);
m_InitDir = tbuf;
m_InitName = tbuf;
m_InitDir = m_InitDir.substr(0, m_InitDir.find_last_of(_T("\\")) + 1);
m_InitName = m_InitName.substr(m_InitName.find_last_of(_T("\\")) + 1);
m_OFNOpen.lStructSize = sizeof(OPENFILENAME);
m_OFNSave.lStructSize = sizeof(OPENFILENAME);
OSVERSIONINFOEX osvi = { 0 };
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
GetVersionEx((OSVERSIONINFO *)&osvi);
switch(osvi.dwPlatformId)
{
case VER_PLATFORM_WIN32_WINDOWS:
if( (osvi.dwMajorVersion==4 && osvi.dwMinorVersion ==10) || //win 98
(osvi.dwMajorVersion==4 && osvi.dwMinorVersion ==90) || //win Me
(osvi.dwMajorVersion==3 && osvi.dwMinorVersion ==51) || //win NT 3.51
(osvi.dwMajorVersion==4 && osvi.dwMinorVersion ==0)) //win NT 4.0
{
m_OFNOpen.lStructSize = 76;
m_OFNSave.lStructSize = 76;
}
break;
case VER_PLATFORM_WIN32_NT:
if( (osvi.dwMajorVersion==5 && osvi.dwMinorVersion ==0) || //win 2000
(osvi.dwMajorVersion==5 && osvi.dwMinorVersion ==1) || //win xp
(osvi.dwMajorVersion==5 && osvi.dwMinorVersion ==2)) //win 2003
{
m_OFNOpen.lStructSize = 88;
m_OFNSave.lStructSize = 88;
}
break;
default:
{
m_OFNOpen.lStructSize = 76;
m_OFNSave.lStructSize = 76;
}
}
}
FileDlg::~FileDlg()
{
if(NULL != m_NameBuf)
delete[] m_NameBuf;
}
UINT_PTR FileDlg::OpenProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if(uMsg == WM_INITDIALOG)
{
RECT rtWnd, rcSys;
::GetWindowRect(GetParent(hWnd), &rtWnd);
SystemParametersInfo(SPI_GETWORKAREA, 0, &rcSys, 0);
::MoveWindow(GetParent(hWnd),
(rcSys.right - (rtWnd.right - rtWnd.left)) / 2,
(rcSys.bottom - (rtWnd.bottom - rtWnd.top)) / 2,
rtWnd.right - rtWnd.left, rtWnd.bottom - rtWnd.top,
true);
}
return 0;
}
UINT_PTR FileDlg::SaveProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if(uMsg == WM_INITDIALOG)
{
RECT rtWnd, rcSys;
::GetWindowRect(GetParent(hWnd), &rtWnd);
SystemParametersInfo(SPI_GETWORKAREA, 0, &rcSys, 0);
::MoveWindow(GetParent(hWnd),
(rcSys.right - (rtWnd.right - rtWnd.left)) / 2,
(rcSys.bottom - (rtWnd.bottom - rtWnd.top)) / 2,
rtWnd.right - rtWnd.left, rtWnd.bottom - rtWnd.top,
true);
}
return 0;
}
int FileDlg::BrowseProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
if(uMsg == WM_INITDIALOG)
{
RECT rtWnd, rcSys;
::GetWindowRect(GetParent(hWnd), &rtWnd);
SystemParametersInfo(SPI_GETWORKAREA, 0, &rcSys, 0);
::MoveWindow(GetParent(hWnd),
(rcSys.right - (rtWnd.right - rtWnd.left)) / 2,
(rcSys.bottom - (rtWnd.bottom - rtWnd.top)) / 2,
rtWnd.right - rtWnd.left, rtWnd.bottom - rtWnd.top,
true);
}
if(m_bBrowseInit)
{
if(uMsg == BFFM_INITIALIZED)
::SendMessage(hWnd, BFFM_SETSELECTION, 1, (WPARAM)m_InitDir.c_str());
}
else
{
if(uMsg == BFFM_INITIALIZED)
::SendMessage(hWnd, BFFM_SETSELECTION, 1, (WPARAM)_T(""));
}
if(uMsg == BFFM_SELCHANGED )
{
TCHAR buf[MAX_PATH + 1] = { 0 };
if(SHGetPathFromIDList((LPCITEMIDLIST)lParam, buf) && buf != 0)
{
::SendMessage(hWnd, BFFM_ENABLEOK, 0, 1);
::SendMessage(hWnd, BFFM_SETSTATUSTEXT, 0, (LPARAM)buf);
}
else
{
::SendMessage(hWnd, BFFM_ENABLEOK, 0, 0);
}
}
return 0;
}
vector<tstring> FileDlg::GetOpenFileName(HWND hWnd, BOOL bMultiSelect,
TCHAR* strFilter, tstring strInitName, tstring strInitDir)
{
m_OFNOpen.hwndOwner = hWnd;
m_OFNOpen.Flags |= OFN_EXPLORER | OFN_ENABLEHOOK | OFN_FILEMUSTEXIST | OFN_ENABLESIZING;
m_OFNOpen.nMaxFile = m_dwBufferSize;
m_OFNOpen.lpfnHook = (LPOFNHOOKPROC)m_lpOpenProc.Thiscall(this, Thunk::GetMemberFxnAddr(&FileDlg::OpenProc));
if(bMultiSelect)
m_OFNOpen.Flags |= OFN_ALLOWMULTISELECT;
else
m_OFNOpen.Flags &= ~OFN_ALLOWMULTISELECT;
if(NULL == strFilter)
m_OFNOpen.lpstrFilter = _T("All Files (*.*)\0*.*\0\0");
else
m_OFNOpen.lpstrFilter = strFilter;
if(!strInitDir.empty())
m_InitDir = strInitDir;
m_OFNOpen.lpstrInitialDir = m_InitDir.c_str();
if(NULL != m_NameBuf)
delete[] m_NameBuf;
m_NameBuf = new TCHAR[m_dwBufferSize + 1];
for(int i = 0; i < m_dwBufferSize + 1; i++)
m_NameBuf[i] = 0;
if(!strInitName.empty())
_tcsncpy(m_NameBuf, strInitName.c_str(), strInitName.length());
m_OFNOpen.lpstrFile = m_NameBuf;
vector<tstring> Names;
if(!::GetOpenFileName(&m_OFNOpen))
goto LABEL_RETURN;
{
TCHAR* ptr = m_OFNOpen.lpstrFile;
if(!(m_OFNOpen.Flags & OFN_ALLOWMULTISELECT))
{
Names.push_back(tstring(ptr));
goto LABEL_RETURN;
}
int nFiles = 0;
tstring strDir = _T("");
while(*ptr++)
{
if(1 == ++nFiles)
{
if(GetFileAttributes(ptr - 1) & FILE_ATTRIBUTE_DIRECTORY)
{
strDir = ptr - 1;
if(strDir[strDir.length() - 1] != '\\')
strDir += '\\';
}
else
{
Names.push_back(tstring(ptr - 1));
break;
}
}
else
{
Names.push_back(strDir + (ptr - 1));
}
while(*ptr++);
}
}
LABEL_RETURN:
// save current directory
if(Names.size() > 0)
m_InitDir = Names[0].substr(0, Names[0].find_last_of(_T("\\")));
delete[] m_NameBuf;
m_NameBuf = NULL;
return Names;
}
tstring FileDlg::GetSaveFileName(HWND hWnd, BOOL bAutoAddExtName,
TCHAR* strFilter, tstring strInitName, tstring strInitDir)
{
m_OFNSave.hwndOwner = hWnd;
m_OFNSave.Flags |= OFN_EXPLORER | OFN_ENABLEHOOK | OFN_OVERWRITEPROMPT | OFN_FILEMUSTEXIST | OFN_ENABLESIZING;
m_OFNSave.nMaxFile = m_dwBufferSize;
m_OFNSave.lpfnHook = (LPOFNHOOKPROC)m_lpSaveProc.Thiscall(this, Thunk::GetMemberFxnAddr(&FileDlg::SaveProc));
if(NULL == strFilter)
m_OFNSave.lpstrFilter = _T("All Files (*.*)\0*.*\0\0");
else
m_OFNSave.lpstrFilter = strFilter;
if(!strInitDir.empty())
m_InitDir = strInitDir;
m_OFNSave.lpstrInitialDir = m_InitDir.c_str();
if(NULL != m_NameBuf)
delete[] m_NameBuf;
m_NameBuf = new TCHAR[m_dwBufferSize + 1];
for(int i = 0; i < m_dwBufferSize + 1; i++)
m_NameBuf[i] = 0;
if(!strInitName.empty())
_tcsncpy(m_NameBuf, strInitName.c_str(), strInitName.length());
m_OFNSave.lpstrFile = m_NameBuf;
tstring strFileName = _T("");
if(!::GetSaveFileName(&m_OFNSave))
goto LABEL_RETURN;
// Get file name
strFileName = m_OFNSave.lpstrFile;
// save current directory
if(!strFileName.empty())
m_InitDir = strFileName.substr(0, strFileName.find_last_of(_T("\\")));
if(!bAutoAddExtName)
goto LABEL_RETURN;
{
BOOL bExtName = strFileName.find_last_of(_T(".")) == -1 ? FALSE : TRUE;
if(bExtName)
goto LABEL_RETURN;
vector<tstring> Filters;
TCHAR* ptr = (TCHAR*)m_OFNSave.lpstrFilter;
int odd = 0;
while(*ptr++)
{
odd++;
if(odd == 2)
{
Filters.push_back(ptr - 1);
odd = 0;
}
while(*ptr++);
}
tstring strFilter = Filters[m_OFNSave.nFilterIndex - 1];
if(strFilter == _T("*.*"))
goto LABEL_RETURN;
strFileName += strFilter.substr(strFilter.find_last_of(_T(".")));
}
LABEL_RETURN:
delete[] m_NameBuf;
m_NameBuf = NULL;
return strFileName;
}
tstring FileDlg::GetBrowseForFolder(HWND hWnd, tstring strInitDir)
{
if(!strInitDir.empty())
{
m_InitDir = strInitDir;
m_bBrowseInit = TRUE;
}
if(NULL != m_NameBuf)
delete[] m_NameBuf;
m_NameBuf = new TCHAR[m_dwBufferSize + 1];
for(int i = 0; i < m_dwBufferSize + 1; i++)
m_NameBuf[i] = 0;
m_BIFBrowse.hwndOwner = hWnd;
m_BIFBrowse.pszDisplayName = m_NameBuf;
m_BIFBrowse.ulFlags |= BIF_STATUSTEXT;
m_BIFBrowse.lpszTitle = _T("Please choose a forlder :");
m_BIFBrowse.lpfn = (BFFCALLBACK)m_lpBrowseProc.Thiscall(this, Thunk::GetMemberFxnAddr(&FileDlg::BrowseProc));
LPCITEMIDLIST lpcitemidlist = SHBrowseForFolder(&m_BIFBrowse);
if(!lpcitemidlist)
goto LABEL_RETURN;
if(!SHGetPathFromIDList(lpcitemidlist, m_BIFBrowse.pszDisplayName))
goto LABEL_RETURN;
m_InitDir = m_BIFBrowse.pszDisplayName;
m_bBrowseInit = TRUE;
return m_InitDir;
LABEL_RETURN:
delete[] m_NameBuf;
m_NameBuf = NULL;
return _T("");
}
void FileDlg::SetBufferSize(DWORD dwBufferSize)
{
if (0 >= dwBufferSize)
return;
m_dwBufferSize = dwBufferSize;
}
DWORD FileDlg::GetBufferSize()
{
return m_dwBufferSize;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -