www.pudn.com > CRC32.rar > FileDlg.cpp
/* Copyright 2006 - 2008, All Rights Reserved. 打开, 保存, 目录浏览对话框之调用 作者 - 张鲁夺(zhangluduo) MSN - zhangluduo@msn.com QQ群 - 34064264 为所有爱我的人和我爱的人努力! */ #include "stdafx.h" #include "FileDlg.h" #include// for memset 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[256] = {0}; GetModuleFileName(NULL, szAppName, 255); string strAppName = szAppName; m_InitOpenDir = m_InitSaveDir = 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_InitBrowseDir.empty()) ::SendMessage(hWnd, BFFM_SETSELECTION, 1, (WPARAM)m_InitBrowseDir.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 FileDlg::GetOpenFileName(HWND hWnd, bool bMulti, char* szFilter, char* szInitName) { vector Files; m_OpenNameBuf = new char[_FILEDLG_BUFSIZE + 1]; if(m_OpenNameBuf == 0) AfxMessageBox("sdf"); 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_InitOpenDir.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_InitOpenDir = 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_InitSaveDir.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_InitSaveDir = m_OFNSave.lpstrFile; m_InitSaveDir = m_InitSaveDir.substr(0,m_InitSaveDir.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 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_InitBrowseDir = 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 ""; }