Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.19;
Скачать: CL | DM;

Вниз

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

 
Glex ©   (2006-01-08 17:27) [0]

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

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


 
Glex ©   (2006-01-08 19:10) [1]

ап)

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


 
VirEx ©   (2006-01-08 22:14) [2]

ну вот пример с элементом 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 22:59) [3]

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


 
Glex ©   (2006-01-09 13:33) [4]

VirEx

Работает!!!

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


 
Glex ©   (2006-01-09 13:37) [5]

uses Windows;

...

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

!!!


 
sniknik ©   (2006-01-09 14:07) [6]

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

а так uses Messages;


 
Glex ©   (2006-01-09 14:19) [7]

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 может?


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

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


 
Glex ©   (2006-01-09 15:25) [9]

френк

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


 
Glex ©   (2006-01-09 15:28) [10]

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;

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


 
sniknik ©   (2006-01-09 15:49) [11]

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


 
Glex ©   (2006-01-09 15:59) [12]

sniknik

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


 
sniknik ©   (2006-01-09 16:14) [13]

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


 
Glex ©   (2006-01-09 18:27) [14]

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

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

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


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

ClientToParent
ParentToClient
MouseToClient
etc


 
Glex ©   (2006-01-17 20:39) [16]

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;


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


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

> По непонятной мне причине форма не перемещается.
у тебя нет "шага" на который сдвигать, т.к. 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-18 08:23) [18]

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



Страницы: 1 вся ветка

Текущий архив: 2006.02.19;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.041 c
15-1138526367
palva
2006-01-29 12:19
2006.02.19
О выборе и оценке криптоалгоритма


2-1138977069
буржуй
2006-02-03 17:31
2006.02.19
Как мне удалить себя внутри себя?


15-1138480841
MetalFan
2006-01-28 23:40
2006.02.19
Новости VCL


4-1133690898
Surik
2005-12-04 13:08
2006.02.19
EnumResourceTypes постоянно возвращает ошибку


1-1137868529
Volf_555
2006-01-21 21:35
2006.02.19
Как получить значение %ALLUSERSPROFILE% ?