当我将文件拖入客户区时,我正在尝试破译CHtmlView的行为,所以我创建了一个新的MFC应用程序并注释掉了在启动时导航到MSDN的CHtmlView行。在我的主框架中,我用一个显示消息框的函数覆盖了CWnd :: OnDropFiles(),以查看发送WM_DROPFILES的时间。
除了第一次尝试将文件拖到应用程序中之外,OnDropFiles()会被触发。唯一的是,第一次看起来被应用程序解释为在文件中显示数据的请求而不是打开文件的请求。我试过从视图类中重写OnDrop(),但它从未调用过。
为什么第一次与众不同?如何捕获所有将文件拖入我的应用程序的尝试?
答案 0 :(得分:1)
这是基础WebBrowser
控件行为的一部分。 CHtmlView
默认情况下将RegisterAsDropTarget
设置为true
,这意味着控件会拦截放置操作并执行自己的处理。
如果您想禁止它,请在SetRegisterAsDropTarget(FALSE)
实施中致电OnInitialUpdate
。然后,所有丢弃操作都将与主窗口进行交互。
答案 1 :(得分:0)
前言:我从我发现的文档中推断,如果我错了,我不担心。在投票给我答案或接受答案之前,请确保以下说明有意义,即尝试一下:)
在Google搜索OnDropFiles
后,我发现它继承自CWnd
类:(MSDN page)
根据MSDN文章:
<强>参数强>
hDropInfo
指向描述已删除文件的内部数据结构的指针。
DragFinish
,DragQueryFile
和DragQueryPoint
Windows函数使用此句柄来检索有关已删除文件的信息。
稍后报价:
“当用户在已将自己注册为已删除文件的收件人的窗口上释放鼠标左键时,框架会调用此成员函数。
“通常,派生类将被设计为支持被删除的文件,并且它将在窗口构建期间自行注册。
框架调用此成员函数以允许您的应用程序处理Windows消息。传递给函数的参数反映了收到消息时框架收到的参数。如果调用此函数的基类实现,该实现将使用最初随消息一起传递的参数,而不是您提供给函数的参数。“
显示 表示在注册该功能之前,它将无法按预期工作。
因此,我相信发生的事情是,第一次将某些内容放到CHTMLView上时,它会自行注册,只有 然后 才会按预期工作'。< / p>
如果我的理解是正确的,那么就会出现一个新问题,即如何强制注册View。从MSDN技术说明中的相关链接看起来,您可以强制DragAcceptFiles
(see here)运行,否则将在drop事件结束时触发。
答案 2 :(得分:-1)
我建议切换到HTMLayout - 它比CHtmlView更好。