Blog. Just Blog

Магнитное (липкое) окно на Ассемблере

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Еще один интересный трюк при работе с окнами - так называемые "липкие" или "магнитные" окна, которые прилипают к границам экрана при перемещении. Это реализуется достаточно просто, но выглядит очень эффектно. Для перехвата перемещения окна надо обрабатывать сообщение WM_MOVING. В параметре lParam передается адрес структуры RECT, которая содержит значения конечных координат окна после отпускания курсора мыши. Чтобы при изменении координат окна не возникало неприятного эффекта моргания, их надо менять сразу же в передаваемой структуре. Обработчик WM_MOVING выглядит следующим образом:
  1. ; Обработчик сообщения WM_MOVING
  2.  
  3. MAX_GRID = 20   ; Размер магнитной сетки
  4.  
  5.         ; Получить размер рабочей области экрана
  6.         invoke  SystemParametersInfo,SPI_GETWORKAREA,NULL,coord,FALSE
  7.  
  8.         ; В регистре EDI указатель на структуру координат окна
  9.         mov     edi,[lparam]
  10.  
  11.         ; Проверить положение левой границы окна
  12.         mov     edx,[edi+RECT.left]
  13.         sub     edx,[coord.left]
  14.         mov     eax,edx
  15.         jns     @f
  16.         neg     edx
  17. @@:
  18.         cmp     edx,MAX_GRID
  19.         ja      @f
  20.         sub     [edi+RECT.right],eax
  21.         sub     [edi+RECT.left],eax
  22. @@:
  23.         ; Проверить положение правой границы окна
  24.         mov     edx,[edi+RECT.right]
  25.         sub     edx,[coord.right]
  26.         mov     eax,edx
  27.         jns     @f
  28.         neg     edx
  29. @@:
  30.         cmp     edx,MAX_GRID
  31.         ja      @f
  32.         sub     [edi+RECT.right],eax
  33.         sub     [edi+RECT.left],eax
  34. @@:
  35.         ; Проверить положение верхней границы окна
  36.         mov     edx,[edi+RECT.top]
  37.         sub     edx,[coord.top]
  38.         mov     eax,edx
  39.         jns     @f
  40.         neg     edx
  41. @@:
  42.         cmp     edx,MAX_GRID
  43.         ja      @f
  44.         sub     [edi+RECT.top],eax
  45.         sub     [edi+RECT.bottom],eax
  46. @@:
  47.         ; Проверить положение нижней границы окна
  48.         mov     edx,[edi+RECT.bottom]
  49.         sub     edx,[coord.bottom]
  50.         mov     eax,edx
  51.         jns     @f
  52.         neg     edx
  53. @@:
  54.         cmp     edx,MAX_GRID
  55.         ja      @f
  56.         sub     [edi+RECT.top],eax
  57.         sub     [edi+RECT.bottom],eax
  58. @@:
  59.         mov     eax,TRUE
  60.         jmp     finish
Размеры области экрана для вычисления новых координат окна с учетом таскбара и других видимых панелей можно получить вызовом функции SystemParametersInfo с параметром SPI_GETWORKAREA. В приведенном примере размер магнитной сетки (минимальное расстояние до границы экрана, с которого начинает действовать сила притяжения), меняется в константе MAX_GRID. По умолчанию значение равно 20 пикселов.

Этот способ вполне рабочий, но только для одного монитора. Если вам нужно решение для нескольких мониторов, в том числе разного размера, используйте код из этой статьи.

В приложении рабочий пример программы с "магнитным" окном. При включенной галочке окно приобретает магнитные свойства, при отключенной становится обычным. Чтобы отлепить окно от края экрана его надо резко дернуть в сторону.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Sticky.Window.Demo.zip (2,549 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 5438 | Комментариев: 11

Метки: Assembler, окна
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ManHunter (29.05.2018 в 13:12):
Переписал этот древний ужоснах на нормальный код. Пример в статье обновил, архив перезалил.
dgkf (19.08.2011 в 20:58):
кажется, понял).  ReleaseCapture - не нужна. У вас все ja надо заменить на jg: если при снятом флажке завести окно за экран, поставить флажок и вести вдоль экрана (чтобы было видно только половину окна) окно "не прилипает"
http://webfile.ru/5499340
ManHunter (19.08.2011 в 07:37):
dgkf (19.08.2011 в 06:30):
объясните,пожалуйста, команду:  invoke  SendMessage,[hwnddlg],WM_SYSCOMMAND,61458,0
Кому, что и зачем посылаем? Что за число 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
Антоха (17.05.2009 в 15:49):
Вопрос не по теме, просто интересно.

А почему Вы сделали выбор в пользу FASM'а?

Писали ли сразу на фасме, или пересели с чего?
Каким ассемблером пользовались до этого?
Были ли сложности портирования исходников под новый ассемблер?
Пользуетесь стандартным линкером?
Zummenix (14.05.2009 в 17:26):
Нет, так нервно дергать я не могу :)
ManHunter (13.05.2009 в 16:53):
Резче надо дергать, резче :)
Zummenix (13.05.2009 в 16:43):
Как-то плохо отлипает, мышку на пол экрана утянул, а окно на месте.
Пока не понял в чем проблема.

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2025
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 2 (0.0034 сек.) / Память: 4.5 Mb
Наверх