
Как сделать перетаскиваемый курсор-прицел
У многих программ для работы с окнами приложений есть такая фича, как перетаскиваемый указатель-прицел, с помощью которого можно выбрать определенное окно. Когда-то у меня в комментариях спросили, как можно сделать что-то подобное. Что ж, лучше поздно, чем никогда.Начнем с теории, как это все должно работать. На форме программы сперва рисуется значок прицела, это самая обычная статическая картинка. При клике на нее активируется процесс перетаскивания. Системный курсор меняется на этот же прицел, а значок на форме скрывается. Тем самым достигается визуальный эффект, что перетаскивается именно прицел с формы. Пока кнопка мыши нажата, обрабатываются координаты курсора и выполняются нужные действия с этой информацией. При отпускании кнопки мыши курсор меняется на дефолтный системный, а на форме снова отображается картинка. Таким образом нам надо отслеживать три сообщения окна: 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
- ; Действия по этим координатам
Просмотров: 863 | Комментариев: 2
Метки: Assembler

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье

semiono
(31.03.2024 в 23:56):
Приветствую! Может быть было где-то, но никогда не встречал фейдеров, крутилок контролов, хотььчего-то лишь бы работало.
numeric up down control, Slider Control, spin control.
Был бы пример Fasm, я к сожалению нибумбум, но недавно сделал
ComboBox шикарно работает! Просто фронт-енд для консольной sendmidi.exe.
А вот крутилку бы привинтить чтобы что-нибудь регулировало...
По миди обычно диапазон 0 – 7Fh
Может где-то есть пример на слайдер?
numeric up down control, Slider Control, spin control.
Был бы пример Fasm, я к сожалению нибумбум, но недавно сделал
ComboBox шикарно работает! Просто фронт-енд для консольной sendmidi.exe.
А вот крутилку бы привинтить чтобы что-нибудь регулировало...
По миди обычно диапазон 0 – 7Fh
Может где-то есть пример на слайдер?

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

Правда как обработать контрол не знаю, к одному человеку снова неловко обращаться) Как бы мне этим контролом зачения байта крутить)
0 – 7Fh практически всегда рабочий диапазон.