Проблема перерисовки с дочерним MDI, созданным API SetParent

У меня есть старое приложение, написанное на C, которое состоит из главного окна и нескольких mdi детей, открытых из опций меню. Чтобы позволить новым дочерним элементам mdi быть написанными на C#, я создал COM-слой взаимодействия C++, который вызывается кодом C и, в свою очередь, вызывает код C#. Затем я использую API SetParent, чтобы установить главное окно C как новый родитель любого открытого окна C#. Кажется, это работает - окно C# ведет себя как дочерний элемент MDI главного окна. НО, дочернее окно не рисует должным образом и только ухудшается, если вы переместите другие окна поверх него или переместите его к краям основного окна - оно окрашивается частями других окон или оставляет кусочки себя, лежащие вокруг, при движении, Кроме того, экран не очень хорошо реагирует, например, вы не можете переходить из одного текстового поля в другое.

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

2 ответа

Попробуйте эти вещи:

  1. Добавьте Application.DoEvents в цикл обработки, который обычно выполняется, когда дела идут плохо.

  2. Попробуйте обновить формы MDI из основного события рисования формы.

Я не совсем понимаю, как работает SetParent(); это, как говорится, вот еще несколько вещей, чтобы рассмотреть:


В содержании сообщества MSDN документации SetParent Чанго В. из Microsoft добавил, что вам: "нужно позвонить SetWindowPos(SWP_FRAMECHANGED) при переключении между нулевым и ненулевым родителем."


Кроме того, вы уверены, что на самом деле запускаете цикл сообщений.NET Form? Ты звонил Application.Run(yourManagedForm), или вы запускаете свой собственный цикл сообщений в коде C? Если вы используете свой собственный цикл сообщений, вам может потребоваться переслать сообщения на WndProc метод в вашей управляемой форме после фильтрации через PreProcessMessage, Вам нужно будет предоставить интерфейс для них, поскольку они защищены. Хотя я не знаю, насколько это правильно.

Другие вопросы по тегам