![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перенос формы за 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 так глючно работает, что и не работает? =))