Почему мой пользовательский элемент управления не получает события перетаскивания? - PullRequest
1 голос
/ 21 апреля 2009

Я написал пользовательский элемент управления (непосредственный дочерний элемент 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 не имеет значения. Я могу все это закомментировать без изменений.

1 Ответ

2 голосов
/ 22 апреля 2009

Я понял свою ошибку, поэтому я отвечу здесь, если кто-то другой совершит аналогичную ошибку. Похоже, я намекал на ответ в своем вопросе, хотя я не осознавал этого в то время.

На мой вопрос я заявил, что

Я попытался установить AllowDrop = true как до пользовательского элемента управления дескриптор создан (через код конструктора / конструктора) и после ручка создана (через OnHandleCreated переопределить). нет разница в поведении.

Это на самом деле, где произошел сбой. Мне не удалось прочитать OnHandleCreated документацию , в которой конкретно говорится, что мне нужно запомнить, чтобы вызвать реализацию базового класса OnHandleCreated.

Отражатель показывает, что Control::OnHandleCreated отвечает за настройку внутренней структуры уведомлений о событиях Control. Я никогда не звонил Control::OnHandleCreated, поэтому внутренняя структура уведомлений о событиях никогда не создавалась должным образом. Эта структура событий (отражатель снова показывает) отвечает за срабатывание OnDragOver и т. Д., Поэтому пропущенная структура событий привела к моим пропущенным событиям.

Ответ:

Убедитесь, что вы вызываете реализацию базового класса OnHandleCreated при переопределении!

...