XFileDialog-自定义的CFileDialog
简介
被首次引入新的共同文件对话框时,我立刻喜欢他们期待的方式。但我也注意到,驱动器和目录下拉列表显得有点尴尬,特别是如果你想翻转两个不同的驱动器的目录。当我们从我们的客户开始听到同样的事情,我知道我们应尽量使其更容易选择一个文件夹。实现注意事项
我最初的想法是,”确定”,。这篇文章解释,将控件添加到CFileDialog的对话框,你要做的就是创建一个只包含你要添加的控件的对话框模板。 IDD_XFILEDIALOG定义为:IDD_XFILEDIALOG DIALOG DISCARDABLE 0,0,360,20风格DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS字体8″的MS Sans Serifquot;动工 LTEXT”文件夹:”,IDC_MRU_CAPTION,13,3,51,8,
; SS_CENTERIMAGE |不WS_GROUP &
#160; COMBOBOX IDC_MRU_COMBO,85,1,260,102,CBS_DROPDOWN |
0; CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP完
注意:此对话框的风格 – 他们是必要的适当的整合与CFileDialog的的。对话框中定义一旦你有了这个,你可以添加在您的派生类构造函数的CFileDialog:SetTemplate(0,_T(“IDD_XFILEDIALOGquot;));
我设置对话框模板和rc文件根据指引我在我的文章描述。
有一次,我对话框模板,然后,我开始解开如何整合与CFileDialog的秘密。正如我以前说过,这是比CFontDialog完全不同。而与CFontDialog所有控制是一个定制CFileDialog的一个对话框,你有两个层次的对话:新IDD_XFILEDIALOG实际上是一种原始的CFileDialog的孩子。这是暗示在MSDN文章,但我没有完全明白这是什么意思,直到我看到它使用我最喜爱的工具之一,
{S0}
正如你在截图中所看到的,IDD_XFILEDIALOG突出显示在窗口的树,它是”打开”对话框的孩子。这意味着在实施CXFileDialog方面,您可以访问IDD_XFILEDIALOG就像你在任何其他对话框上的所有控制 – 使用GetDlgItem()或使用DDX_Control。但是,CFileDialog的所有控制都是同级IDD_XFILEDIALOG – 访问这些网站,你必须使用GetParent()- GT; GetDlgItem(XXX)。一旦我理解这部分代码,其余的是很容易实现 – ,其中大部分是很容易。仍然有一些事情,位我。
到更多细节之前,让我告诉你我试图做什么。我想添加历史组合框,最近使用的文件夹,这样每次用户点击打开当前文件夹将被添加到历史记录列表。每CXFileDialog开幕时,历史列表中的项目将恢复到组合框(如果他们仍然是有效的目录)。我决定使用保罗维克里的优良照顾我,让检查的有效性的文件夹的修改,加载和保存文件夹项目。这里是XFileDialog看起来像什么:

