Здравствуйте, в этой статье хотел бы поговорить немного о «липких» окнах. Да эффект в приложениях довольно распространенный и чаще всего встречается в каких-нибудь проигрывателях, например, Winamp. Так вот, когда я делал свой проигрыватель на основе bass.dll, то у меня возникла такая проблема (необходимо было организовать «липкое» окно). Проблему я эту решил очень не красиво и получилось очень не удобно и сильно «глючило». А все это я сделал через TTimer. То есть поставил Interval в 1 и потом по созданию формы я написал код, который будет к краю главной формы прилипать другую форму. То есть я просто на таймере задавал Left новой форме. Сейчас эту проблему я решил через обработку сообщений, которые посылаются при перемещении формы, эффект получился тот же, что и при версии с таймером, но зато не «глючил». Есть способы, которые делают «липкие» окна и другие, может более лучшие, но мне как-то свой способ и прижился. Давайте еще рассмотрим перед тем как делать «липкое» окна по отношению к другому, сделаем перемещение формы за любой ее элемент. Для этого мы будем использовать обработку сообщения WMNCHitTest.

Объявим процедуру в спецификаторе доступа private - procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest;

Далее установим курсор на данную процедуру и нажмем Ctrl+Shift+C, после чего у нас появится заготовка нашей процедуры.

Теперь напишем следующий код в нашей процедуре

procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
begin
inherited;
 if  M.Result = htClient then
   M.Result := htCaption;
end;

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

Теперь немного поговорим о том, как сделать, чтобы наше окно прилипало к краям экрана. Тут программировать нам не придется, у формы есть свойство ScreenSnap, который установив в True будет осуществляться такой эффект. В свойстве SnapBuffer устанавливается значение пикселей, начиная с которых будет происходить прилипание к краям экрана.

Теперь о самом «липком» окне к другому окну. Ну для начала создадим еще одну форму и на событии OnShow TForm1 напишем код, который будет определять начальное положение наших форм.

procedure TForm1.FormShow(Sender: TObject);
begin
 Form2.show;
 Form2.Left:=Form1.Left+Form1.Width;
 Form2.Top:=Form1.Top;
end;

После этого нам необходимо отслеживать перемещение нашей главной формы и перемещать туда же второстепенную форму. Для этого мы будем обрабатывать сообщение WMMoving

В спецификаторе доступа private объявим следующую процедуру

procedure WMMoving (var msg: TWMMoving);message WM_MOVING;

Далее установим курсор на данную процедуру и нажмем следующее сочетание клавиш на клавиатуре — Ctrl+Shift+C, после чего появится заготовка для нашей процедуры и напишем следующий код

procedure TForm1.WMMoving(var msg: TWMMoving);
begin
 Form2.Left:=Form1.Left+Form1.Width;
 Form2.Top:=Form1.Top;
end;

Вот и все, тут мы только следим где расположена наша главная форма и за ней уже располагаем второстепенную. Как видите ничего сложного. Можно доработать и получить довольно неплохой результат, но можно найти более эффективный и лучший способ, ну а пока только так.

Кстати, хочу сказать, что выбирать обои для рабочего стола стоит только лучшие и не сильно яркие, чтобы было приятно глазам

Исходник статьи можно скачать тут

Автор статьи - Andrey53

Метки: , ,

Комментарии закрыты.