Здравствуйте, Rusland, Вы писали:
R>Нужно реализовать "прилипание" окон к границам desktopa на Delphi или Builder-e как в Winampe-e (то есть при приближении окна к границе ближе чем на 20 пикселей нужно переместить окно на край). Нужен готовый код, а не примерные объяснения как это делается. Вопрос вроде простой, но сколько не ищу примеров, ничего пока не нашел. Фактически координаты определить не трудно, например для левого края:
Сомневаюсь что ты нормально пробовал.
Смотри как надо делать:
procedure WMWindowPosChanging (var Message: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;
......
procedure TForm1.WMWindowPosChanging(var Message: TWMWindowPosChanging);
const
StickAt = 20;
var
aWorkArea : TRect;
aWindowRect : TRect;
begin
if Message.WindowPos.flags and (SWP_NOMOVE or SWP_NOSIZE) = 0 then begin
GetWindowRect(Handle, aWindowRect);
if Message.WindowPos.flags and SWP_NOMOVE = 0 then begin
OffSetRect (aWindowRect, - aWindowRect.Left, - aWindowRect.Top);
OffSetRect (aWindowRect, Message.WindowPos.x, Message.WindowPos.y);
end;
if Message.WindowPos.flags and SWP_NOSIZE = 0 then begin
aWindowRect.Bottom := aWindowRect.Top + Message.WindowPos.cy;
aWindowRect.Right := aWindowRect.Left + Message.WindowPos.cx;
end;
SystemParametersInfo (SPI_GETWORKAREA, 0, @aWorkArea, 0);
if Abs (aWindowRect.Right - aWorkArea.Right) <= StickAt then
Message.WindowPos.x := aWorkArea.Right - (aWindowRect.Right - aWindowRect.Left)
else
if Abs (aWindowRect.Left - aWorkArea.Left) <= StickAt then
Message.WindowPos.x := aWorkArea.Left;
if Abs (aWindowRect.Top - aWorkArea.Top) <= StickAt then
Message.WindowPos.y := aWorkArea.Top
else
if Abs (aWindowRect.Bottom - aWorkArea.Bottom) <= StickAt then
Message.WindowPos.y := aWorkArea.Bottom - (aWindowRect.Bottom - aWindowRect.Top);
end;
inherited;
end;
Здравствуйте, Rusland, Вы писали:
R>Только вот при нахождении окна у границы десктопа когда отпускаю мышку окно иногда возвращается на старое место. Как это поправить?
Попробуй это
if Message.WindowPos.flags and (SWP_NOMOVE{ or SWP_NOSIZE}) = 0 then begin
GetWindowRect(Handle, aWindowRect);
...
Нужно реализовать "прилипание" окон к границам desktopa на Delphi или Builder-e как в Winampe-e (то есть при приближении окна к границе ближе чем на 20 пикселей нужно переместить окно на край). Нужен готовый код, а не примерные объяснения как это делается. Вопрос вроде простой, но сколько не ищу примеров, ничего пока не нашел. Фактически координаты определить не трудно, например для левого края:
private
{ Private declarations }
procedure SlideWindow(var Message: TMessage); message WM_WINDOWPOSCHANGING;
....
procedure TForm1.SlideWindow(var Message: TMessage);
var WorkArea:TRect;
WinPos:TRect;
StickAt:Integer;
begin
StickAt:=20; // расстояние до границы
GetWindowRect(Form1.Handle,WinPos); //определяем left, top, width, height окна
SystemParametersInfo(SPI_GETWORKAREA,0,@WorkArea,0); // получаем свободное пространство десктопа
if(abs(WorkArea.Left — WinPos.Left)<=StickAt) then // если до левой границы меньше 20 пикселей
begin
WinPos.Left:=WorkArea.Left; // WinPos.Left получает значение границы — 0
end;
// а что вот дальше делать?
....
Hello Rusland, you wrote:
> Нужно реализовать "прилипание" окон к границам desktopa на Delphi или Builder-e как в Winampe-e (то есть при приближении окна к границе ближе чем на 20 пикселей нужно переместить окно на край). Нужен готовый код, а не примерные объяснения как это делается.
Готовый компонент для этого дела входит с состав JVCL.
Здравствуйте, Danchik, Вы писали:
D>Здравствуйте, Rusland, Вы писали:
R>>Нужно реализовать "прилипание" окон к границам desktopa на Delphi или Builder-e как в Winampe-e (то есть при приближении окна к границе ближе чем на 20 пикселей нужно переместить окно на край). Нужен готовый код, а не примерные объяснения как это делается. Вопрос вроде простой, но сколько не ищу примеров, ничего пока не нашел. Фактически координаты определить не трудно, например для левого края:
D>Сомневаюсь что ты нормально пробовал. D>Смотри как надо делать:
D>
D>procedure WMWindowPosChanging (var Message: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;
D>......
D>procedure TForm1.WMWindowPosChanging(var Message: TWMWindowPosChanging);
D>const
D> StickAt = 20;
D>var
D> aWorkArea : TRect;
D> aWindowRect : TRect;
D>begin
D> if Message.WindowPos.flags and (SWP_NOMOVE or SWP_NOSIZE) = 0 then begin
D> GetWindowRect(Handle, aWindowRect);
D> if Message.WindowPos.flags and SWP_NOMOVE = 0 then begin
D> OffSetRect (aWindowRect, - aWindowRect.Left, - aWindowRect.Top);
D> OffSetRect (aWindowRect, Message.WindowPos.x, Message.WindowPos.y);
D> end;
D> if Message.WindowPos.flags and SWP_NOSIZE = 0 then begin
D> aWindowRect.Bottom := aWindowRect.Top + Message.WindowPos.cy;
D> aWindowRect.Right := aWindowRect.Left + Message.WindowPos.cx;
D> end;
D> SystemParametersInfo (SPI_GETWORKAREA, 0, @aWorkArea, 0);
D> if Abs (aWindowRect.Right - aWorkArea.Right) <= StickAt then
D> Message.WindowPos.x := aWorkArea.Right - (aWindowRect.Right - aWindowRect.Left)
D> else
D> if Abs (aWindowRect.Left - aWorkArea.Left) <= StickAt then
D> Message.WindowPos.x := aWorkArea.Left;
D> if Abs (aWindowRect.Top - aWorkArea.Top) <= StickAt then
D> Message.WindowPos.y := aWorkArea.Top
D> else
D> if Abs (aWindowRect.Bottom - aWorkArea.Bottom) <= StickAt then
D> Message.WindowPos.y := aWorkArea.Bottom - (aWindowRect.Bottom - aWindowRect.Top);
D> end;
D> inherited;
D>end;
D>
Здравствуйте, Danchik, Вы писали:
D>Здравствуйте, Rusland, Вы писали:
R>>Только вот при нахождении окна у границы десктопа когда отпускаю мышку окно иногда возвращается на старое место. Как это поправить?
D>Попробуй это
D>
D> if Message.WindowPos.flags and (SWP_NOMOVE{ or SWP_NOSIZE}) = 0 then begin
D> GetWindowRect(Handle, aWindowRect);
D>...
D>
Помогите перевести
if Message.WindowPos.flags and SWP_NOMOVE = 0 then begin...
на язык C++