| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Синхронизация окон при использовании SetParent |
| Автор: NightWishMaster 31.7.2008, 14:34 | ||||||
На форме есть кнопка и панель. При нажатии на кнопку запускается Ворд и с помощью функции SetParent() запихивается в панельку. Код следующий (C++ Builder 6):
При изменении размеров формы Ворд автоматически подстраивается так, чтобы не было видно его границ и шапки. Используется функция SetWindowPos(), в которую передаем флаг SWP_ASYNCWINDOWPOS. Вот его описание в MSDN:
Если этот флаг не установить, то при попытке изменить размеры формы у нас происходит один вызов функции FormResize(), соответсветнно один вызов функции SetWindowPos(), размеры изменяются один раз и все – дальше движения мышки игнорируются и форма блокируется с такими размерами, пока не отпустишь и снова не потянешь за край формы. Если этот флаг стоит, то все норм, размеры Ворда синхронно изменяются, в том числе и с открытым документом. Но все это до поры, до времени Проблема возникает, если создать документ и, на пример, изменить масштаб его отображения (там где 25-50-100% и т.п.). После этого, несмотря на установленный флажок SWP_ASYNCWINDOWPOS в вызове функции SetWindowPos() все равно наблюдается описанная выше ситуация – изменения размеров происходит один раз и блокируется. Я пробовал ставить еще флажок SWP_DEFERERASE (Prevents generation of the WM_SYNCPAINT message), но это не исправляет ситуацию. Так же была мысль, что надо посылать всем дочерним окнам в моем окне ворда также сообщения с флажком SWP_ASYNCWINDOWPOS. Попробовал это с помощью функции EnumChildWindows():
Но на ситуацию это не повлияло. Как думаете – в чем проблема? Почему пока не измениш, например, масштаб отображения документа (но не только это, та же ситуация при нажатии на некоторые кнопки Ворда, хотя и не все) все работает нормально. А когда измениш – начинает стопорится? Буду благодарен за любые размышления ПС. Прикрепил исходник на C++ Builder (там есть и экзешник – для его работы нужен только установленный Ворд) - если у кого возникнет желание посмотреть, о чем это я |
| Автор: GremlinProg 31.7.2008, 23:24 |
| попробуй добавить ворду стиль WS_CHILD |
| Автор: NightWishMaster 31.7.2008, 23:34 | ||
Я писал в коментах кода, что мне это не приемлемо, т.к. в таком случае пропадает меню и панельки Ворда (дочернее окно "не имеет права" иметь меню, насколько я понял из МСДН). Я сознательно не менял стиль окна Ворда. Проблема решается заменой функции SetWindowPos на MoveWindow:
|