• добавить в избранное •
abyss-group

Перетаскивание окна за рабочую область. ifcity.info

Чтобы можно было работать с окнами неправильной формы, для начала необходимо решить одну проблему - как перетаскивать окно, у которого нет строки заголовка (где кнопки 'закрыть', 'свернуть' и 'развернуть'). Для ее решения можно пойти в трех направлениях: один не очень изящный и слегка корявый, остальные более изящные. Рассмотрим все.

Первый способ.

Первый способ состоит в обработки событий нажатия клавиши мыши на форме, перемещения мыши и отпускании клавиши. Предварительно следует объявить следующие переменные.

Переменная Hit в начале работы должны иметь значение False. Это удобно сделать в обработчике события формы OnCreate.

Далее следует написать обработчик для события OnMouseDown (нажата клавиша мыши).

Здесь мы будем присваивания перменно Hit значение true указываем, что было произведено нажатие кнопки мыши (пока кнопка будет удерживаться в нажатом состоянии значение переменной Hit будет равно true). Также здесь мы запоминаем текущие координаты мыши. Далее следует написать обработчик для события OnMouseMove (перемещение курсора мыши)

Сначала идет проверка нажата ли клавиша мыши, если нажата, то перемещаем наше окно. И осталось написать обработчик для события OnMouseUp.

Таким образом мы указываем что кнопка было отпущена, и теперь при перемещении мыши не следует перетаскивать окно.

А теперь о недостатках это метода. Во первых, перетаскивание в том виде, в котором приведено выше будет осуществляться с помощью обоих кнопок мыши (обычно это принято делать только левой кнопкой). Этот недостаток легко обходиться, следует лишь дополнительно проверять параметр Button:TMouseButton. Второй недостаток просто так не обойти. Если стоит режим, когда при перетаскивании окна само окно не перетаскивается, а перетаскивается его контур и лишь при отжатии клавиши окно рисуется на новом месте, то данный метод будет делать окно "белой вороной" перетаскиваемое окно, т.к. оно будет постоянно перерисовываться при перетаскивании.

Второй способ

Второй способ состоит в обработке сообщения WM_NCHITTEST. Сообщение посылается окну, и параметрами его являются координаты курсора мыши. Сообщение обрабатывается и возврашается одно из значений, из которых нас будут интересовать только два: HTCLIENT и HTCAPTION. После обработки соообщения по умолчанию возврщается результат над какой областью окна была нажата клавиша мыши. HTCLIENT означает что клавиша была нажата над клиентской областью, а HTCAPTION - над заголовком окна. Как известно Windows обеспечивает перетаскивание за заголовок окна, следовательно нам надо перехватить на обратном пути сообщение, и если клавиша была нажата над клиентской областью, то подменить возвращаемое значение, указывая что будто-бы нажатие было над заголовком.

В Delphi это делается следующим образом. Сначала объявляем обработчик сообщения, это делается в объявлении класса окна.

После этого описываем соответствующий обработчик.

Сначала мы вызываем обработку по умолчанию, а затем если надо переобпределяем возвращаемое значение. Данный метод не обладает теми недостатками, которые были указаны приминительно к первому методу. Кстати таким образом можно перетаскивать окна и не имеющие заголовка.

Третий способ

Третий способ наиболее прост в реализации. Надо в обработчике события OnMouseDown, того компонента, за который будем перетягивать окно, прописать следующий код:

• программирование •

• copyright © 2002-2003 «abyss-group» •
Hosted by uCoz