
Всплывающее окно на Ассемблере
Всплывающее окно - удобный способ информировать о том, что ваша программа выполнила какое-то действие, не требующее немедленного вмешательства пользователя, но достаточно важное, чтобы он об этом узнал. Это может быть сообщение о завершении закачки файла, получении нового письма, завершении длительных вычислений и т.п. Красивый эффект получается, когда информационное окно плавно выезжает из-под таскбара. Простого перемещения окна тут будет недостаточно, так как придется учитывать положение таскбара и всяких других панелей, которые резервируют под себя часть рабочего стола. Поэтому надо сперва получить размер видимой области экрана с учетом различных панелей инструментов и размеры самого всплывающего окна. Затем окно перемещается по одному пикселу в нужном направлении с учетом положения панелей, а размер его видимой части увеличивается на один пиксел в противоположную сторону. Это делается при помощи функции MoveWindow. Лучше всего сам эффект всплытия реализовать на стадии инициализации окна по сообщению WM_INITDIALOG, но в этом случае придется принудительно показывать окно функцией ShowWindow и обновлять его содержимое функцией UpdateWindow после каждого сдвига. Рекомендуются стили окна без заголовка и поверх всех окон, как сделано в прилагаемом примере. Атрибут прозрачности для всплывающих окон лучше не использовать, так как при анимации появляются заметные искажения.Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- coord RECT ; Размеры окна
- screen RECT ; Размеры экрана
- ; Сегмент кода
- section '.code' code readable executable
- ...
- ; Обработчик сообщения WM_INITDIALOG
- wminitdialog:
- ; Получить размер рабочей области экрана
- invoke SystemParametersInfo,SPI_GETWORKAREA,NULL,screen,FALSE
- ; Получить размер окна
- invoke GetClientRect,[hwnddlg],coord
- ; Вычислить отступ от правой границы экрана
- mov eax,[screen.right]
- sub eax,[coord.right]
- dec eax
- mov [screen.right],eax
- ; Высота окна
- mov ecx,[coord.bottom]
- ; Цикл всплытия окна
- @@:
- ; Сохранить значение счетчика
- push ecx
- ; Заполняем стек для MoveWindow
- push TRUE
- mov eax,[coord.bottom]
- sub eax,ecx
- push eax
- push [coord.right]
- mov ecx,[screen.bottom]
- sub ecx,eax
- push ecx
- invoke MoveWindow,[hwnddlg],[screen.right]
- ; Так как сейчас только инициализация, то придется принудительно
- ; показать окно и обновить его содержимое
- invoke ShowWindow,[hwnddlg], SW_SHOW
- invoke UpdateWindow,[hwnddlg]
- ; Небольшая пауза
- invoke Sleep,2
- ; Восстановить счетчик
- pop ecx
- loop @b
- ...
Code (Assembler) : Убрать нумерацию
- ...
- ; Высота окна
- mov ecx,[coord.bottom]
- ; Цикл закрытия окна
- @@:
- ; Сохранить значение счетчика
- push ecx
- ; Заполняем стек для MoveWindow
- push TRUE
- push ecx
- push [coord.right]
- mov eax,[screen.bottom]
- sub eax,ecx
- push eax
- invoke MoveWindow,[hwnddlg],[screen.right]
- ; Обновить содержимое окна
- invoke UpdateWindow,[hwnddlg]
- ; Небольшая пауза
- invoke Sleep,2
- ; Восстановить счетчик
- pop ecx
- loop @b
- ...
Просмотров: 6116 | Комментариев: 2

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(04.06.2009 в 20:08):
Не приходилось.

tester
(04.06.2009 в 20:04):
ManHunter тебе не приходилось работать с WinInet API на FASM ? Если можешь напиши плиз статью про upload файлов на FASM.

Добавить комментарий
Заполните форму для добавления комментария
