1

我在 C++/CLI 中编写了一个自定义控件(Forms.Control 的直接子级),它将把它的大部分处理和所有的绘制卸载到一个单独的传统 MFC 控件。我将此控件包装在 C# 应用程序中。我需要能够将项目从应用程序中同一窗体上的 UserControl 拖到 C++/CLI 控件上。

出于某种原因,尽管我将 AllowDrop 设置为 true,但我的自定义控件没有收到任何拖放事件。(我已经验证 AllowDrop 在运行时是真的。)我从来没有机会检查/操作 DragEventArgs,因为从不调用回调。

我已经验证了拖放功能正常。例如,如果我用面板替换自定义控件,我会得到拖放回调就好了。

是否必须在控件中实现一些额外的东西来支持拖放回调?系统是否必须处理一些微妙的事情才能识别控件正在悬停并且应该是拖放操作的目标?

笔记:

用于绘制的 MFC 控件对我来说尚不可用,所以我只是绘制一个简单的渐变背景(通过OnPaintBackground),我正在尝试绘制。我还在OnPaint.

我尝试在创建自定义控件的句柄之前(通过设计器/构造函数代码)和创建句柄之后(通过 OnHandleCreated 覆盖)设置 AllowDrop = true。行为上没有区别。

拖动光标永远不会从自定义控件上的默认“无可用拖动”光标更改。

我正在this.DoDragDrop()从事件处理程序调用MouseDownUserControl 的子控件上的事件。

DragDrop 似乎可以与我在 C# 中创建的另一个自定义控件在与用户控件相同的程序集中工作。它很好地捕获了回调。只有我的 C++/CLI 控件没有看到它们。初始化组件 goo 是无关紧要的。我可以毫无改变地评论它。

4

1 回答 1

2

我发现了我的错误,所以我会在这里回答,以防其他人犯类似的错误。看起来我确实在我的问题中暗示了答案,尽管我当时没有意识到这一点。

在我的问题中,我说

我尝试在创建自定义控件的句柄之前(通过设计器/构造函数代码)和创建句柄之后(通过 OnHandleCreated 覆盖)设置 AllowDrop = true。行为上没有区别。

这实际上是发生故障的地方。我没有阅读具体说明我需要记住调用基类的实现的OnHandleCreated文档OnHandleCreated

Reflector 表示Control::OnHandleCreated负责设置Control的内部事件通知结构。我从来没有打电话Control::OnHandleCreated,所以内部事件通知结构从来没有得到正确建立。这个事件结构(反射器再次显示)负责触发OnDragOver等,因此缺少事件结构导致我丢失事件。

回答:

确保OnHandleCreated在覆盖它时调用基类实现!

于 2009-04-22T13:49:34.793 回答