在 MFC 对话框中拖放

Posted

技术标签:

【中文标题】在 MFC 对话框中拖放【英文标题】:Drag and drop in MFC Dialog 【发布时间】:2020-04-22 16:19:32 【问题描述】:

我正在尝试将拖放功能添加到属性页上的控件,该属性页在运行时以编程方式“包装”在 MFC 对话框中。这种“包装”涉及将属性页实例化为对话框的成员,然后调整它的大小并将其定位到 .rc 文件中对话框上的图片控件的尺寸。我不确定为什么要这样做,除了可能标准化应用程序中属性页的外观,但无论如何我最终都会得到这个复杂的窗口层次结构,一个图片控件内的属性页内的控件在对话框中。

我要接受拖动文件的控件已调用 DragAcceptFiles,但我认为控件的 WM_DROPFILES 消息在到达控件之前被丢弃,因为其中一个父窗口不接受拖动的文件。我考虑在所有父母上调用DragAcceptFiles,并将WM_DROPFILES 传递到窗口链中,但我不想这样做,因为他们没有处理程序来接受文件,并且会显示指示文件的图标无论如何都可以扔在他们身上。

任何有关如何将WM_DROPFILES 消息发送到我的控件的帮助将不胜感激。

【问题讨论】:

【参考方案1】:

在父级,实现虚拟CDialog::PreTranslateMessage(MSG* pMsg)的覆盖

这使您有机会看到WM_DROPFILES 消息并将它们重定向到属性页中的处理程序。

【讨论】:

谢谢。似乎我需要在父对话框的图片控件上调用 DragAcceptFiles(TRUE) 才能接收 WM_DROPFILES 消息。但是,这样做的副作用是使图片控件内的属性页的整个区域都接受拖动的文件。我只希望属性页中的一个控件接受文件。我曾尝试在属性页上对我不感兴趣的控件调用 DragAcceptFiles(FALSE),但这似乎也不起作用。我猜这可能是由于控件的 z 顺序。【参考方案2】:

我最终通过在我想要将文件拖到的控件以及控件所在的对话框上调用 CWnd::BringWindowToTop() 来解决这个问题。

【讨论】:

以上是关于在 MFC 对话框中拖放的主要内容,如果未能解决你的问题,请参考以下文章

在没有 MFC 的 Visual Studio 中拖放 UI 设计器?

MFC中动态添加控件----寻找多年的秘籍,吐血推荐

怎么样在MFC中创建动态控件

窗体调用 OCX 的使用方法(MFC,WINFORM)

在 NSView 中拖放

在 Quasar 中拖放文件