Я написал пользовательский элемент управления (непосредственный дочерний элемент Forms.Control) в C ++ / CLI, который будет перекладывать большую часть своей обработки и всю свою отрисовку на отдельный устаревший элемент управления MFC. Я обертываю этот элемент управления в приложении C #. Мне нужно иметь возможность перетаскивать элементы на элемент управления C ++ / CLI из UserControl в той же форме в приложении.
По какой-то причине мой пользовательский элемент управления не получает никаких событий перетаскивания, несмотря на то, что для параметра AllowDrop установлено значение true. (Я подтвердил, что AllowDrop имеет значение true во время выполнения.) У меня никогда не было возможности исследовать / манипулировать DragEventArgs, потому что обратные вызовы никогда не вызываются.
Я проверил, что перетаскивание в противном случае работает нормально. Например, если я заменяю пользовательский элемент управления на Panel, я получаю обратные вызовы dragdrop очень хорошо.
Есть ли что-то дополнительное, что должно быть реализовано в элементе управления для поддержки обратных вызовов dragdrop? Есть ли что-то неуловимое, что нужно сделать, чтобы система распознала, что элемент управления находится над ним и должен быть целью операции перетаскивания?
Примечания:
Элемент управления MFC, который будет выполнять рисование, мне пока недоступен, поэтому я просто рисую простой градиентный фон (через OnPaintBackground
), в который я пытаюсь рисовать. Я также рисую меньший градиентный прямоугольник в OnPaint
.
Я попытался установить AllowDrop = true как до создания дескриптора пользовательского элемента управления (через код конструктора / конструктора), так и после создания дескриптора (через переопределение OnHandleCreated). Нет разницы в поведении.
Курсор перетаскивания никогда не меняется со стандартного курсора «недоступно перетаскивание» над пользовательским элементом управления.
Я звоню this.DoDragDrop()
из обработчика событий для события MouseDown
в субконтроле UserControl.
DragDrop, кажется, работает нормально с другим пользовательским элементом управления, который я создал в C # в той же сборке, что и пользовательский элемент управления. Он отлично фиксирует обратные вызовы. Только мой элемент управления C ++ / CLI их не видит. Initializecomponent Goo не имеет значения. Я могу все это закомментировать без изменений.