Создание диалоговых окон с тенью
Сегодня разберем очередное украшательство для ваших программ, а именно тень от диалоговых окон. Обычная тень создается штатными средствами системы, но поддерживается только начиная с Windows XP. Для этого требуется, чтобы стиль окна включал в себя флаг CS_DROPSHADOW, и здесь есть одна тонкость: этот флаг нельзя прописать в ресурсах, а надо устанавливать при инициализации диалогового окна. В обработчике инициализации должен быть такой код:Code (Assembler) : Убрать нумерацию
- ...
- ; Определить константу CS_DROPSHADOW
- CS_DROPSHADOW = 00020000h
- ; Получить текущее значение стиля окна
- invoke GetWindowLong,[hwnddlg],GCL_STYLE
- ; Добавить к нему атрибут тень
- or eax,CS_DROPSHADOW
- ; Установить новый стиль окна
- invoke SetClassLong,[hwnddlg],GCL_STYLE,eax
- ...
При наложении окон тень теряется
Похоже это связано с тем, что родительское окно и все его дочерние окна считаются как один объект. А тень по сути является одним самостоятельным окном, которое и связывается с этим объектом. Для обхода такого недоразумения придется создавать псевдо-дочерние окна, которые находятся на одном уровне иерархии с главным окном. А чтобы они вели себя как дочерние, главное окно надо будет блокировать до их закрытия. Вот фрагмент кода открытия псевдо-дочернего окна сообщения или диалогового окна:
Code (Assembler) : Убрать нумерацию
- ...
- ; Заблокировать главное окно
- invoke EnableWindow,[hwnddlg],FALSE
- ; Открыть псевдо-дочернее окно с тенью, его родитель по уровню
- ; иерархии равен родителю главного окна. В результате этого при
- ; его перемещении над главным окном тень теряться не будет
- invoke MessageBox,NULL,szMess,szTitle,MB_OK
- ; или...
- invoke DialogBoxParam,[hInstance],ID_DLG,NULL,DialogProc,0
- ; Подразумевается, что родительское окно создано с hWndParent = NULL
- ; Разблокировать главное окно и вернуть на него фокус
- invoke EnableWindow,[hwnddlg],TRUE
- invoke SetFocus,[hwnddlg]
- ...
При наложении окон тень сохраняется
В приложении два примера создания окон с тенью. В первом случае создается реальное дочернее окно, а во втором примере - псевдо-дочернее окно с блокировкой главного окна.
Просмотров: 6667 | Комментариев: 1
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Добавить комментарий
Заполните форму для добавления комментария
Достаточно времени провел пока нашел решение: устранить эту "недорисовку" тени поверх родительского окна. Как же не в тему "не дорисовывается-то", а.
Спасибо за пост, именно он указал решение и направление.
Возможно пригодится одно из решений:
Установить поверх всех остальных, как говорится, сделать поплавком)).
invoke SetWindowPos, [ChildWnd], HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or
SWP_NOSIZE or SWP_NOACTIVATE
или
FormStyle = fsStayOnTop (Delphi)