📄 filedlg.cpp
字号:
// FileDlg.cpp: implementation of the FileDlg class.
/*
* Copyright (c) 2006 - 2007 All Rights Reserved
*
* 程序作者:
* 张鲁夺(zhangluduo) : 为所有爱我的人和我爱的人努力!
*
* 联系方式:
* zhangluduo@msn.com
* QQ群:34064264
*
* 更新时间:
* 2007-10-31
*
* 功能描述:
* 打开, 保存, 目录浏览 对话框之调用
*
* 授权声明:
* 许可任何单位,个人随意使用,拷贝,修改,散布及出售这份代码,及其相关的
* 开发文档,但是必须保留此版权信息,以慰藉作者辛勤的劳动,及表明此代码
* 的来源,如若此份代码有任何BUG或者您有更好的修改建议, 请通知作者,以
* 便弥补作者由于水平所限而导致的一些错误和不足,谢谢!
*/
#include "stdafx.h"
#include "FileDlg.h"
#include <memory.h> // for memset
FileDlg::FileDlg()
{
/** 判断操作系统,
并根据操作系统填充结构体大小
*/
memset(&m_OFN, 0, sizeof(OPENFILENAMEEX));
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_OFN.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_OFN.lStructSize = sizeof(OPENFILENAMEEX);
}
break;
default:
return ;
}
// 初始目录
char szAppName[256] = {0};
GetModuleFileName(NULL, szAppName, 255);
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;
}
vector<string> FileDlg::GetOpenFileName(HWND hWnd, bool bMulti, char* szFilter, char* szInitName)
{
vector<string> Files;
m_NameBuf = new char[_FILEDLG_BUFSIZE + 1];
memset(m_NameBuf, 0, _FILEDLG_BUFSIZE + 1);
m_OFN.lpstrFile = m_NameBuf;
m_OFN.nMaxFile = _FILEDLG_BUFSIZE;
m_OFN.Flags |= OFN_EXPLORER | OFN_ENABLEHOOK | OFN_FILEMUSTEXIST;
m_OFN.hwndOwner = hWnd;
m_OFN.lpstrInitialDir = m_InitDir.c_str();
m_OFN.lpfnHook = (LPOFNHOOKPROC)m_ThunkOpen.thiscall(this, Thunk::GetAddr(&FileDlg::OpenProc));
if(szFilter != NULL)
m_OFN.lpstrFilter = szFilter;
if(bMulti)
m_OFN.Flags |= OFN_ALLOWMULTISELECT;
string strTmp = "";
char* ptr = m_OFN.lpstrFile;
int nFiles = 0;
if(!::GetOpenFileName(&m_OFN))
goto ERR;
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_OFN.lpstrFile);
// 返回
delete[] m_NameBuf;
return Files;
ERR:
delete[] m_NameBuf;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -