我是我的应用程序,我在标准的Windows文件打开对话框中添加了一个下拉框。这工作正常,但我想将此下拉框正好位于文件名和文件掩码编辑控件的正下方,其标签正好位于这些控件的标签下方。 如何获取这些控件的位置和相应的标签(这取决于Windows版本,甚至取决于主题,因此使用使对话框在我的计算机上看起来很好的常量不会这样做?)
答案 0 :(得分:4)
在Vista +上,您应该使用IFileDialog
,IFileOpenDialog
和IFileDialogCustomize
接口:
您可以使用IFileDialogCustomize::AddText()
和IFileDialogCustomize::AddComboBox()
方法向对话框添加下拉列表及其标签,如果需要,可使用IFileDialogControlEvents::OnItemSelected
事件对用户选择做出反应下拉列表中的项目。
但是,在自定义此对话框时,无法确定自定义控件的显示位置。 UI布局由对话框本身控制:
Windows Vista中的Common Item Dialog实现提供了优于早期版本中提供的实现的几个优点:
...
•启用对话框的简单自定义,例如在OK按钮上设置标签,无需挂钩程序 •通过添加一组在没有Win32对话框模板的情况下运行的数据驱动控件,支持对对话框进行更广泛的自定义。 此自定义方案从UI布局中释放调用进程。由于对对话设计的任何更改都继续使用此数据模型,因此对话框实现不依赖于对话框的特定当前版本。
...
它提供的唯一布局访问权限是添加自定义控件和任何可视分组的顺序。因此,您可以使用IFileDialogCustomize::StartVisualGroup()
创建新组,然后调用AddText()
和AddComboBox()
(按此顺序)将这些控件添加到组中,最后调用{{3} }。
另一方面,当使用IFileDialogCustomize::EndVisualGroup()
代替时,可以使用一些不同的选项来自定义该对话框,并且它们允许您对对话框的布局进行更精细的控制:
Customizing Common Dialog Boxes
首选选项是创建自定义对话框模板并在Open and Save As Dialog Box Customization结构中指定它。在模板中,您可以拥有所需的任何控件和布局,然后可以将模板作为标准资源管理器样式对话框的子项插入,或者替换为标准旧式对话框。 MSDN记录了如何在资源管理器风格的对话框中自定义模板:
要为新控件腾出空间,系统会根据自定义对话框的宽度和高度展开默认对话框。默认情况下,自定义对话框中的所有控件都位于默认对话框中的控件下方。 但是,您可以通过在自定义对话框模板中包含静态文本控件并为其指定控制标识符值stc32来覆盖此默认定位。 (此值在Dlgs.h头文件中定义。)在这种情况下,系统使用控件作为参考点来确定新控件的位置。上面和左侧的所有新控件stc32控件的位置与默认对话框中控件的上方和左侧相同。 stc32控件下方和右侧的新控件位于默认控件的下方和右侧。通常,每个新控件的位置都应使其与默认控件的位置与stc32控件相同。为了为这些新控件腾出空间,系统会根据需要在默认对话框的左侧,右侧,底部和顶部添加空间。
替代方案,不使用自定义模板,是直接获取对话框自己的HWND
(可以在分配给OPENFILENAME::lpfnHook
字段的钩子函数中获取)然后你完全有权使用对话框做任何你想做的事情。 Microsoft将Explorer-Style Custom Templates分配给资源管理器样式对话框的标准控件(因此您必须为此方法指定 OFN_EXPLORER 标志),并且这些ID是在Windows版本中保持一致。这些ID旨在与fixed control IDs和CDM_SETCONTROLTEXT
消息一起使用,但它们也可以与CDM_HIDECONTROL
一起使用以获取某些对话框控件的HWND
,在这种情况下 cmb13 , edt1 和 stc3 控件:
<强> cmb13 强>
显示当前文件名称的下拉组合框允许用户键入要打开的文件的名称,并选择最近打开或保存的文件。这适用于早期与Explorer兼容的应用程序,不带钩子或对话框模板。与edt1比较。<强> edt1 强>
编辑控件,显示当前文件的名称,或允许用户键入要打开的文件的名称。与cmb13比较。<强> STC3 强>
cmb13组合框和edt1编辑控件的标签
获得HWND
后,您可以手动查询其当前位置和尺寸,根据需要在其下方添加自定义下拉列表,并调整对话框HWND
的大小容纳你的下拉列表。
无论是使用模板还是直接HWND
操作,您都需要使用对话框挂钩功能来根据需要处理下拉列表中的消息,例如GetDlgItem()
通知。