2011-01-21 1 views
4

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

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

+0

+1 для четко сформулированного вопроса. Однако «это единственный способ» часто не соответствует действительности. ;) Добро пожаловать в SO – dss539

+0

Справедливая точка! Я просто пытался сосредоточиться на этой проблеме, поскольку я уже пытался и исключал ряд «других способов». – AlfieAmalfi

ответ

0

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

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

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

+0

1 - Не бойся, боюсь. 2 - не вариант, увы. Основной код формы генерируется 4GL (я знаю, я знаю), и это ограничивает то, что возможно в коде. Но я ценю ответ. – AlfieAmalfi

0

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


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


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

+0

SWP_FRAMECHANGED выглядел многообещающим, но, к сожалению, не решил мою проблему. Хммм, цикл сообщений - коллега предположил, что это может быть в центре проблемы. Я не уверен, что хочу попасть в это ... но в любом случае спасибо. – AlfieAmalfi