Blog. Just Blog

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

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Еще один интересный трюк при работе с окнами - так называемые "липкие" или "магнитные" окна, которые прилипают к границам экрана при перемещении. Это реализуется достаточно просто, но выглядит очень эффектно. Для перехвата перемещения окна надо обрабатывать сообщение WM_MOVING. В параметре lParam передается адрес структуры RECT, которая содержит значения конечных координат окна после отпускания курсора мыши. Чтобы при изменении координат окна не возникало неприятного эффекта моргания, их надо менять сразу же в передаваемой структуре. Обработчик WM_MOVING выглядит следующим образом:
  1. ; Обработчик сообщения WM_MOVING
  2.  
  3. MAX_GRID = 20   ; Размер магнитной сетки
  4.  
  5. ; Проверить положение левой границы окна
  6. chk_left_position:
  7.         ; В регистре EDX указатель на структуру координат окна
  8.         mov     edx,[lparam]
  9.         mov     eax,dword [edx+0]  ; left
  10.         mov     ecx,dword [edx+8]  ; right
  11.         sub     ecx,eax
  12.         test    eax,eax
  13.         jns     @f
  14.         neg     eax
  15. @@:
  16.         cmp     eax,MAX_GRID
  17.         ja      @f
  18.         mov     dword [edx+0],0
  19.         mov     dword [edx+8],ecx
  20. @@:
  21.  
  22. ; Проверить положение правой границы окна
  23. chk_right_position:
  24.         ; Получить размер рабочей области экрана
  25.         invoke  SystemParametersInfo,SPI_GETWORKAREA,NULL,coord,FALSE
  26.  
  27.         ; В регистре EDX указатель на структуру координат окна
  28.         mov     edx,[lparam]
  29.  
  30.         mov     eax,dword [edx+8]  ; right
  31.         sub     eax,dword [edx+0]  ; left
  32.         push    eax
  33.  
  34.         mov     eax,[coord.right]  ; workarea right
  35.         mov     ecx,dword [edx+8]  ; right
  36.         sub     eax,ecx
  37.         test    eax,eax
  38.         jns     @f
  39.         neg     eax
  40. @@:
  41.         cmp     eax,MAX_GRID
  42.         pop     eax
  43.         ja      @f
  44.         mov     ecx,[coord.right]
  45.         mov     dword [edx+8],ecx
  46.         sub     ecx,eax
  47.         mov     dword [edx+0],ecx
  48. @@:
  49.  
  50. ; Проверить положение верхней границы окна
  51. chk_top_position:
  52. ; В регистре EDX указатель на структуру координат окна
  53.         mov     edx,[lparam]
  54.         mov     eax,dword [edx+4]   ; top
  55.         mov     ecx,dword [edx+12]  ; bottom
  56.         sub     ecx,eax
  57.         test    eax,eax
  58.         jns     @f
  59.         neg     eax
  60. @@:
  61.         cmp     eax,MAX_GRID
  62.         ja      @f
  63.         mov     dword [edx+4],0
  64.         mov     dword [edx+12],ecx
  65. @@:
  66.  
  67. ; Проверить положение нижней границы окна
  68. chk_bottom_position:
  69.         ; Получить размер рабочей области экрана. Структура coord
  70.         ; определена заранее в сегменте данных
  71.         invoke  SystemParametersInfo,SPI_GETWORKAREA,NULL,coord,FALSE
  72.  
  73.         ; В регистре EDX указатель на структуру координат окна
  74.         mov     edx,[lparam]
  75.  
  76.         mov     eax,dword [edx+12]  ; bottom
  77.         sub     eax,dword [edx+4]   ; top
  78.         push    eax
  79.  
  80.         mov     eax,[coord.bottom]  ; workarea bottom
  81.         mov     ecx,dword [edx+12]  ; bottom
  82.         sub     eax,ecx
  83.         test    eax,eax
  84.         jns     @f
  85.         neg     eax
  86. @@:
  87.         cmp     eax,MAX_GRID
  88.         pop     eax
  89.         ja      @f
  90.         mov     ecx,[coord.bottom]
  91.         mov     dword [edx+12],ecx
  92.         sub     ecx,eax
  93.         mov     dword [edx+4],ecx
  94. @@:
  95.         mov     eax,TRUE
  96.         jmp     finish
Размеры области экрана для вычисления новых координат окна с учетом таскбара и других видимых панелей можно получить вызовом функции SystemParametersInfo с параметром SPI_GETWORKAREA. В приведенном примере размер магнитной сетки (минимальное расстояние до границы экрана, с которого начинает действовать сила притяжения), меняется в константе MAX_GRID. По умолчанию значение равно 20 пикселов.

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

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

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


Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 3788 | Комментариев: 10

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

Комментарии

Отзывы посетителей сайта о статье
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-2017
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 2 (0.0047 сек.) / Память: 4.5 Mb
Наверх