当然也有平常的细节照顾 – 在OnSize()处理程序,如定位和上浆IDD_XFILEDIALOG控制。但是,当我测试CXFileDialog与前WIN2K布局,我发现,”文件名”控件的ID竟然出现了两种不同的价值观 – 之一(1152)时,它像一个编辑框(前WIN2K),另一个值(1148 )当它像一个组合框(WIN2K及以后)。此外,文件名控制,也影响了注册表设置,可用于启用/禁用的文件名的控制MRU属性。我怎么算出这个吗?同样,我用:
{S2}
接下来的事情,我测试是只读复选框。当然,当我启用了它,复选框自身定位我最近的文件夹控制上的正确,因为我已经忘了在OnSize()复选框。
最后,我测试前WIN2K布局。有没有足够的空间,静态标签”最近的文件夹”前WIN2K布局,我感动了所有组合框的权利。这里是新的预WIN2K布局:
{S3}CXFileDialog特点
这里是新CXFileDialog的特点:最近的文件夹MRU组合框 – 最近使用的文件夹列表添加一个组合框。从列表中选择一个文件夹,将改变的文件,显示该文件夹。
SetTitle() – 提供了一个方便的方式来设置对话框的标题。SetOsVersion() – 允许您选择旧式和资源管理器样式对话框。GetPath() – 获取选定的文件的路径。如何使用
融入你的应用程序CXFileDialog,你首先需要添加下列文件到您的项目:XFileDialog.cppXFileDialog.hXFileDialog.rcXFileDialogRes.hXHistoryCombo.cppXHistoryCombo.h
,您还需要添加XFileDialog.rc项目rc文件 – 去查看|资源包括… …在底部的列表框,向下滚动到最后。插入#包括”; XFileDialog.rcquot;右#ENDIF之前:
接下来,包括在适当的项目文件中的头文件XFileDialog.h。现在,你准备好开始使用CXFileDialog。演示程序
XFileDialogTest.exe演示展示了如何使用CXFileDialog:
{五}致谢在代码中。感谢保罗维克里。得益于出色的工具。
修订历史版本1.1 – 2003年6月25日修正了一些重点的错误;增加了检查目录是否存在。版本1.0 – 2003年6月24日首次公开发行。使用
本软件发布到公共领域。你在任何你喜欢的方式自由地使用它。如果您对其进行修改或扩展,请考虑张贴新的代码,在这里,供大家分享。这个软件是按”现况”提供,没有明示或暗示保证。我接受业务,该软件可能导致的任何损害或损失不承担任何责任。|汉斯迪特里希
回答
×评论会员:游客 时间:2011/11/29定制CFileDialg非常有用的解释
Kyudos:|喜汉斯,
,我一直在阅读试图解决一个具体的问题的大文章,但我觉得我什至不知道到底是什么问题… …
我有一个应用程序MFC VC6和我试图让”新风格”的文件对话框左侧的快捷按钮..例如,最近的文档/桌面/我的电脑/网络。我认为这将只是一个设置一个标志的情况下… …但我不能弄明白…
如果我呼吁:
OPENFILENAME ofn;
char szFileName[MAX_PATH] = “”;
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn); //SEE NOTE BELOWofn.hwndOwner = this->GetSafeHwnd();
ofn.lpstrFilter = “Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0”;
ofn.lpstrFile = szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
ofn.lpstrDefExt = “txt”;
if (GetOpenFileName(&ofn))
{
}
我得到的捷径对话框。但如果我使用CFileDialog的:
{C}
我不明白的捷径。
我可能会尝试,我不能似乎找到一个简单的答案为什么是这种情况。
你似乎有一个更好地把握这个东西 – 的呢?任何指针
干杯
×评论会员:汉斯迪特里希 时间:2011/11/29我认为这将有助于您阅读作者简介Paul DiLascia的文章,我参考上面,这是我根据我的文章!
最美好的祝愿,
汉斯
[
])
×评论会员:matt2000 时间:2011/11/29 1。最感兴趣的视图类型(详细)
2。排序顺序
3。对话框的大小
我已经到位的挂钩工作,只需要恢复其最后的状态。
它甚至有可能吗?
我一直在四处寻找,还没有找到一个解决方案。
最后,有一个库,将劫持的FileOpen对话框,并允许恢复?
感谢
×评论会员:vijayashree 时间:2011/11/29我有一个计算的结果(数据)和数据必须保存对话框CFileDialog的使用保存。如何做到这一点。我能够创建的文件和数据存储。但格式是不是我想要的。
iwanted数据要像
ABC的价值\ tabspace昂价值\换行
我给我的代码的下方。
浮动ABC;
INT昂;
– GT; UpdateData();
CString的STR;
CFile的F;
strFilter的char [] = {“Excel文件(*. TXT)| *. TXT |所有文件(*.*)|*.*||”}
CFileDialog的FileDlg(FALSE,NULL,0,strFilter”TXT”); 的CFileDialog::GetPathName; (FileDlg.DoModal()== IDOK)
{
f.Open(FileDlg.GetFileName()的CFile::modeCreate | CFile的:modeWrite);
CArchive的AR(放大器,F,CArchive的:存储);
(ANG = 0; anglt = 180; ANG)
{
ABC = 2昂
str.Format(“%F \ T%D”,ABC,ANG)
AR LT,LT; STR
} ar.Close()
f.Close()
}
ELSE
返回;
×评论会员:内维尔弗兰克斯 时间:2011/11/29 XFileDialog在Vista失败时使用VS2008。这是因为默认情况下,最新的MFC代码使用新的Vista(总管)风格的文件|打开的对话框,这是不符合SetTemplate(),将提出一个”企图不支持的操作”异常。
要继续使用旧的风格文件|打开的对话框和XFileDialog你需要设置新的CFileDialog(..,bVistaStyle)参数设置为FALSE。
相反,如果你要使用新的Vista风格的对话框中看到迈克尔邓恩的文章Vista的超值服务,在C:使用新的Vista文件对话框”{A}]
内维尔弗兰克斯,Surfulater

