Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.07.08;
Скачать: [xml.tar.bz2];

Вниз

Перетаскивание формы не только за её 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.007 c
3-23493
dim-
2002-06-05 23:02
2002.07.08
Из поля


7-23806
sniknik
2002-04-09 18:54
2002.07.08
Определение сетевого диска на доступность


3-23505
Oleon
2002-06-17 13:36
2002.07.08
InterBase.


3-23477
Wassily
2002-06-16 10:19
2002.07.08
Как запретить вносить новые записи в таблицу через DBGrid ?


3-23513
Nicolaus
2002-06-17 15:50
2002.07.08
Может ли функция или проц. Oracle вернуть RecordSet?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский