Здравствуйте, Александр Граф, Вы писали:
АГ>Здравствуйте, c-smile, Вы писали:
CS>>HTMLayout окно создается как child window?
АГ>Оно же создаётся при вызове HTMLayoutProcND с сообщением WM_CREATE? Насколько я прочитал в туториале. А какие свойства оно имеет я не знаю.
Ох...
Еще раз: есть окно HWND — это системный handle системной же конструкции.
И есть мой внутренняя сущность под названием html::view. Это не окно (в смысле не HWND).
Когда ты зовешь
HTMLayoutProcND(hwnd,WM_CREATE,p1,p2,&handled) я для окна hwnd создаю внутри у себя экземпляр html::view.
В случае
HTMLayoutProcND(hwnd,WM_DESTROY,p1,p2,&handled) я убиваю экземпляр html::view созданный для окна hwnd.
В случае
HTMLayoutProcND(hwnd,WM_PAINT,p1,p2,&handled) я нахожу экземпляр html::view для окна hwnd и если он есть рисую то что загружено в html::view.
и т.д.
т.е. вызовы HTMLayoutProcND это делегация части функциональности станадратного окна функциям htmlayout.
Никаких окон (кроме popup, например — menu) я не создаю.
Давай договоримся: htmlayout window — это окно в WinProc которого выполняются вызовы моей HTMLayoutProcND.
Т.е. это любой HWND для которого создан экземпляр html::view.
Сам по себе HWND может быть как handle of desktop window так и handle of child window (которое живет на своем desktop window).
Т.е. мой вопрос "HTMLayout окно создается как child window?" про тот that_hwnd который ты подставляешь в
вызовах HTMLayoutProcND(that_hwnd,...)
Итак, ты мне можешь сказать style и style_ex этого окна? Т.е. фактически параметры HWND that_hwnd = CreateWindowEx(...).
CS>>И какое сообщение например ты посылаешь?
АГ>Так, было WM_DESTROY, но ниже ты уже написал, что это не очень хорошо, ещё было WM_SYSCOMMAND с wparam = WM_SC_MAXIMIZE, но это после смены стиля (или смена стиля происходила прямо в WinProc, что тоже, как мне кажется, не очень хорошая практика), так что дело не в посылке сообщения.
Я не понял пассаж про WM_SYSCOMMAND с wparam = WM_SC_MAXIMIZE... Ну да ладно ...
Basics что называется:
Закрытие desktop windows выполняется путем посылки им запроса на закрытие:
::PostMessage(hwnd, WM_CLOSE, ... );
Получая WM_CLOSE функция окна может отменить закрытие или пропустить
обработку дальше в DefWindowProc(). DefWindowProc() по получению WM_CLOSE вызывает ::DestroyWindow().
А ::DestroyWindow(hwnd) соотв. начинается с того что функции окна посылается *нотификация* WM_DESTROY.
В талмуде сказано
WM_DESTROY is used to free the allocated memory object associated with the window.
что я и делаю в HTMLayoutProcND. Того же и тебе желаю.
Т.е. когда ты в скажем notepad.exe нажимаешь "крестик" в углу окна то эта кнопка инициирует
посылку WM_CLOSE. И соотв. если документ изменен то ты получаешь Save/Discard диалог.
Т.е. WM_DESTROY для тебя это момент когда ты должен освободить все ресурсы. И WM_NCDESTROY это последнее сообщение что ты получишь в
своей функции окна для этого hwnd.
АГ>>>Тоесть, если я пошлю htmlayout WM_DESTROY, он уничтожится сам, и уничтожит родителя?
CS>>Посылать WM_DESTROY message любому окну это "shoot yourself in the foot" причем в особенно злостной форме.
CS>>::DestroyWindow(hwnd) это правильный способ борьбы с окнами.
АГ>Понятно, будем делать правильно.
Правильно это так:
1) иницировать закрытие посылакой PostMessage(WM_CLOSE). Внимание: PostMessage()!
2) обрабатывать WM_CLOSE путем вызова в scriptе функции view.closing() { return true or false }; и если true то
2.a) зовем view.closed() где скрипт закрывает весь свой stuff.
2.b) пропускаем эту WM_CLOSE в DefWindowProc которая уже и удалит окно.
Так во всяком случае происходит в Sciter.