Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как перетащить форму, если... [D5, WinXP]


SemFLY ©   (2002-09-12 10:18:00) 

Свойство BorderStyle := bsNONE, а то сделал форму без окантовки,
а теперь перетаскивать её не могу :(

Спасибо ! ;)


SemFLY   (2002-09-13 23:41:00) [1]

Спасибо ! ;))


alena.svt   (2002-09-13 19:53:00) [2]

А вообще чего то проблемы не вижу
первый пример просто посимпотичнее.
Ну а так как и надо.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
private
procedure WMNCHitTest(var M: TWMNCHitTest);
message wm_NCHitTest;

public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}
procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
begin
inherited;
if M.Result = htClient then
M.Result := htCaption;
end;

end.


alena.svt   (2002-09-13 19:43:00) [3]

А вот так еще и с рамочкой!

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
OldX,
OldY,
OldLeft,
OldTop : Integer;
ScreenDC : HDC;
MoveRect : TRect;
Dragging : Boolean;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
begin
ScreenDC := GetDC(0);
OldX := X;
OldY := Y;
OldLeft := X;
OldTop := Y;
MoveRect := BoundsRect;
DrawFocusRect(ScreenDC, MoveRect);
Dragging := True;
end;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if Dragging then begin
DrawFocusRect(ScreenDC,MoveRect);
OldX := X;
OldY := Y;
MoveRect := Rect(Left+OldX-OldLeft,Top+OldY-OldTop,
Left+Width+OldX-OldLeft,Top+Height+OldY-OldTop);
DrawFocusRect(ScreenDC,MoveRect);
end;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then begin
DrawFocusRect(ScreenDC,MoveRect);
Left := Left+X-OldLeft;
Top := Top+Y-OldTop;
ReleaseDC(0,ScreenDC);
Dragging := False;
end;
end;

end.


zavdim   (2002-09-13 12:53:00) [4]

Только не в MouseMove, а в MouseDown.


SemFLY   (2002-09-12 16:59:00) [5]

Оки ,сейчас почитаю что и как ;))


Song   (2002-09-12 10:44:00) [6]

SC_DRAGMOVE конечно красиво, но подход ленивого программиста, а не хорошего :-)


Alibaba   (2002-09-12 10:33:00) [7]

Или MouseMove
Или сделать окантовку
Я больше решений не вижу...
Если найдутся еще мне было-бы интересно услышать. :)


McSimm   (2002-09-12 10:31:00) [8]

у формы:
procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHITTEST;

В этом обработчике надо оценить положение мыши и если надо перетаскивать - вернуть Msg.Result := htCaption;


Игорь Шевченко   (2002-09-12 10:30:00) [9]

http://www.delphikingdom.com/treasury/hsdialogs.htm
Там формы без окантовки, таскаются. Ключевое слово - WMNCHitTest


Игорь Шевченко   (2002-09-12 10:29:00) [10]

Окантовку не проще сделать ? :-)


France   (2002-09-12 10:28:00) [11]

А вот так попробуйте:
Закиньте в MouseMove(попробовал для Panel и Image - работает)

if ssleft in shift then
begin
ReleaseCapture;
Form1.perform(WM_syscommand, $F012, 0);
end;


AFrolov   (2002-09-12 10:24:00) [12]

Почитай статьи как таскать форму не за шапку. Такая статья должна быть на http://www.sources.ru/


Наверх

Титульная страница Поиск, карта сайта Написать письмо