Здравствуйте, Pavel Dvorkin, Вы писали:
_>>Использую С# WebBrowser control. Нужно модифицировать OnPaint(), в частности информировать другой класс, что браузер перерисовал свой контент. Исследование показало, что сам WebBrowser control месседж WM_PAINT не получает. Он имеет вложенные окна, как-то:
PD>Он может его не получать только если ни один пиксель его клиентской области не явлвется видимым (то есть вся клиентская область чем-то закрыта). Но тогда ему WM_PAINT и не нужен вообще.
Это очень интересная мысль, поскольку вся конструкция (WebBrowser conrol), описанная ниже, на самом деле сверху перекрывается прозрачным окном (назовем его Transp), в котором я рисую свою графику.
Я ожидал, что система сама разберется, что и как рисовать. Но случилось, что Transp перерисовывается быстро, а WebBrowser медленно и рисует после него (Transp) поверху, хотя и расположен ниже.
Возможно это глюк, а возможно, что WebBrowser имеет собственный необычный механизм рисования. Вот я и хочу получить от него информацию, что он закончил рисование и затем перерисовать Transp.
_>>Windows Form10.Window.8.app.378734a (WebBrowser control) _>> | _>> | _>> Window Shell Embedding _>> | _>> | _>> Shell Doc Object View _>> | _>> | _>> InternetExplorer_Server
_>>Последнее окно в иерархии (InternetExplorer_Server) и получает WM_PAINT
PD>Вполне логично. Оно имеет видимые пиксели, поэтому должно уметь себя перерисовать, для чего ему шлют, а он обрабатывает WM_PAINT
>>но дальше по иерархии WM_PAINT не всплывает
PD>И не должно. Судя по всему, предки этого окна видимых пикселей не имеют.
Буду проверять. Что смотреть? Какой-нибудь стиль visible?
>>Как получить указатель на это окно?
PD>В .NET не знаю, а в Win32 просто — EnumChildWindows. Начать с Windows Form10.Window.8.app.378734a , перебрать его чайлдов, найти нужны, с ним то же самое и т.д. Можно еще FindWindowsEx, если есть критерий для поиска
>>Или хотя бы pop up WM_PAINT до уровня WebContol?
PD>Судя по твоему описанию — бессмысленно, оно ему не нужно.Но, должен сказать, я совсем не уверен в том что то, что ты написал, верно.
В моей ситуации (см. первый коммент) похоже, что это имеет смысл.
PD>Лучше всего запусти Spy++ (входит в состав VS) и проверь все, в том числе иерархию, размеры и перекрытие.
Диаграмма получена в Spy++. Все четыре окна имеют одинаковые размеры и лежат друг на друге.
Накопал, что WebBrowser является wrapper вокруг какого-то Win32 окна (видимо это то, что я вижу как InternetExplorer_Server).