WTL文件选择对话框 - CFileDialogImpl
1)首先下面的代码是直接使用Win32 API来打开单个文件的代码:
void WinSDK_OpenFileDemo()
{
OPENFILENAME ofn = {0};
char szFile[MAX_PATH];
*szFile = 0;
// 开始设置OPENFILENAME结构成员
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hDlg;
ofn.lpstrFile = szFile;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFilter = "ESRI Shape文件(*.SHP)/0*.shp/0AutoCAD交换文件(*.DXF;*.DXF.GZ)/0*.dxf;*.dxf.gz /0所有图像文件/0*.jpg;*.jpeg;*.png;*.gif;*.bmp;*.tif;*.tiff/0所有文件(*.*)/0*.*/0/0";
ofn.nFilterIndex = 1;
ofn.lpstrTitle = "打开地图文件";
ofn.lpstrInitialDir = 0;
ofn.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST;
// 指派给"打开"对话框, 并显示对话框
if (::GetOpenFileName(&ofn))
{
// 现在下面的成员中存放了我们要的文件名
// ofn.lpstrFile;
}
}
2)类似的用WTL来实现文件打开的功能就简单多了。下面的代码同时打开多个文件:
LRESULT CMainFrame::OnFileOpen(...)
{
CMyFileDialog openFileDlg( TRUE,
_T("shp"),
_T(""),
OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT,
_T("Shape 文件(*.shp)|*.shp|CAD交换文件(*.dxf)|*.dxf|图像文件|*.jpg;*.jpeg;*.png;*.gif;*.bmp;*.tif;*.tiff|所有文件(*.*)|*.*|"),
this->m_hWnd,
_T("打开地图文件")
);
if ( IDOK == openFileDlg.DoModal() )
{
int nOpenFiles = openFileDlg.GetOpenFileCount();
if (nOpenFiles>0)
{
for (int i=0; i<nOpenFiles; i++)
{
//文件名:openFileDlg.GetOpenFileAt(i);
}
}
}
return 0;
}
3)完整的CMyFileDialog的代码如下(在WTL8.0, 8.1测试通过):
class CMyFileDialog :
public CFileDialogImpl<CMyFileDialog>
{
public:
// Construction
CMyFileDialog (BOOL bOpenFileDialog,
_U_STRINGorID szDefExt = 0U,
_U_STRINGorID szFileName = 0U,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_U_STRINGorID szFilter = 0U,
HWND hwndParent = NULL,
_U_STRINGorID szTitle= 0U ) :
CFileDialogImpl<CMyFileDialog>(bOpenFileDialog, NULL, NULL, dwFlags, NULL, hwndParent),
m_sDefExt(szDefExt.m_lpstr),
m_sFileName(szFileName.m_lpstr),
m_sFilter(szFilter.m_lpstr),
m_sTitle(szTitle.m_lpstr),
_FilesCount(-1)
{
m_ofn.lpstrDefExt = m_sDefExt;
m_ofn.lpstrFilter = PrepFilterString ( m_sFilter );
m_ofn.lpstrTitle = m_sTitle;
// setup initial file name
if ( !m_sFileName.IsEmpty() )
lstrcpyn ( m_szFileName, m_sFileName, _MAX_PATH );
}
// Maps
BEGIN_MSG_MAP(CMyFileDialog)
CHAIN_MSG_MAP(CFileDialogImpl<CMyFileDialog>)
END_MSG_MAP()
// Overrides
void OnInitDone ( LPOFNOTIFY lpon )
{
GetFileDialogWindow().CenterWindow(lpon->lpOFN->hwndOwner);
}
// Get Open Files Count
int GetOpenFileCount(void)
{
if (!m_bOpenFileDialog)
return 0;
if (_FilesCount==-1)
{
int i = 0;
int i0 = 0;
_FilesCount = 0;
while(i < _MAX_PATH-1){
if (m_szFileName[i]==0){
_FileStarts[_FilesCount++] = i0;
i0 = i+1;
if (m_szFileName[i+1]==0)
break;
}
i++;
}
if (_FilesCount>1){
_tcsncpy_s(_FileName, _MAX_PATH, m_szFileName, _FileStarts[1]);
_FileName[ _FileStarts[1] ] = 0;
_FileName[ _FileStarts[1]-1 ] = _T('//');
_FilesCount--;
}
}
return _FilesCount;
}
// Get Open FileName: index 0-based
LPCTSTR GetOpenFileAt(int index)
{
ATLASSERT(_FilesCount > 0);
if (_FilesCount==1){
ATLASSERT(index==0);
return m_szFileName;
}
_FileName[ _FileStarts[1] ] = 0;
_tcscat_s(_FileName, _MAX_PATH, m_szFileName + _FileStarts[index+1]);
return _FileName;
}
protected:
LPCTSTR PrepFilterString ( CString& sFilter )
{
LPTSTR psz = sFilter.GetBuffer(0);
LPCTSTR pszRet = psz;
while ( '/0' != *psz )
{
if ( '|' == *psz )
*psz++ = '/0';
else
psz = CharNext ( psz );
}
return pszRet;
}
int _FilesCount;
int _FileStarts[_MAX_PATH];
TCHAR _FileName[_MAX_PATH];
CString m_sDefExt, m_sFileName, m_sFilter, m_sTitle;
};
4)结论
编写windows客户端界面程序有不少于100种方法可用。经典的如MFC;时髦的如DHTML,Form,WPF;纯理论的如SDK;跨平台的如Java(这里面就有N多框架),QT等等。可是至今我觉得还是WTL/ATL最干净利落,也最强大。尤其WTL,虽然不是MS力推的主流,但这主要是因为MS为了.NET平台推广而有意压制的技术。WTL也是最适合我们玩的东西。
分享到:
相关推荐
使用WTL现成的一个文件对话框来选择一个图像文件,这个图像文件的格式可以使JPG和PNG。当然其它的图片也是可以的,只要图片文件合法且不要过大。随后使用D3D来载入图像,形成一个纹理。渲染纹理使用了最简单的滤波...
使用WTL现成的一个文件对话框来选择一个图像文件,这个图像文件的格式可以使JPG和PNG。当然其它的图片也是可以的,只要图片文件合法且不要过大。随后使用D3D来载入图像,形成一个纹理。渲染纹理使用了最简单的滤波...
WTL Tool Bar Drop-Down Extension(64KB)
WTL_Freecell-Release04-v1.3-20190126 (WTL空当接龙v1.3) 本程序主要特点介绍: 1、本程序全部使用WTL编程,VS2017编译,程序短小精悍,不依赖VC运行库; 2、本程序支持XP/7/8/8.1/10及相应Server版Windows系统...
运行WTL80.exe,程序自动将WTL所有的配置文件,生成到默认的目录下。 点击unzip.就可以直接生成文件。目录可以自己修改。
使用前,请先下载WTL.exe,见本人的下载资源中。 本人机器测试好用. 环境: Win7 64位, VS2005
wtl文件查看器,用于查看wtl文件,只能读取,不能写入文件。
WTL_Freecell v1.0 (WTL空档接龙v1.0) 20180110 本程序全部使用WTL编程,VS2017编译,程序短小精悍,不依赖VC运行库。本程序实现了真正的任意窗口大小,真正实现 全屏 满屏 最大化 大窗口 大图标 大字体。当屏幕...
一次编程中想更改对话框的字体,于是想想WTL可不可以做到呢?我当时尝试着使用标准的win32函数CreateFont来创建字体,并且返回字体的句柄。再在CStatic类里面调用SetFont()这个函数来使用字体。但是我没有成功。此外...
如何对可调整大小的对话框使用WTL的内置支持
WTL for MFC Programmers, Part II - WTL GUI Base Classes
wtl实现独特的按钮菜单风格;对话框界面;设置背景色。是不错的学习资料
目录 ...第四章 通用对话框 45 第五章 控件封装 47 第六章 打印与打印预览 52 第七章 属性页 56 第八章 消息过滤 59 第九章 空闲处理 62 第十章 UI更新 63 第十一章 消息分解 65 第十二章 WTL的未来 67
WTL之父写就的WTL技术白皮书,详细讲述了WTL的来龙去脉,是很好的深入WTL的参考资料。
在WTL中使用对话框和控件。
WTL developer Guide, WTL开发指南
用vs2010实现的项目, 只配置了Debug模式,虽然使用的是WTL来实现界面,但是消息映射是一样的,很容易移植到MFC. 详细内容查看 https://infoworld.blog.csdn.net/article/details/91960284