【问题标题】:Is there a way to parent a standard Windows dialog inside another form?有没有办法在另一个表单中设置标准 Windows 对话框?
【发布时间】:2014-01-23 13:08:11
【问题描述】:

我知道可以使用a dialog that you built yourself and parent it on another form。但是是否可以在您设计的表单上设置标准 Windows 系统对话框的父级?

具体来说,我正在尝试设置一个包含多个选项卡的表单,这些选项卡提供了不同的方式来获取对程序使用的数据的引用。其中一个选项卡应该代表文件系统,理想的方法是使用the standard Open dialog,可以使用 COM 标识符 CLSID_FileOpenDialog 进行实例化。

有什么方法可以让系统对话框在另一个窗口上显示为父窗口,没有边框、标题栏等?

【问题讨论】:

    标签: windows winapi


    【解决方案1】:

    有很多方法可以使用钩子,通过SetWindowsHookEx()SetWinEventHook() 来获取系统对话框的HWND,然后你可以用它做任何你想做的事情,例如调用SetParent()。但仅仅因为你可以并不意味着你应该。系统对话框被设计为作为它们自己的窗口运行,而不是嵌入到其他人的窗口中。更好的解决方案可能是通过IShellFolder::CreateViewObject()SHCreateShellFolderView() 使用Windows 资源管理器(和系统对话框)使用的相同Shell 显示组件,或者找到一个第三方解决方案来完成与Shell 交互的艰苦工作你。

    【讨论】:

    • 我已经考虑过了。但是构建我自己的 shell 视图的问题在于,即使我构建了一个看起来与当前 Windows 对话框完全一样的视图,当下一版本的 Windows 发布时,它也可能看起来不像当前对话框。将出现一个操作系统对话框。
    • 这很棘手,因为您正在尝试采用模式对话框(带有自己的消息循环)并使其无模式,以便它使用应用程序消息循环。因此,以某种方式(使用钩子或某种方式),您必须在创建对话框之后但在它进入其模型循环之前访问该对话框。只需查看 MFC CDialog::DoModal() 即可了解所涉及的复杂性。不适合胆小的人!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多