
Магнитное (липкое) окно на Ассемблере
Еще один интересный трюк при работе с окнами - так называемые "липкие" или "магнитные" окна, которые прилипают к границам экрана при перемещении. Это реализуется достаточно просто, но выглядит очень эффектно. Для перехвата перемещения окна надо обрабатывать сообщение WM_MOVING. В параметре lParam передается адрес структуры RECT, которая содержит значения конечных координат окна после отпускания курсора мыши. Чтобы при изменении координат окна не возникало неприятного эффекта моргания, их надо менять сразу же в передаваемой структуре. Обработчик WM_MOVING выглядит следующим образом:Code (Assembler) : Убрать нумерацию
- ; Обработчик сообщения WM_MOVING
- MAX_GRID = 20 ; Размер магнитной сетки
- ; Получить размер рабочей области экрана
- invoke SystemParametersInfo,SPI_GETWORKAREA,NULL,coord,FALSE
- ; В регистре EDI указатель на структуру координат окна
- mov edi,[lparam]
- ; Проверить положение левой границы окна
- mov edx,[edi+RECT.left]
- sub edx,[coord.left]
- mov eax,edx
- jns @f
- neg edx
- @@:
- cmp edx,MAX_GRID
- ja @f
- sub [edi+RECT.right],eax
- sub [edi+RECT.left],eax
- @@:
- ; Проверить положение правой границы окна
- mov edx,[edi+RECT.right]
- sub edx,[coord.right]
- mov eax,edx
- jns @f
- neg edx
- @@:
- cmp edx,MAX_GRID
- ja @f
- sub [edi+RECT.right],eax
- sub [edi+RECT.left],eax
- @@:
- ; Проверить положение верхней границы окна
- mov edx,[edi+RECT.top]
- sub edx,[coord.top]
- mov eax,edx
- jns @f
- neg edx
- @@:
- cmp edx,MAX_GRID
- ja @f
- sub [edi+RECT.top],eax
- sub [edi+RECT.bottom],eax
- @@:
- ; Проверить положение нижней границы окна
- mov edx,[edi+RECT.bottom]
- sub edx,[coord.bottom]
- mov eax,edx
- jns @f
- neg edx
- @@:
- cmp edx,MAX_GRID
- ja @f
- sub [edi+RECT.top],eax
- sub [edi+RECT.bottom],eax
- @@:
- mov eax,TRUE
- jmp finish
Этот способ вполне рабочий, но только для одного монитора. Если вам нужно решение для нескольких мониторов, в том числе разного размера, используйте код из этой статьи.
В приложении рабочий пример программы с "магнитным" окном. При включенной галочке окно приобретает магнитные свойства, при отключенной становится обычным. Чтобы отлепить окно от края экрана его надо резко дернуть в сторону.
Просмотров: 5438 | Комментариев: 11

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(29.05.2018 в 13:12):
Переписал этот древний ужоснах на нормальный код. Пример в статье обновил, архив перезалил.

dgkf
(19.08.2011 в 20:58):
кажется, понял). ReleaseCapture - не нужна. У вас все ja надо заменить на jg: если при снятом флажке завести окно за экран, поставить флажок и вести вдоль экрана (чтобы было видно только половину окна) окно "не прилипает"
http://webfile.ru/5499340
http://webfile.ru/5499340

ManHunter
(19.08.2011 в 07:37):
Читай, изучай:
http://www.manhunter.ru/assemb...e_mesto.html
http://www.manhunter.ru/assemb...e_mesto.html

dgkf
(19.08.2011 в 06:30):
объясните,пожалуйста, команду: invoke SendMessage,[hwnddlg],WM_SYSCOMMAND,61458,0
Кому, что и зачем посылаем? Что за число 61458?
Кому, что и зачем посылаем? Что за число 61458?

ManHunter
(25.03.2011 в 07:53):
Дык, все ж настраивается. MAX_GRID = 5 и будет тебе счастье.

Жекакис
(25.03.2011 в 02:19):
дааа, с тачпадом резче дёргать не получается, перестарались вы с магнитом, хотя всё равно спасибо за полезный пример)

ManHunter
(17.05.2009 в 15:59):
Тут все написано:
http://www.manhunter.ru/assemb...er_fasm.html
http://www.manhunter.ru/assemb...er_fasm.html

Антоха
(17.05.2009 в 15:49):
Вопрос не по теме, просто интересно.
А почему Вы сделали выбор в пользу FASM'а?
Писали ли сразу на фасме, или пересели с чего?
Каким ассемблером пользовались до этого?
Были ли сложности портирования исходников под новый ассемблер?
Пользуетесь стандартным линкером?
А почему Вы сделали выбор в пользу FASM'а?
Писали ли сразу на фасме, или пересели с чего?
Каким ассемблером пользовались до этого?
Были ли сложности портирования исходников под новый ассемблер?
Пользуетесь стандартным линкером?

Zummenix
(14.05.2009 в 17:26):
Нет, так нервно дергать я не могу :)

ManHunter
(13.05.2009 в 16:53):
Резче надо дергать, резче :)

Zummenix
(13.05.2009 в 16:43):
Как-то плохо отлипает, мышку на пол экрана утянул, а окно на месте.
Пока не понял в чем проблема.
Пока не понял в чем проблема.

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