Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Программа прилипающая к краям


XRMiPO ©   (2008-04-05 11:10:00) 

как сделать, чтобы моя программа прилипала к краям экрана, и при этом чтобы ее нельзя было переместить за край экрана, только в пределах экрана и с прилипанием к краям?


DVM   (2008-04-06 21:09:00) [1]

А для окна, прилипающего к краям рабочей области экрана, целесообразнее обрабатывать WM_SIZING и WM_MOVING. WM_WINDOWPOSCHANGING тоже можно, но это избыточно.

А SHAppBarMessage тут посоветовали совсем не в кассу, т.к. сама по себе эта функция ничего не делает, кроме как добавляет окно в список панелей эксплорера и в дальнейшем заставляет эксплорер учитывать это окно при перерасчете положения всех панелей и рабочей области. Прилипать окно к краям она не научит. С ее помощью можно лишь получить информацию о том, что пора прилипать и куда прилипать.


DVM   (2008-04-06 21:04:00) [2]

Программа не может прилипать к краям чего бы то ни было!


XRMiPO   (2008-04-06 18:35:00) [3]

все отлично работает, спасибо большое)


{RASkov}   (2008-04-05 14:37:00) [4]

> Message.WindowPos^.x< 0

procedure TForm1.WMWindowPosChanging(var Msg: TWMWindowPosChanging);
begin
 inherited;
 with Msg.WindowPos^ do begin
  if x<Screen.WorkAreaLeft then x:=Screen.WorkAreaLeft;
  if y<Screen.WorkAreaTop then y:=Screen.WorkAreaTop;
  if x>Screen.WorkAreaWidth-Width then x:=Screen.WorkAreaWidth-Self.Width;
  if y>Screen.WorkAreaHeight-Height then y:=Screen.WorkAreaHeight-Height;
 end;
end;


{RASkov}   (2008-04-05 14:25:00) [5]

> [7] XRMiPO   (05.04.08 14:13)

type
 TForm1 = class(TForm)
.........
   procedure FormCreate(Sender: TObject);
 private
   procedure WMWindowPosChanging(var Message: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;
   { Private declarations }
 public
 end;
...........
procedure TForm1.FormCreate(Sender: TObject);
begin
 SnapBuffer:=10;   // Если
 ScreenSnap:=True; // есть
end;

procedure TForm1.WMWindowPosChanging(var Message: TWMWindowPosChanging);
begin
 inherited;
 if Message.WindowPos^.x<0 then Message.WindowPos^.x:=0;
 if Message.WindowPos^.y<0 then Message.WindowPos^.y:=0;
 if Message.WindowPos^.x>Screen.WorkAreaWidth-Width then Message.WindowPos^.x:=Screen.WorkAreaWidth-Width;
 if Message.WindowPos^.y>Screen.WorkAreaHeight-Height then Message.WindowPos^.y:=Screen.WorkAreaHeight-Height;
end;


XRMiPO   (2008-04-05 14:13:00) [6]

только еще в private надо добавить
          procedure WMWINDOWPOSCHANGING
(Var Msg: TWMWINDOWPOSCHANGING);
message WM_WINDOWPOSCHANGING;

и delphi ненравится минус здесь:
if (Abs(Edge + SnapDistance — SnapToEdge) < FSnapBuffer) then


Kolan   (2008-04-05 13:58:00) [7]

Кстати в BDS у форм есть свойства ScreenSnap и SnapBuffer.

Вот как они используются:

procedure TCustomForm.WMWindowPosChanging(var Message: TWMWindowPosChanging);

 procedure HandleEdge(var Edge: Integer; SnapToEdge: Integer;
   SnapDistance: Integer = 0);
 begin
   if (Abs(Edge + SnapDistance — SnapToEdge) < FSnapBuffer) then
     Edge := SnapToEdge — SnapDistance;
 end;

begin
 if FScreenSnap and ((Parent = nil) or not (csDesigning in ComponentState)) and
   ((Message.WindowPos^.X 0) or (Message.WindowPos^.Y 0)) and
   ((Message.WindowPos^.cx = Width) and (Message.WindowPos^.cy = Height)) then
   with Message.WindowPos^, Monitor.WorkareaRect do
   begin
     HandleEdge(x, Left, Monitor.WorkareaRect.Left);
     HandleEdge(y, Top, Monitor.WorkareaRect.Top);
     HandleEdge(x, Right, Width);
     HandleEdge(y, Bottom, Height);
   end;
 inherited;
end;


Семеныч   (2008-04-05 13:55:00) [8]

> XRMiPO   (05.04.08 13:28) [3]

Именно так. А теперь перечитайте свой вопрос.


XRMiPO   (2008-04-05 13:39:00) [9]

в интернете везде один и тот же очень глючно работающий пример


XRMiPO   (2008-04-05 13:28:00) [10]

Нет, SHAppBarMessage используется для создание панелей, под которые выделяется часть экрана и все остальное сдвигается.


Семеныч   (2008-04-05 12:30:00) [11]

И ключевое слово SHAppBarMessage позволит существенно сократить время поиска.


Kolan   (2008-04-05 11:50:00) [12]

Ищи в интернете. Там есть именно то что тебе нужно.


Наверх

Титульная страница Поиск, карта сайта Написать письмо