Проблема перерисовки с дочерним MDI, созданным API SetParent
У меня есть старое приложение, написанное на C, которое состоит из главного окна и нескольких mdi детей, открытых из опций меню. Чтобы позволить новым дочерним элементам mdi быть написанными на C#, я создал COM-слой взаимодействия C++, который вызывается кодом C и, в свою очередь, вызывает код C#. Затем я использую API SetParent, чтобы установить главное окно C как новый родитель любого открытого окна C#. Кажется, это работает - окно C# ведет себя как дочерний элемент MDI главного окна. НО, дочернее окно не рисует должным образом и только ухудшается, если вы переместите другие окна поверх него или переместите его к краям основного окна - оно окрашивается частями других окон или оставляет кусочки себя, лежащие вокруг, при движении, Кроме того, экран не очень хорошо реагирует, например, вы не можете переходить из одного текстового поля в другое.
Пожалуйста, не подвергайте сомнению архитектуру моего решения (поверьте мне, это единственный способ), но если вы когда-либо видели подобную проблему с ребенком, созданным SetParent, я хотел бы услышать, если бы вам удалось это исправить,
2 ответа
Попробуйте эти вещи:
Добавьте Application.DoEvents в цикл обработки, который обычно выполняется, когда дела идут плохо.
Попробуйте обновить формы MDI из основного события рисования формы.
Я не совсем понимаю, как работает SetParent(); это, как говорится, вот еще несколько вещей, чтобы рассмотреть:
В содержании сообщества MSDN документации SetParent Чанго В. из Microsoft добавил, что вам: "нужно позвонить SetWindowPos(SWP_FRAMECHANGED)
при переключении между нулевым и ненулевым родителем."
Кроме того, вы уверены, что на самом деле запускаете цикл сообщений.NET Form? Ты звонил Application.Run(yourManagedForm)
, или вы запускаете свой собственный цикл сообщений в коде C? Если вы используете свой собственный цикл сообщений, вам может потребоваться переслать сообщения на WndProc
метод в вашей управляемой форме после фильтрации через PreProcessMessage
, Вам нужно будет предоставить интерфейс для них, поскольку они защищены. Хотя я не знаю, насколько это правильно.