Проблема перерисовки с MDI-потомком, созданным API SetParent - PullRequest
4 голосов
/ 21 января 2011

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

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

Ответы [ 2 ]

0 голосов
/ 28 января 2011

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


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


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

0 голосов
/ 28 января 2011

Попробуйте выполнить следующие действия:

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

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

...