Форум: "Основная";
Текущий архив: 2003.06.12;
Скачать: [xml.tar.bz2];
ВнизПеремещение формы Найти похожие ветки
← →
HardClubber (2003-06-02 01:22) [0]Мастера!
Вопрос такой. Есть формочка, borderstyle := bsNone.
Хочу мышкой (левой кнопкой) таскать формочку по экрану, что бы не мерцало.
Пробовал так (не вышло):
var
MouseXOld, MouseYOld: integer;
procedure TForm2.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
MouseXOld := X; MouseYOld := Y;
end;
procedure TForm2.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if ssLeft in Shift then begin
Form2.Left := X - MouseXOld + Form2.Left;
Form2.Top := Y - MouseYOld + Form2.Top;
MouseXOld := X; MouseYOld := Y;
end;
end;
Заранее благодарен
← →
Rocker (2003-06-02 02:52) [1]Если у формы нет заголовка, но возможность двигать его должна остаться, то можно воспользоваться следующим примером.
private
procedure WMNCHITTEST(var Msg: TMessage); message WM_NCHITTEST;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowLong(Handle, GWL_STYLE,
GETWINDOWLONG(Handle, GWL_STYLE) and (not WS_CAPTION));
Height := ClientHeight;
end;
procedure TForm1.WMNCHITTEST(var Msg: TMessage);
begin
inherited;
Msg.Result := HTCAPTION;
end;
← →
Думкин (2003-06-02 05:48) [2]procedure TMyForm.WMMouseDown;
begin
ReleaseCapture;
Perform(WM_SysCommand, $F012, 0)
end;
← →
HardClubber (2003-06-02 12:32) [3]Не, это то понятно.... у меня форма двигается, только сильно мерцает, дёргается... и т.д.
← →
HardClubber (2003-06-02 16:23) [4]Может её как то надо прятать, а потом показывать...
← →
HardClubber (2003-06-02 17:34) [5]Эх... сам догадался... Вот один из вариантов, всё работает плавно и красиво :)
var
MouseXOld, MouseYOld: integer;
procedure TForm2.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
Mouse: TMouse;
begin
MouseXOld := Mouse.CursorPos.X; MouseYOld := Mouse.CursorPos.Y;
end;
procedure TForm2.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
Mouse: TMouse;
begin
if ssLeft in Shift then begin
Form2.Left := Form2.Left + (Mouse.CursorPos.X-MouseXOld);
Form2.Top := Form2.Top + (Mouse.CursorPos.Y-MouseYOld);
MouseXOld := Mouse.CursorPos.X;
MouseYOld := Mouse.CursorPos.Y;
end;
end;
← →
LMD (2003-06-02 22:22) [6]А зачем так много всего? По-моему проще так:
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
gPoint:=panel1.ClientToParent(Point(x,y),Form1);
Panel1.OnMouseMove:=Panel1MouseMove;
end;
procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Form1.Top:=mouse.CursorPos.Y-gPoint.y;
Form1.left:=mouse.CursorPos.x-gPoint.x
end;
procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Panel1.OnMouseMove:=nil;
end;
Таким образом, если нажать на Panel1, то форма начнет перетаскиваться. Чуть экономится время на проверке условияif ssLeft in shift then
, но код занимает чуть больше места.
← →
LMD (2003-06-02 22:24) [7]Забыл: глобальная переменная gPoint
var
gPoint:TPoint
← →
Думкин (2003-06-03 06:12) [8]То что оно дергается и мерцает - от кривых рук.
У всех работает как описано у меня и не дергается и не мерцает.
А если уж очень надо, то можно отключить прорисовку формы при перемещении.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.06.12;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c