我在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无关紧要。我可以毫无变化地评论这一切。
答案 0 :(得分:2)
我弄清楚了我的错误,所以我会在这里回答,以防其他人犯了类似的错误。看起来我在我的问题中暗示了答案,尽管我当时没有意识到这一点。
在我的问题中,我说过
我尝试过设置AllowDrop = true 两者都在自定义控件之前 创建句柄(通过 设计师/构造函数代码)之后 创建句柄(通过 OnHandleCreated覆盖)。没有 行为上的差异。
这实际上是故障发生的地方。我没有阅读OnHandleCreated
documentation,具体说明我需要记住调用基类的OnHandleCreated
实现。
反射器显示Control::OnHandleCreated
负责设置Control
的内部事件通知结构。我从未调用Control::OnHandleCreated
,因此内部事件通知结构从未正确构建。这个事件结构(反射器再次显示)负责触发OnDragOver
等,因此缺失的事件结构导致我丢失事件。
<强>答案:强>
确保在覆盖它时调用OnHandleCreated
的基类实现!