作者
×评论会员:汉斯迪特里希 时间:2011/11/29,本场比赛!
最美好的祝愿,
汉斯

×评论会员:dpackage 时间:2011/11/29我动态添加控件,所以我不使用模板
我也不能重写DoModal以同样的方式。我只是调用的CFileDialog:从我重写内部DoModal
。
现在,当我运行,没有扩展CFileDialog的事件后,对话框的初始负载的火,包括OnSize我真正需要的。
我是否需要手动执行DoModal的方式你吗?
修改,2009年2月10日,日(星期二)上午11时58分
×评论会员:爱芬 时间:2011/11/29这真的似乎是一个不错的东西。然而,当我下载,我已经做了一些工作,得到它的下编译的Visual Studio 2005亲。
它转换项目。然后尝试编译时,我得到:
1> C:\项目\ cxfiledialog \ xhistorycombo.cpp(260):错误C2065:’N’:未声明的标识符
这对我是有点古怪。这条线说:
(N = n最大,N CVTRES:致命错误CVT1100:重复的资源类型:MANIFEST,名称:1,语言:0X0409
1>链接:致命错误LNK1123:转换到COFF期间失败:文件无效或损坏的
这可以通过关闭增量链接的固定。
不知道是否有更好的解决方案。
在一个稍微相关的主题:
没有人知道一些示例代码,让我做多文件选择显示选定#文件时,显示一个计数器?
感谢,弗兰斯。
还有一件事:
当试图在我的项目我没有编辑的资源包括任何。
(如果我没有,我会得到重复的链接错误)。
另外,还要确保当您使用您正确地调用SetOsVersion
在创建您的对话。没有,我没有得到一个对话框。在XP中,我将值设置为1。不知道它确实应该
最后,当我在我自己的项目中包括的文件,我没有得到明显的错误,即使这样做增量链接
– 13:58周日第七年1月,2007年
修改
×评论会员:。nompel 时间:2011/11/29垃圾邮件删除
×评论会员:内维尔弗兰克斯 时间:2011/11/29目前处于起始目录可以被任意数量的directrories
如果OPENFILENAME.lpstrInitialDir是NULL的初始目录会有所不同的Windows版本而定,当前目录中是否有匹配指定的过滤器等,见
lpstrInitialDir文件详情]文件。
在W2K和XP的初始目录,可以设置到由Windows保留上次使用的应用程序对话框时的值。
这可以被所有用户相当混乱和不匹配的MRU组合设置。
我已经更新了汉族的代码,并补充说:CXFileDialog:SetInitialDir()。这让您可以指定一个初始目录或使用目录选择对话框是最后一次。我已经更新CHistoryCombo代码以及添加CHistoryCombo:GetHistoryMRU()
。
您可以下载我的更新:

内维尔弗兰克斯,Surfulater

作者
×评论会员:BaliDawg 时间:2011/11/29这杀了我几个小时的时间,所以我张贴相关文章。返回值的CFileDialog::OnFileNameOK()向后:真=保持对话框打开,FALSE,=关闭(见MSDN库)。如果覆盖的CFileDialog:OnFileNameOK()来验证你的控制,做类似以下内容:
布尔CMySaveDialog:OnFileNameOK()
{
/ /使用的DDX来验证我们的控制。
BOOL bDDXResult = UpdateData(TRUE);
/ /调用基类并关闭对话框的DDX成功。 (bDDXResult == TRUE)
{
60; CFileDialog的:OnFileNameOK()
;返回FALSE;
}
/ /否则,保持对话框打开。
返回TRUE;}
曾经有一个固定本身的错误,?我讨厌那些!
×评论会员:桐子 时间:2011/11/29喜
它不完全有关XFileDialog,但我想我可能会得到一些相关信息。我有我自己的类,这是从CFileDialog派生。它底部的一个额外的检查中,除了文件名编辑框和文件类型组合框。我在OnInitDialog中创建检查”按钮,并给它一个ID。我也有这方面的检查按钮的点击功能。不幸的是,它得到完全忽略。
我有一个消息映射上按一下功能。我得到的数据交换。我有另一个对话框,类似的事情,一个工程。我比我的作品,看不出有任何区别的一个新的尝试。我已经错过了?任何帮助greately赞赏。

