Форум: "Основная";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];
ВнизПеренос формы за 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.058 c