|
|
Регистрация | << Правила форума >> | 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)); jmp $ ; Happy End! The Cake Is A Lie. |
#5
|
|||
|
|||
Спасибо большое! ryderx34, Bargest, deltas благодарю
|