![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перетаскивание формы не только за её caption [D6]
_Smart © (2002-06-24 03:54:00)Подозреваю, что вопрос уже избитый, но все же...
Как мне сделать так, чтобы форма перетаскивалась, не за каптион, а за, скажем, лэйбл?
Юрий Зотов (2002-06-24 23:22:00) [1]> какой способ лучше, корректнее
Никакой. Все зависит от конкретной задачи. Ясно только, что способы с F012 и HTCAPTION намного проще, короче и эффективнее. И что способ с HTCAPTION - легальный (в отличие от недокументированной константы F012). Но это все.
Song (2002-06-24 20:31:00) [2]2Exploited (24.06.02 19:26)
Если любой визуальный то, F012h
Exploited (2002-06-24 19:26:00) [3]Так всё же: какой способ лучше, корректнее, что-ли?
А если нужно, чтобы мышью можно было потаскать за любой компонент на форме? Надеюсь, автор данного вопроса (_Smart) простит меня за вторжение, но начинать новую тему по этому вопросу было бы глупо.
Song (2002-06-24 18:39:00) [4]Потому что здесь головой думать не надо, послал сообщение и всё за тебя сделают. WM_NCHITTEST хоть и ерундовое сообщение, но всё-таки подумать хотя бы первый раз при использовании - надо.
ИМХО=IMHO=In My Humble Opinion=По моему скромному мнению
Exploited (2002-06-24 18:30:00) [5]Почему только для ленивцев?
Извините за серость. Что такое ИМХО?
Song (2002-06-24 17:51:00) [6]ИМХО F012h только для ленивцев...
Exploited (2002-06-24 16:34:00) [7]Нужно обработчик события onMouseDown изменить так:
Const
sc_dragMove = $f012;
...
TForm1.MouseDown(....);
Begin
ReleaseCapture;
SendMessage((Sender as TWinControl).Handle,wm_syscommand,sc_dragMove,0);
End;
.: Joiro :. (2002-06-24 15:05:00) [8]Можно ведь и поделится с другими... зачем сразу по почте. :)
Другой вариант получше или просто "прикола ради"? А то вариантов почти на всё что угодно есть три-четире или больще но главное оптимальность.
DeMoN-777 (2002-06-24 14:57:00) [9]Я конечно могу предложить ещё другой вариант........
Mailto: Demon-777@yandex.ru
;)
.: Joiro :. (2002-06-24 13:31:00) [10]Во, как раз недавно хотел спросить - может знатоки знают.
Я всегда использую то что предложил DeMoN-777 - этот пример встречается в большинстве зарубежных примеров. А в русских ресурсах почти везде вариант с "подсовыванием" Caption.
И вот хотелось бы узнать - есть ли разница в эффективности, оптимальности?
Не Caption"овский вариант на глаз кажется приятнее... :)
DeMoN-777 (2002-06-24 12:54:00) [11]А я предлагаю такой вариант...........
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;
AK-74 (2002-06-24 12:49:00) [12]
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.
Юрий Зотов (2002-06-24 09:08:00) [13]А если в обработчике WM_NCHITTEST вернуть HTCAPTION, то будет перетаскиваться вообще за что угодно, кроме дочерних окон. Даже за пустое место. Пишется в 2 строки.
tsarevep (2002-06-24 06:49:00) [14]Глючит меня чего то с утра пораньше.
На ExtCtrls не надо ссылаться.
tsarevep (2002-06-24 06:35:00) [15]Вот тебе простой варварский способ будет просто таскаться за твой лэйбл.
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.