为什么我的自定义控件不接收拖放事件?

时间:2009-04-21 19:54:50

标签: c# .net winforms drag-and-drop c++-cli

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

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

我已经确认拖放功能正常。例如,如果我用Panel替换自定义控件,我就可以使用dragdrop回调了。

是否还需要在Control中实现一些支持dragdrop回调的附加内容?是否有一些必须处理的细微问题,以便系统识别控件正在盘旋并且应该成为拖放操作的目标?

备注:

我还没有可以进行绘画的MFC控件,所以我只是绘制一个我想要绘制的简单渐变背景(通过OnPaintBackground)。我还在OnPaint中绘制了一个较小的渐变矩形。

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

在我的问题中,我说过

  

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

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

反射器显示Control::OnHandleCreated负责设置Control的内部事件通知结构。我从未调用Control::OnHandleCreated,因此内部事件通知结构从未正确构建。这个事件结构(反射器再次显示)负责触发OnDragOver等,因此缺失的事件结构导致我丢失事件。

<强>答案:

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