![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Если свойство формы в bsNone, то можно чтобы форму можно было бы перетаскивать без панели вверху окна.
Так, обработать это OnMouseMove: Код:
ReleaseCapture; Perform(WM_SYSCOMMAND, $F012, 0) А если, например, нажав на TImage перетаскивать форму? Так не получается почему. Помогите, как сделать? |
|
#2
|
||||
|
||||
|
Я обычно делаю так -
Код:
...
var
Form1: TForm1;
CursorPos : TPoint;
FormPos : TPoint;
Drag : boolean;
implementation
{$R *.dfm}
...
procedure TForm1.OnIdle(Sender: TObject; var Done: boolean);
var Point: TPoint;
begin
if Drag then
begin
GetCursorPos(Point);
Left := FormPos.X + Point.X - CursorPos.X;
Top := FormPos.Y + Point.Y - CursorPos.Y;
end;
end;
procedure TForm1.Image1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
begin
Drag := True;
FormPos.X := Left;
FormPos.Y := Top;
GetCursorPos(CursorPos);
end;
end;
procedure TForm1.Image1MouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then Drag := False;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnIdle := OnIdle;
end;
|
|
#3
|
||||
|
||||
|
Цитата:
Код:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin ReleaseCapture; Perform(WM_SYSCOMMAND, $F012, 0); end; |
|
#4
|
||||
|
||||
|
Еще можно переопределить обработчик событий окна, и тогда ВСЕ сообщения будут идти сначала в него, а в нем ты уже будешь вызывать старые после отработки нужных действий.
Если надо: Код:
var
old: pointer;
fl:boolean=fasle;
...
function MyWNDProc(h: hwnd; msg, wparam, lparam: longint): longint; stdcall;
begin
case msg of
WM_LBUTTONDOWN:
begin
// сохраняем координаты мыши, ставим глобальный флаг перетаскивания fl:=true;
end;
WM_MouseMove:
begin
// если fl то перетаскиваем - в глобальных переменных храним старые значения X и Y,
// получаем новые, и сдвигаем окно на dX и dY и переписываем старые X и Y новыми
end;
WM_LBUTTONUP:
begin
// fl:=false;
end;
end;
result := CallWindowProc(old, h, msg, wparam, lparam);
end;
// при создании формы:
integer(old) := GetWindowLong(handle, GWL_WNDPROC);
SetWindowlong(handle, GWL_WNDPROC, integer(@MyWNDProc)); |
|
#5
|
|||
|
|||
|
Спасибо большое! ryderx34, Bargest, deltas благодарю
![]() |