Форум: "Потрепаться";
Текущий архив: 2003.08.14;
Скачать: [xml.tar.bz2];
ВнизКак Найти похожие ветки
← →
pirat (2003-06-08 15:26) [0]Как встроить мое окно рядом с окном рабочего стола наподобии того как это может делать аська, панель задач виндовз, и многие другие проги, то чтобы окно рабочего стола уменьшилось в размерах и рядом встало мое окно?
← →
Yanis (2003-06-08 16:13) [1]Не знаю как насчет размеров рабочего стола. Но ты знаешь как делать фишку как в Winamp"е, типа прилипание к краю экрана? Вот то что ты спрашиваешь так и делается с помощью замечательной апишки
WM_WINDOWPOSCHANGING
.
← →
DVM (2003-06-08 16:39) [2]
> pirat ©
SHAppbarMessage
← →
Yanis (2003-06-08 16:52) [3]To DVM © (08.06.03 16:39)
Интересно! А поподробнее.
← →
DVM (2003-06-08 17:05) [4]
> Yanis ©
Регистрирует в системе уже существующее окно как appbar.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shappbarmessage.asp
Панель задач, панель офиса - это и есть AppBar-ы.
Примеры компонентов, реализующих это на www.torry.net
← →
E_Dimon (2003-06-08 17:29) [5]SystemParametersInfo(SPI_SETWORKAREA,......)
если я не ошибаюсь
← →
Pirat (2003-06-09 02:04) [6]ок, остановимся на эффекте WinAmp"а пока :)
вот что у меня получилось :
private
procedure WMWindowPosChanging(var Message:TMessage);message WM_WINDOWPOSCHANGING;
...
procedure TForm1.WMWindowPosChanging(var Message:TMessage);
type
PWindowPos = ^TWindowPos;
var
vp : PWindowPos;
const
xdelt = 8;
ydelt = 8;
begin
vp := PWindowPos(Message.LParam);
{OutputDebugString(PChar(
"("+IntToStr((vp^).x)+","+IntToStr((vp^).y)+") "+
"("+IntToStr((vp^).cx)+","+IntToStr((vp^).cy)+")"+
IntToHex(vp^.flags,8)
));
}
if abs(vp^.x) < xdelt then vp^.x := 0
else
if abs(Screen.Width - (vp^.x + width)) < xdelt then
( vp^.y)ок, остановимся на эффекте WinAmp"а пока :)
вот что у меня получилось :
private
procedure WMWindowPosChanging(var Message:TMessage);message WM_WINDOWPOSCHANGING;
...
procedure TForm1.WMWindowPosChanging(var Message:TMessage);
type
PWindowPos = ^TWindowPos;
var
vp : PWindowPos;
const
xdelt = 8;
ydelt = 8;
begin
vp := PWindowPos(Message.LParam);
{OutputDebugString(PChar(
"("+IntToStr((vp^).x)+","+IntToStr((vp^).y)+") "+
"("+IntToStr((vp^).cx)+","+IntToStr((vp^).cy)+")"+
IntToHex(vp^.flags,8)
));
}
if abs(vp^.x) < xdelt then vp^.x := 0
else
if abs(Screen.Width - (vp^.x + width)) < xdelt then
vp^.x := Screen.Width - width;
if abs(vp^.y) < ydelt then vp^.y := 0
else
if abs(Screen.Height - (vp^.y + height)) < ydelt then
vp^.y := Screen.Height - height;
end;
все хорошо, только вот при перетаскивании фон под окном перерисовывается с некоторым тормозом, а когда winamp таскаешь все идеально... в чем проблема ?
и еще одна неприятность - resizing окончательно выполняется тольео при отпускании мыши, а хотелось бы сразу...
← →
Spawn (2003-06-09 15:34) [7]При перетаксивании окна также генерируется сообщение WM_MOVING - посморти еще его.
← →
Yanis (2003-06-10 14:20) [8]Вот так кажется не глючит, попробуй:
procedure TForm1.WMWINDOWPOSCHANGING(var Msg: TWMWINDOWPOSCHANGING);
var
Docked: Boolean;
rWorkArea: TRect;
StickAt : Word;
begin
StickAt :=20;
SystemParametersInfo
(SPI_GETWORKAREA, 0, @rWorkArea, 0);
with Msg.WindowPos^ do begin
if x <= rWorkArea.Left + StickAt then begin
x := rWorkArea.Left;
Docked := TRUE;
end;
if x + cx >= rWorkArea.Right - StickAt then begin
x := rWorkArea.Right - cx;
Docked := TRUE;
end;
if y <= rWorkArea.Top + StickAt then begin
y := rWorkArea.Top;
Docked := TRUE;
end;
if y + cy >= rWorkArea.Bottom - StickAt then begin
y := rWorkArea.Bottom - cy;
Docked := TRUE;
end;
if Docked then begin
with rWorkArea do begin
// запрещаем перемещение за пределы экрана
if x < Left then x := Left;
if x + cx > Right then x := Right - cx;
if y < Top then y := Top;
if y + cy > Bottom then y := Bottom - cy;
end; {with rWorkArea}
end; {if Docked}
end; {with Msg.WindowPos^}
inherited;
end;
end.
end;
← →
pirat (2003-06-11 13:22) [9]Офигительно!!! :D Спасибо !
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2003.08.14;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c