![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Программа прилипающая к краям
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]Ищи в интернете. Там есть именно то что тебе нужно.