×评论会员:matt2000 时间:2011/11/29我在我们的应用程序中使用这个类,它的伟大的工作。几个客户要求能够保存/恢复列的宽度,视图,对话框的大小。目前,它复位。
任何想法?
,
马特
:
×评论会员:游客 时间:2011/11/291|zhou_wz。SetTemplate只能在同一进程中的EXE。当我谨XFileDialogDLL模块,我觉得SetTemplate不能正常工作。我该如何解决呢?2。我怎样才能赶上IDOK点击,我觉得我不能抓住这个消息,连我自己重写的OnOK…
matt2000
×评论会员:游客 时间:2011/11/29汉斯,展望保存附件”对话框使您能够做出新的左侧文件夹按钮。此链接显示我讲:imgsrc=我有2个问题:1。可以自定义的左侧按钮被添加到一个对话框2。工具栏按钮可以添加以及谢谢你-伟大的工作。马特-15时50分星期三第15届年2月,2006年修改
汉斯迪特里希
×评论会员:游客 时间:2011/11/29喜马特,关于地方栏(“左侧文件夹按钮”),它可以添加自定义按钮。这个MSDN文章解释了如何:http://msdn.microsoft.com/msdnmag/issues/03/03/CuttingEdge/我没有检查,但根据文章,有一个最大的5个按钮(总)允许。因此,它可能无法帮助您。我没有看过,添加自定义工具栏按钮。我没有任何计划,现在添加这些功能。最美好的祝愿,汉斯
拉尔夫
×评论会员:游客 时间:2011/11/29喂汉斯,首先感谢很多为您的大文章!这有助于我真的很多自定义我的打开文件对话框。我显示额外的信息,根据选定的文件,这是工作的罚款,当用户选择在列表控件中的新文件。但现在的问题:我怎样才能收到一条消息或通知,当用户选择一个新的文件名,通过最近的”文件名”组合框{BR}我试着钩程序和PreTranslateMesg,但没有成功!可能是你有一个想法。非常感谢拉尔夫
taphan
×评论会员:游客 时间:2011/11/29喜汉斯迪特里希,我很抱歉地问一个问题不属于此主题。我想子类的CFileDialog,抓住重点,当控件获得焦点。但我真的不知道如何实现你能帮助我吗?,抟
gabriel927
×评论会员:游客 时间:2011/11/29覆盖该文件的数据追加到现有的数据文件,而不是有没有办法呢?
gabriel927
×评论会员:游客 时间:2011/11/29有没有办法通过一个文件对话框覆盖目前现有的文件,而不是追加到它呢?
露西
×评论会员:游客 时间:2011/11/29只是一个意见,有关m_nIdFileNameCombo,你可以使用包括访问控制IDedt1,而不是硬编码的1148或1152。
Mihir戈尔
×评论会员:游客 时间:2011/11/29我能够在一个对话框中嵌入自己的对话框。但我怎么在我的对话框中嵌入文件对话框?
CoderPond
×评论会员:游客 时间:2011/11/29我花了相当长的时间试图做到这一点(嵌入在另一个打开/保存对话框)我和得出的结论,它不能很容易做到,如果在所有。文件对话框是不能这样做。我发现它可能与CPrintDialog,但在这篇文章中提到的打开/保存对话框是不同的。你可以找到一个有用的文章:如何自定义的CPrintDialoghttp://www.developer.com/net/cplus/article.php你可以找到一个有用的文章:如何嵌入对话框http://www.codeproject.com/dialog/stackdialog.asp”我的印象是,这将是更容易实现自己的文件对话框和嵌入,用同样的方式,您目前嵌入对话框。我希望这样可以节省其他人从waisting自己的时间,但我会感兴趣地听到,如果任何人有过这种成功。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227110.html原文链接:https://javaforall.net
