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

Вниз

Перетаскивание формы не только за её caption   Найти похожие ветки 

 
_Smart   (2002-06-24 03:54) [0]

Подозреваю, что вопрос уже избитый, но все же...

Как мне сделать так, чтобы форма перетаскивалась, не за каптион, а за, скажем, лэйбл?


 
tsarevep ©   (2002-06-24 06:35) [1]

Вот тебе простой варварский способ будет просто таскаться за твой лэйбл.
unit UnitMain;

interface
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,ExtCtrls{обязательно},
StdCtrls, Forms, Dialogs;

type
TForm1 = class(TForm)
Label1: TLabel;
procedure Label1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Label1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
If ssLeft In Shift Then
Begin
ReleaseCapture;
SendMessage(Handle,WM_NCLBUTTONDOWN,HTCAPTION,0);
End;
end;

end.


 
tsarevep ©   (2002-06-24 06:49) [2]

Глючит меня чего то с утра пораньше.
На ExtCtrls не надо ссылаться.


 
Юрий Зотов ©   (2002-06-24 09:08) [3]

А если в обработчике WM_NCHITTEST вернуть HTCAPTION, то будет перетаскиваться вообще за что угодно, кроме дочерних окон. Даже за пустое место. Пишется в 2 строки.


 
AK-74 ©   (2002-06-24 12:49) [4]

TForm1 = class(TForm)
...
private
...
procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest;
...
end;

...
procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
begin
inherited; { вызов унаследованного обработчика }
if M.Result = htClient then { Мышь сидит на окне? }
M.Result := htCaption; { Если да - то пусть Windows думает, что }
{ мышь на caption bar }
end;
...


Окно можно сделать вообще без caption.


 
DeMoN-777 ©   (2002-06-24 12:54) [5]

А я предлагаю такой вариант...........

procedure TForm1.Label1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const SC_DragMove = $F012;
begin
if button=mbleft then
begin
ReleaseCapture;
perform(WM_SysCommand, SC_DragMove, 0);
end;
end;




 
.: Joiro :. ©   (2002-06-24 13:31) [6]

Во, как раз недавно хотел спросить - может знатоки знают.

Я всегда использую то что предложил DeMoN-777 - этот пример встречается в большинстве зарубежных примеров. А в русских ресурсах почти везде вариант с "подсовыванием" Caption.

И вот хотелось бы узнать - есть ли разница в эффективности, оптимальности?

Не Caption"овский вариант на глаз кажется приятнее... :)


 
DeMoN-777 ©   (2002-06-24 14:57) [7]

Я конечно могу предложить ещё другой вариант........
Mailto: Demon-777@yandex.ru
;)


 
.: Joiro :. ©   (2002-06-24 15:05) [8]

Можно ведь и поделится с другими... зачем сразу по почте. :)

Другой вариант получше или просто "прикола ради"? А то вариантов почти на всё что угодно есть три-четире или больще но главное оптимальность.


 
Exploited   (2002-06-24 16:34) [9]

Нужно обработчик события onMouseDown изменить так:

Const
sc_dragMove = $f012;

...

TForm1.MouseDown(....);
Begin
ReleaseCapture;
SendMessage((Sender as TWinControl).Handle,wm_syscommand,sc_dragMove,0);
End;


 
Song ©   (2002-06-24 17:51) [10]

ИМХО F012h только для ленивцев...


 
Exploited   (2002-06-24 18:30) [11]

Почему только для ленивцев?
Извините за серость. Что такое ИМХО?


 
Song ©   (2002-06-24 18:39) [12]

Потому что здесь головой думать не надо, послал сообщение и всё за тебя сделают. WM_NCHITTEST хоть и ерундовое сообщение, но всё-таки подумать хотя бы первый раз при использовании - надо.

ИМХО=IMHO=In My Humble Opinion=По моему скромному мнению


 
Exploited   (2002-06-24 19:26) [13]

Так всё же: какой способ лучше, корректнее, что-ли?
А если нужно, чтобы мышью можно было потаскать за любой компонент на форме? Надеюсь, автор данного вопроса (_Smart) простит меня за вторжение, но начинать новую тему по этому вопросу было бы глупо.


 
Song ©   (2002-06-24 20:31) [14]

2Exploited (24.06.02 19:26)
Если любой визуальный то, F012h


 
Юрий Зотов ©   (2002-06-24 23:22) [15]

> какой способ лучше, корректнее

Никакой. Все зависит от конкретной задачи. Ясно только, что способы с F012 и HTCAPTION намного проще, короче и эффективнее. И что способ с HTCAPTION - легальный (в отличие от недокументированной константы F012). Но это все.



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

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

Наверх




Память: 0.5 MB
Время: 0.016 c
8-23690
Spirit
2002-02-28 09:14
2002.07.08
Как сделать пазл из картинки?


1-23554
ProfiUgl
2002-06-26 08:37
2002.07.08
Копирование файла и ProgressBar


8-23686
DenKop
2002-02-17 22:52
2002.07.08
DirectSound и MP3


1-23668
cher_gvf
2002-06-26 13:12
2002.07.08
Как узнать код ошибки EInOutError ?


6-23713
black_angel_S
2002-04-29 06:45
2002.07.08
Помогите разобратся с ServerSocket.......ActiveConnections......