Blog. Just Blog

Перетаскивание окна за любое место

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Перетаскивание окна за любое место, а не только за заголовок, реализуется очень просто, но смотрится очень эффектно. Тем более, что окно может быть вообще без заголовка. Для этого в обработчик окна надо добавить следующий код.
  1. ; Процедура обработчика окна
  2. proc  DialogProc hwnddlg,msg,wparam,lparam
  3.       ......
  4.       ; Нажата левая кнопка мышки на окне?
  5.       cmp     [msg], WM_LBUTTONDOWN
  6.       je      drag_window
  7.       ......
  8. drag_window:
  9.       ; Освободить захват мыши окном в текущем потоке и
  10.       ; восстановить обычную обработку ввода данных от мыши
  11.       invoke  ReleaseCapture
  12.       ; Перенаправить сообщение передвижения мышью SC_MOVE на заголовок окна
  13.       ; 61458 = SC_MOVE or HTCAPTION, в FASM по умолчанию не определено,
  14.       ; поэтому сразу задается числовым значением
  15.       invoke  SendMessage,[hwnddlg],WM_SYSCOMMAND,61458,0
  16.       ......
Вызов функции ReleaseCapture необходим для освобождения окна от захвата сообщений мыши. Даже если вы сами не устанавливали эти перехватчики, то они вполне могут быть установлены сторонними программами. В этом случае окно может перемещаться неправильно. Исходник с откомпилированным файлом прилагается.

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

Drag.Window.Demo.zip (1,827 bytes)


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

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

Комментарии

Отзывы посетителей сайта о статье
disciple27 (27.07.2012 в 21:45):
Непомню где, видел ещё такой вариант:
      cmp     [msg], WM_NCHITTEST      ; 84h
      je      drag_window
      .......
  drag_window:
      mov     eax, HTCAPTION           ; 2h
      ret
int_90 (26.01.2012 в 17:20):
Буду разбираться Все равно спасибо за такое количество инфы по FASM из за некоторой мучил безуспешно гугл
ManHunter (26.01.2012 в 17:06):
В моем исходнике все работает, а чужие я не исправляю.
int_90 (26.01.2012 в 17:00):
В том то и дело что включены ( я вставляю после
proc WindowProc  hwnd,wmsg,wparam,lparam а в cmp[wmsg], WM_LBUTTONDOWN msg на wmsg заменил Я так понимаю что у меня ошибка в размещении метки drag_window: окно просто не перересовывается Ее случайно не в цикл закидывать нужно ?
ManHunter (26.01.2012 в 16:09):
Включай куки и качай браузером. Очевидно же.
int_90 (26.01.2012 в 16:08):
При перетаскивании окно сдыхает при попытке перетащить а демка не скачивается ругается на куки

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

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

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