2009-04-21 3 views
1

Я написал пользовательский элемент управления (непосредственный дочерний элемент Forms.Control) в C++/CLI, который выгрузит большую часть своей обработки и всю свою картину в отдельный элемент управления MFC на прежнем уровне. Я обертываю этот элемент управления в приложении C#. Мне нужно иметь возможность перетаскивать элементы в элемент управления C++/CLI из UserControl в той же форме в приложении.Почему мой пользовательский контроль не получает события перетаскивания?

По какой-то причине мой пользовательский элемент управления не принимает никаких событий перетаскивания, несмотря на то, что моя настройка AllowDrop равна true. (Я проверял, что AllowDrop верен во время выполнения.) Я никогда не получаю возможность изучить/манипулировать DragEventArgs, потому что обратные вызовы никогда не вызываются.

Я проверил, что перетаскивание в противном случае функционирует нормально. Если я, например, заменил пользовательский элемент управления Panel, я получаю обратные вызовы dragdrop просто отлично.

Есть ли что-то дополнительное, которое должно быть реализовано в элементе управления для поддержки обратных вызовов dragdrop? Есть ли что-то тонкое, с которым нужно иметь дело, чтобы система распознала, что элемент управления находится в курсе и должен быть объектом операции dragdrop?

Примечание:

управление MFC, который будет делать картины еще не доступно для меня, так что я просто живописи простого фона градиента (через OnPaintBackground), что я пытаюсь рисовать в. Я также рисую меньший прямоугольник градиента в OnPaint.

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

Курсор перетаскивания никогда не изменяется от курсора по умолчанию, не доступного по сравнению с настраиваемым элементом управления.

Я вызываю this.DoDragDrop() из обработчика события для события MouseDown на субконтроллере UserControl.

DragDrop, похоже, работает нормально с другим настраиваемым элементом управления, который я создал на C# в той же сборке, что и пользовательский элемент управления. Он отлично отображает обратные вызовы. Только мой элемент управления C++/CLI не видит их. Инициал-инициализатор не имеет значения. Я могу прокомментировать все без изменений.

ответ

2

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

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

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

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

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

Ответ:

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

Смежные вопросы