?? 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.
********************************************************************/
/*
代碼說明 :
打開, 保存, 目錄瀏覽對話框之調用
聯系方式:
作者 - 張魯奪
MSN - zhangluduo@msn.com
Email - zhangluduo@163.com
QQ群 - 34064264, 56918155
為所有愛我的人和我愛的人努力!
*/
#include "stdafx.h"
#include "FileDlg.h"
#include <memory.h> // for memset function
FileDlg::FileDlg()
{
/** 判斷操作系統,
并根據操作系統填充結構體大小
*/
memset(&m_OFNOpen, 0, sizeof(OPENFILENAMEEX));
memset(&m_OFNSave, 0, sizeof(OPENFILENAMEEX));
memset(&m_BIFBrowse, 0, sizeof(BROWSEINFO));
OSVERSIONINFOEX osvi;
osvi.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX);
if(!GetVersionEx((OSVERSIONINFO *)&osvi)) return ;
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 = sizeof(OPENFILENAME);
m_OFNSave.lStructSize = sizeof(OPENFILENAME);
}
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 = sizeof(OPENFILENAMEEX);
m_OFNSave.lStructSize = sizeof(OPENFILENAMEEX);
}
break;
default:
return ;
}
// 初始目錄
char szAppName[MAX_PATH] = { 0 };
GetModuleFileName(NULL, szAppName, MAX_PATH);
string strAppName = szAppName;
m_InitDir = strAppName.substr(0,strAppName.find_last_of("\\")+1);
}
FileDlg::~FileDlg()
{
}
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(uMsg == BFFM_INITIALIZED && !m_InitDir.empty()) ::SendMessage(hWnd, BFFM_SETSELECTION, 1, (WPARAM)m_InitDir.c_str());
// 確定按鈕是否禁用
if(uMsg == BFFM_SELCHANGED )
{
char buf[MAX_PATH] = { 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<string> FileDlg::GetOpenFileName(HWND hWnd, bool bMulti, char* szFilter, char* szInitName)
{
vector<string> Files;
m_OpenNameBuf = new char[_FILEDLG_BUFSIZE + 1];
memset(m_OpenNameBuf, 0, _FILEDLG_BUFSIZE + 1);
if(szInitName != "\0") strcpy(m_OpenNameBuf, szInitName);
m_OFNOpen.lpstrFile = m_OpenNameBuf;
m_OFNOpen.nMaxFile = _FILEDLG_BUFSIZE;
m_OFNOpen.Flags |= OFN_EXPLORER | OFN_ENABLEHOOK | OFN_FILEMUSTEXIST | OFN_ENABLESIZING;
m_OFNOpen.hwndOwner = hWnd;
m_OFNOpen.lpstrInitialDir = m_InitDir.c_str();
m_OFNOpen.lpfnHook = (LPOFNHOOKPROC)m_ThunkOpen.Thiscall(this, Thunk::GetMemberFxnAddr(&FileDlg::OpenProc));
if(szFilter == NULL)
m_OFNOpen.lpstrFilter = "所有文件 (*.*)\0*.*\0\0";
else
m_OFNOpen.lpstrFilter = szFilter;
if(bMulti) m_OFNOpen.Flags |= OFN_ALLOWMULTISELECT;
string strTmp = "";
char* ptr = m_OFNOpen.lpstrFile;
int nFiles = 0;
if(!::GetOpenFileName(&m_OFNOpen))
{
delete[] m_OpenNameBuf;
return Files;
}
while(*ptr++)
{
nFiles++;
if(nFiles == 1)
{
strTmp = ptr - 1;
if(strTmp[strTmp.size() - 1] != '\\')
{
strTmp += "\\";
m_InitDir = strTmp;
}
}
else if(nFiles >= 2)
{
Files.push_back(strTmp+(ptr - 1));
}
while(*ptr++);
}
if(Files.size() ==0 ) Files.push_back(m_OFNOpen.lpstrFile);
// 返回
delete[] m_OpenNameBuf;
return Files;
}
string FileDlg::GetSaveFileName(HWND hWnd, bool AutoAddSuffixName, char* szFilter, char* szInitName)
{
m_OFNSave.Flags |= OFN_EXPLORER | OFN_ENABLEHOOK | OFN_OVERWRITEPROMPT | OFN_ENABLESIZING;
m_OFNSave.hwndOwner = hWnd;
m_OFNSave.lpfnHook = (LPOFNHOOKPROC)m_ThunkSave.Thiscall(this, Thunk::GetMemberFxnAddr(&FileDlg::SaveProc));
m_SaveNameBuf = new char[_FILEDLG_BUFSIZE + 1];
memset(m_SaveNameBuf, 0, _FILEDLG_BUFSIZE + 1);
// 初始化文件名
if(szInitName != "\0") strcpy(m_SaveNameBuf, szInitName);
m_OFNSave.lpstrFile = m_SaveNameBuf;
m_OFNSave.nMaxFile = _FILEDLG_BUFSIZE;
// 初始化目錄
m_OFNSave.lpstrInitialDir = m_InitDir.c_str();
if(szFilter == NULL)
m_OFNSave.lpstrFilter = "所有文件 (*.*)\0*.*\0\0";
else
m_OFNSave.lpstrFilter = szFilter;
// 顯示保存對話框
if(!::GetSaveFileName(&m_OFNSave))
{
delete[] m_SaveNameBuf;
// CString str;
// str.Format("Error Code = 0x%X, defined in file \"Cderr.h\"", CommDlgExtendedError());
// AfxMessageBox(str);
return "";
}
// 取文件名框中的輸入
string strFileName = m_SaveNameBuf;
// 保存當前打開的目錄名
m_InitDir = m_OFNSave.lpstrFile;
m_InitDir = m_InitDir.substr(0,m_InitDir.find_last_of("\\")+1);
// 是否為保存的文件名自動添加后綴名
if(!AutoAddSuffixName)
{
delete[] m_SaveNameBuf;
return strFileName;
}
// 判斷用戶填寫的文件名是否有后綴
bool bSuffix = strFileName.find_last_of(".") == -1 ? false : true;
if(bSuffix)
{
delete[] m_SaveNameBuf;
return strFileName;
}
//將"過濾器"中的串以'\0'分隔成數組存放
vector<string> FilterArray;
char* p = (char*)m_OFNSave.lpstrFilter;
int odd = 0;
while(*p++)
{
odd++;
if(odd == 2)
{
FilterArray.push_back(p - 1);
odd = 0;
}
while(*p++);
}
// 如果過濾類型為"*.*",則不進行處理,直接返回
string strFilter = FilterArray[m_OFNSave.nFilterIndex - 1];
strFilter.erase(remove_if(strFilter.begin(), strFilter.end(), ptr_fun(::isspace)), strFilter.end());
if(strFilter == "*.*")
{
delete[] m_SaveNameBuf;
return strFileName;
}
// 取過濾器中的后綴名
string strSuffixName = strFilter.substr(strFilter.find_last_of(".") + 1);
if(strSuffixName == "*")
{
delete[] m_SaveNameBuf;
return strFileName;
}
if(!bSuffix)
{
delete[] m_SaveNameBuf;
return strFileName + "." + strSuffixName;
}
delete[] m_SaveNameBuf;
return strFileName;
}
string FileDlg::GetBrowseForFolder(HWND hWnd, char* szInitPath)
{
m_BrowseNameBuf = new char[MAX_PATH + 1];
memset(m_BrowseNameBuf, 0, MAX_PATH + 1);
m_BIFBrowse.pszDisplayName = m_BrowseNameBuf;
m_BIFBrowse.hwndOwner = hWnd;
if(szInitPath != "\0") m_InitDir = szInitPath;
m_BIFBrowse.lpszTitle = "請選擇文件夾:";
m_BIFBrowse.pidlRoot = NULL;
m_BIFBrowse.ulFlags |= BIF_STATUSTEXT;
m_BIFBrowse.lpfn = (BFFCALLBACK)m_ThunkBrowse.Thiscall(this, Thunk::GetMemberFxnAddr(&FileDlg::BrowseProc));
LPCITEMIDLIST lpcitemidlist = SHBrowseForFolder(&m_BIFBrowse);
if(lpcitemidlist)
{
if(SHGetPathFromIDList(lpcitemidlist, m_BrowseNameBuf))
{
if((int)m_BrowseNameBuf[strlen(m_BrowseNameBuf) - 1] == (int)'\\')
{
string strRetVal = m_BrowseNameBuf;
delete[] m_BrowseNameBuf;
return strRetVal;
}
else
{
string strRetVal = string(m_BrowseNameBuf) + "\\";
delete[] m_BrowseNameBuf;
return strRetVal;
}
}
}
delete[] m_BrowseNameBuf;
return "";
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -