
Как сделать перетаскиваемый курсор-прицел
У многих программ для работы с окнами приложений есть такая фича, как перетаскиваемый указатель-прицел, с помощью которого можно выбрать определенное окно. Когда-то у меня в комментариях спросили, как можно сделать что-то подобное. Что ж, лучше поздно, чем никогда.Начнем с теории, как это все должно работать. На форме программы сперва рисуется значок прицела, это самая обычная статическая картинка. При клике на нее активируется процесс перетаскивания. Системный курсор меняется на этот же прицел, а значок на форме скрывается. Тем самым достигается визуальный эффект, что перетаскивается именно прицел с формы. Пока кнопка мыши нажата, обрабатываются координаты курсора и выполняются нужные действия с этой информацией. При отпускании кнопки мыши курсор меняется на дефолтный системный, а на форме снова отображается картинка. Таким образом нам надо отслеживать три сообщения окна: WM_LBUTTONDOWN для нажатия левой кнопки мыши, WM_LBUTTONUP для ее отпускания и WM_MOUSEMOVE для перемещения мыши.
Code (Assembler) : Убрать нумерацию
- cmp [msg],WM_LBUTTONDOWN
- je .wmsetcursor
- cmp [msg],WM_LBUTTONUP
- je .wmreleasecursor
- cmp [msg],WM_MOUSEMOVE
- je .wmmousemove
Code (Assembler) : Убрать нумерацию
- .wmsetcursor:
- ; Получить координаты события
- invoke GetMessagePos
- ; Координата Y
- mov ebx,eax
- shr ebx,16
- mov [pt.y],ebx
- ; Координата X
- mov ebx,eax
- and ebx,0FFFFh
- mov [pt.x],ebx
- ; Получить границы иконки
- invoke GetWindowRect,[hStatic],img
- ; Клик произошел в области иконки?
- invoke PtInRect,img,[pt.x],[pt.y]
- or eax,eax
- jz .processed
- ; Установить захват событий мыши
- invoke SetCapture,[hwnddlg]
- ; Загрузить наш курсор
- invoke SetCursor,[hCursor]
- ; Скрыть иконку на форме
- invoke SendMessage,[hStatic],STM_SETIMAGE,IMAGE_CURSOR,0
- mov [state],1
При отпускании левой кнопки мыши надо освободить захват событий мыши при помощи функции ReleaseCapture, вернуть картинку прицела на место и установить дефолтный курсор. Флаг активности также надо сбросить.
Code (Assembler) : Убрать нумерацию
- .wmreleasecursor:
- ; Отпустить захват событий мыши
- invoke ReleaseCapture
- ; Загрузить стандартный курсор
- invoke LoadCursor,NULL,IDC_ARROW
- invoke SetCursor,eax
- ; Вернуть иконку на место
- invoke SendMessage,[hStatic],STM_SETIMAGE,IMAGE_CURSOR,[hCursor]
- mov [state],0
Code (Assembler) : Убрать нумерацию
- .wmmousemove:
- ; Режим отслеживания?
- cmp [state],1
- jne .processed
- ; Координаты курсора
- invoke GetCursorPos,pt
- ; Действия по этим координатам
Просмотров: 146 | Комментариев: 0
Метки: Assembler

Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет

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