横秋扫盲系列(2): CFileDialog 文件对话框 -- 2005-8-14 17:22:32

一:参数设置
a)初始化目录 如我的电脑 等
dlg.m_ofn.lpstrInitialDir=_T("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}");

b)Win2000方式
if(GetVersion()<0x80000000) dlg.m_ofn.lStructSize += 12;//即88

c)扩展对话框
一般在对话框DoModal前设置支持模版
dlg.m_ofn.Flags |= OFN_ENABLETEMPLATE;
dlg.m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FILE_DIALOG);
如果要改变内嵌CFileDialog的位置,添加一个ID为stc32的Static即可

二:重载对话框
a)修改按钮文本
通过重载,或设置callback
class CFileDialogEng:public CFileDialog
{
public:
void OnInitDone()
{
CWnd *pWnd,*pParent=GetParent();
if(pParent)
{
pParent->SetWindowText(m_bOpenFileDialog?"Open":"Save as");
#define SetEngText(id,txt) if(pWnd = pParent->GetDlgItem(id))pWnd->SetWindowText(txt)
SetEngText(IDOK,"&OK");
}
}
}

b)修改目录(如自写几个按钮模拟Win2000左边的列表点击)
GetParent()->SendMessage(CDM_SETCONTROLTEXT, edt1, (LPARAM)(LPCTSTR)strFolder);
GetParent()->SendMessage(WM_COMMAND, MAKEWPARAM(IDOK, BN_CLICKED),(LPARAM)GetDlgItem(IDOK)->GetSafeHwnd());

c)设置查看模式
Paul推荐了在Init后处理
LRESULT OnPostInit(WPARAM w,LPARAM l)
{
CWnd* pshell = GetParent()->GetDlgItem(0x461);
if (pshell) {
pshell->SendMessage(WM_COMMAND, ODM_VIEW_THUMBS);
}
return 0;
}
在OnInitDialog或OnInitDone中
PostMessage(MYWM_POSTINIT);

其中enum LISTVIEWCMD
{ODM_VIEW_ICONS = 0x7029,
ODM_VIEW_LIST  = 0x702b,
ODM_VIEW_DETAIL= 0x702c,
ODM_VIEW_THUMBS= 0x702d,
ODM_VIEW_TILES = 0x702e,
};

详情见MSDN Magazine -- March 2004
http://msdn.microsoft.com/msdnmag/issues/04/03/CQA/
List View Mode, SetForegroundWindow, and Class Protection

但如果设置为REPORT即DETAIL风格,建议使用以下,相对来说不闪一点,因为在OnInitDialog中处理
BOOL OnInitDialog()
{
CFileDialog::OnInitDialog();

CWnd *parent = GetParent();
if ( parent != NULL ) {
   parent->PostMessage(WM_COMMAND, 40964, NULL);//0xA004
}

return TRUE;
}
详见: Detail View in FileOpen Dialog
http://codeguru.com/Cpp/W-D/dislog/commondialogs/article.php/c5031/

三: IShellBrowser 接口
July 9, 2000 就在 Q157247 出现了 WM_GETISHELLBROWSER ,但一直没公布
#ifndef WM_GETISHELLBROWSER
#define WM_GETISHELLBROWSER (WM_USER+7)
#endif

IShellBrowser *pshb=(IShellBrowser *)GetParent()->SendMessage(WM_GETISHELLBROWSER,0,0);

详情见 jiangsheng 的 Better Late Than Never
http://blog.joycode.com/jiangsheng/archive/2004/09/17/33756.aspx

P.S.如何扩充多选文件缓冲区
使用CFileDialog类并设置OFN_ALLOWMULTISELECT标志时,OPENFILENAME结构体的lpstrFile成员是一个指向用户申请分配的缓冲区,里面接受所选的路径和文件名列表,这个列表的每一项由一个NULL隔开,最末以两个NULL结束。
nMaxFile成员指明了缓冲区的大小,如果所选择的文件名的加起来的总长度超过了此值,则DoModal函数返回IDCANCEL,如果用户试图打开超过缓冲区大小的文件集的话,CommDlgExtendedError()将返回FNERR_BUFFERTOOSMALL,这时候,lpstrFile的前两个byte将会包含实际需要的缓冲区的字节数。
如果是在Windows NT 4.0下,能被拷贝到lpstrFile缓冲区的字节数被限制在2562字节以内,如果超过将被截断,但可以通过安装 Service Pack 2 解决
默认修改了nMaxFile就可以解决缓冲区不足的问题,但GetOpenFileName限制了复制到缓冲区中的文件名的总长度,一般32K,所以若要打开大量文件,参见
http://blog.joycode.com/jiangsheng/archive/2004/11/22/39413.aspx

另外打开并正常关闭对话框后如果程序不退出就不能删除该目录,请在dlg打开前
dlg.m_ofn.Flags |= OFN_NOCHANGEDIR;

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ MFC中的文件打开和保存对话框可以通过CFileDialog类来实现。CFileDialog类是MFC提供的一个对话框类,用于选择文件的打开和保存操作。 要使用CFileDialog类,首先需要包含头文件<afxdlgs.h>。然后可以创建一个CFileDialog对象,并使用DoModal()函数来显示对话框。 下面是一个简单的示例代码,演示如何使用CFileDialog类来实现文件的打开和保存对话框: ```cpp #include <afxdlgs.h> // 文件打开对话框示例 void OpenFile() { CFileDialog dlg(TRUE); // 创建一个打开文件对话框 if (dlg.DoModal() == IDOK) // 显示对话框并检查用户是否点击了“打开”按钮 { CString filePath = dlg.GetPathName(); // 获取用户选择的文件路径 // 在这里可以对文件进行处理,比如读取文件内容等 } } // 文件保存对话框示例 void SaveFile() { CFileDialog dlg(FALSE); // 创建一个保存文件对话框 if (dlg.DoModal() == IDOK) // 显示对话框并检查用户是否点击了“保存”按钮 { CString filePath = dlg.GetPathName(); // 获取用户选择的文件路径 // 在这里可以将数据保存到文件中 } } ``` 在上面的示例代码中,OpenFile()函数演示了如何使用CFileDialog类来实现文件的打开对话框。首先创建一个CFileDialog对象,参数TRUE表示打开文件对话框。然后调用DoModal()函数显示对话框,并检查用户是否点击了“打开”按钮。如果用户点击了“打开”按钮,可以通过GetPathName()函数获取用户选择的文件路径。 SaveFile()函数演示了如何使用CFileDialog类来实现文件的保存对话框。与打开对话框类似,首先创建一个CFileDialog对象,参数FALSE表示保存文件对话框。然后调用DoModal()函数显示对话框,并检查用户是否点击了“保存”按钮。如果用户点击了“保存”按钮,可以通过GetPathName()函数获取用户选择的文件路径。 需要注意的是,CFileDialog类还提供了其他一些函数来设置对话框的标题、过滤器、默认文件名等属性,可以根据实际需求进行设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值