Здравствуйте, в этой статье хотел бы поговорить немного о «липких» окнах. Да эффект в приложениях довольно распространенный и чаще всего встречается в каких-нибудь проигрывателях, например, 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;
Вот и все, тут мы только следим где расположена наша главная форма и за ней уже располагаем второстепенную. Как видите ничего сложного. Можно доработать и получить довольно неплохой результат, но можно найти более эффективный и лучший способ, ну а пока только так.
Кстати, хочу сказать, что выбирать обои для рабочего стола стоит только лучшие и не сильно яркие, чтобы было приятно глазам |
Исходник статьи можно скачать тут