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

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

Перенос формы за Client Area (Не глючный способ с WMNCHITTEST)


Glex ©   (2006-01-08 17:27:00) 

Как сделать возможным перенос формы за Client Area в RunTime?

Во всех FAQ'ах, которые я просмотрел, продемонстрирован способ с подменой в WMNCHITTEST. Этот способ мне не подходит, так как
1) Image'ы на форме исползуются в качестве элементов управления.
2) Программа пишется на CLX, чтобы сделать возможным последующее её портирование на Linux.


Glex   (2006-01-18 08:23:00) [1]

sniknik
Выручил!!!
Огромное спасибо!!! Респект, млин)))


sniknik   (2006-01-17 22:06:00) [2]

> По непонятной мне причине форма не перемещается.
у тебя нет "шага" на который сдвигать, т.к. X,Y координаты относительно FormImg, Mouse.CursorPos экранные, и обе одной и тойже точки (только начало координат различается)
а отнимая одно от другого ты вообще получаеш ничего не значащую для тебя цифру (FormImg.Left/Top в экранных координатах... вроде того)

> Как исправить код, чтобы всё заработало?
а говорил работало...? -> [14]

TForm1 = class(TForm)
 ...
private
 InX, InY: integer;
 ...
end;

procedure TForm1.FormImgMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
 if ssLeft in Shift then begin
   Left:= Left + X - InX;
   Top:= Top + Y - InY;
 end;
end;

procedure TForm1.FormImgMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 InX:= X;
 InY:= Y;
end;


Glex   (2006-01-17 20:39:00) [3]

procedure TForm1.FormImgMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
if ssLeft in Shift then begin
 Form1.Left:= Mouse.CursorPos.X - X; //Я так понимаю это относительные координаты
 Form1.Top:= Mouse.CursorPos.Y - Y; //
 end;
end;


По непонятной мне причине форма не перемещается. Как исправить код, чтобы всё заработало?


Begin   (2006-01-12 13:52:00) [4]

ClientToParent
ParentToClient
MouseToClient
etc


Glex   (2006-01-09 18:27:00) [5]

Опа! Заработало!
-----------------

Другой вопрос. Простой, новую тему можно не создавать.

Как получить relative координаты мышки, относительно формы? =))


sniknik   (2006-01-09 16:14:00) [6]

линух изучать, его сообщениями(???) пользоваться. я его не знаю настолько чтобы советовать.
но чего точно, так это фунциями из Windows и сообшениями из Messages, точно пользоваться нельзя.  
 
> Кстати, почему с OnMouseMove так глючно работает, что и не работает? =))
???
вот тут действительно интересно а почему? чегож там такого можно написать чтоб неработало? (там же пяти-шести строк хватит... ошибиться негде)


Glex   (2006-01-09 15:59:00) [7]

sniknik

А где бензин взять?(((
В смысле, как надо?


sniknik   (2006-01-09 15:49:00) [8]

ну так. если в "бензиновую" машину угля засыпать, тоже не поедет.


Glex   (2006-01-09 15:28:00) [9]

Form1.Handle - это QOpenScrollViewH.

Так
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const
SC_DRAGMOVE : Longint = $F012;
begin
Windows.ReleaseCapture;
Windows.SendMessage( THandle(Form1.Handle), WM_SYSCOMMAND, SC_DRAGMOVE, 0);
end;

тоже не работает(((((


Glex   (2006-01-09 15:25:00) [10]

френк

Какой THandle? Это в clx.


френк   (2006-01-09 15:06:00) [11]

а смысл приводить THandle к HWND?


Glex   (2006-01-09 14:19:00) [12]

sniknik
Спасибо!!!!

uses Windows, Messages
...
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const
SC_DRAGMOVE : Longint = $F012;
begin
Windows.ReleaseCapture;
Windows.SendMessage( HWND(Form1.Handle), WM_SYSCOMMAND, SC_DRAGMOVE, 0);
end;


Теперь компилиуется, но не работает ((
Кто-нибудь знает универсальный способ без использования Windows может?


sniknik   (2006-01-09 14:07:00) [13]

> Windows?
в свете
> 2) Программа пишется на CLX, чтобы сделать возможным последующее её портирование на Linux.
использование виндовых сообщений... не совсем верное решение.

а так uses Messages;


Glex   (2006-01-09 13:37:00) [14]

uses Windows;

...

______________
[Error] Unit1.pas(33): Undeclared identifier: 'WM_SYSCOMMAND'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
______________

!!!


Glex   (2006-01-09 13:33:00) [15]

VirEx

Работает!!!

Подскажи пожалуйста, какие модули нужно включить в uses лист в CLX application, чтобы этот пример заработал? Windows?


Glex   (2006-01-08 22:59:00) [16]

Спасибо, попробую. Наутро отпишусь. Только у меня такое чувство, что при этом ни форма, ни Image(который alClient) переносится не будут. Если будут, то respect


VirEx   (2006-01-08 22:14:00) [17]

ну вот пример с элементом Panel, можешь сделать через Image:
procedure TForm1.PanelMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const
SC_DRAGMOVE : Longint = $F012;
begin
ReleaseCapture;
SendMessage(Form1.Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
end;


Glex   (2006-01-08 19:10:00) [18]

ап)

Кстати, почему с OnMouseMove так глючно работает, что и не работает? =))


Наверх

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