Blog. Just Blog
Магнитное (липкое) окно на Ассемблере
Еще один интересный трюк при работе с окнами - так называемые "липкие" или "магнитные" окна, которые прилипают к границам экрана при перемещении. Это реализуется достаточно просто, но выглядит очень эффектно. Для перехвата перемещения окна надо обрабатывать сообщение WM_MOVING. В параметре lParam передается адрес структуры RECT, которая содержит значения конечных координат окна после отпускания курсора мыши. Чтобы при изменении координат окна не возникало неприятного эффекта моргания, их надо менять сразу же в передаваемой структуре. Обработчик WM_MOVING выглядит следующим образом:Code (Assembler) : Убрать нумерацию
- ; Обработчик сообщения WM_MOVING
- MAX_GRID = 20 ; Размер магнитной сетки
- ; Проверить положение левой границы окна
- chk_left_position:
- ; В регистре EDX указатель на структуру координат окна
- mov edx,[lparam]
- mov eax,dword [edx+0] ; left
- mov ecx,dword [edx+8] ; right
- sub ecx,eax
- test eax,eax
- jns @f
- neg eax
- @@:
- cmp eax,MAX_GRID
- ja @f
- mov dword [edx+0],0
- mov dword [edx+8],ecx
- @@:
- ; Проверить положение правой границы окна
- chk_right_position:
- ; Получить размер рабочей области экрана
- invoke SystemParametersInfo,SPI_GETWORKAREA,NULL,coord,FALSE
- ; В регистре EDX указатель на структуру координат окна
- mov edx,[lparam]
- mov eax,dword [edx+8] ; right
- sub eax,dword [edx+0] ; left
- push eax
- mov eax,[coord.right] ; workarea right
- mov ecx,dword [edx+8] ; right
- sub eax,ecx
- test eax,eax
- jns @f
- neg eax
- @@:
- cmp eax,MAX_GRID
- pop eax
- ja @f
- mov ecx,[coord.right]
- mov dword [edx+8],ecx
- sub ecx,eax
- mov dword [edx+0],ecx
- @@:
- ; Проверить положение верхней границы окна
- chk_top_position:
- ; В регистре EDX указатель на структуру координат окна
- mov edx,[lparam]
- mov eax,dword [edx+4] ; top
- mov ecx,dword [edx+12] ; bottom
- sub ecx,eax
- test eax,eax
- jns @f
- neg eax
- @@:
- cmp eax,MAX_GRID
- ja @f
- mov dword [edx+4],0
- mov dword [edx+12],ecx
- @@:
- ; Проверить положение нижней границы окна
- chk_bottom_position:
- ; Получить размер рабочей области экрана. Структура coord
- ; определена заранее в сегменте данных
- invoke SystemParametersInfo,SPI_GETWORKAREA,NULL,coord,FALSE
- ; В регистре EDX указатель на структуру координат окна
- mov edx,[lparam]
- mov eax,dword [edx+12] ; bottom
- sub eax,dword [edx+4] ; top
- push eax
- mov eax,[coord.bottom] ; workarea bottom
- mov ecx,dword [edx+12] ; bottom
- sub eax,ecx
- test eax,eax
- jns @f
- neg eax
- @@:
- cmp eax,MAX_GRID
- pop eax
- ja @f
- mov ecx,[coord.bottom]
- mov dword [edx+12],ecx
- sub ecx,eax
- mov dword [edx+4],ecx
- @@:
- mov eax,TRUE
- jmp finish
В приложении рабочий пример программы с "магнитным" окном. При включенной галочке окно приобретает магнитные свойства, при отключенной становится обычным. Чтобы отлепить окно от края экрана его надо резко дернуть в сторону.
Просмотров: 1772 | Комментариев: 10
Комментарии
Отзывы посетителей сайта о статье
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):
Как-то плохо отлипает, мышку на пол экрана утянул, а окно на месте.
Пока не понял в чем проблема.
Пока не понял в чем проблема.
Добавить комментарий
Заполните форму для добавления комментария
Пример программы с исходным текстом (FASM)
http://webfile.ru/5499340