![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отображение содержимого формы при перетаскивании
Efir © (2007-08-30 21:14:00)Если в винде это свойство отключено.
Это можно сделать, если использовать ф-цию:
SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, Ord(Value), nil, 0)
Но в этом случае перерисоваются все окошки windows, а меня интересует, можно ли сделать это только для своего окна (как в том же winamp).
Efir (2007-08-31 14:22:00) [1]Спасибо всем за помощь.
Сделал двумя способами:
1) В ручную.
var
isDrag:boolean;
dx, dy:integer;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
isDrag:=true;
dx:=Mouse.CursorPos.X-Left;
dy:=Mouse.CursorPos.Y-Top;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if ssLeft in shift then
if isDrag then begin
Left:=Mouse.CursorPos.X-dx;
Top:=Mouse.CursorPos.Y-dy;
end;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
isDrag:=false;
end;
2) По событию WM_MOVING:
TForm1 = class(TForm)
...
private
...
public
procedure WMMoving(var Message:TWMMoving); message WM_MOVING;
end;
procedure TForm1.WMMoving(var Message: TWMMoving);
begin
Left:=Message.DragRect.Left;
Top:=Message.DragRect.Top;
end;
Единственный минус второго способа - отображение рамки вокруг формы при перетаскивании.
Ricks (2007-08-31 13:15:00) [2]Если у тебя окно типа WinAmp (т.е форма без заголовка, но со скином) тогда сделай перемещение вручную. Это будет проще всего.
DVM (2007-08-30 22:40:00) [3]
> А я что сказал ?
OnResize не будет возникать. Только по окончании процесса.
tesseract (2007-08-30 22:33:00) [4]
> WM_SIZING и WM_MOVING - в их обработчиках я так понимаю
> и надо выполнять перерисовку.
А я что сказал ?
DVM (2007-08-30 22:14:00) [5]При отключенном отображении содержимого, помнится, окну не приходят WM_SIZE и WM_MOVE до окончания процесса перетаскивания/изменения размеров, приходят лишь WM_SIZING и WM_MOVING - в их обработчиках я так понимаю и надо выполнять перерисовку.
tesseract (2007-08-30 21:42:00) [6]
> меня интересует, можно ли сделать это только для своего
> окна (как в том же winamp).
OnResize должен сработать, потом вызови OnPaint - только включи Doublebuffered на всякий случай.