Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сообщение не обрабатывается [D7, WinXP]


Calibr ©   (2006-12-27 11:31:00) 

Почему не обрабатывается сообщение WM_LBUTTONUP. Я всеголишь хотел сделать чтоб форму можно было таскать за клиентскую область и при окончании перетаскивания выполнить кое-какие действия. А сообщение почему-то не обрабатывается когда существует процедура WM_NCHITTEST. Подскажите, как решить проблему?


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm1 = class(TForm)
 private
   procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
   procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
   { Private declarations }
 public
   { Public declarations }

 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMLButtonUp(var Message: TWMLButtonUp);
begin
 ShowMessage('Отпущена левая кнопка мыши!');
end;

procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
begin
 Message.Result := HTCaption;
end;

end.


Calibr   (2006-12-28 16:34:00) [1]


> easy ©   (28.12.06 12:28) [13]


Спасибо помогло!


easy   (2006-12-28 12:31:00) [2]

pt: TPoint;
//****


easy   (2006-12-28 12:28:00) [3]

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 if ssLeft in Shift then
   pt:=Point(X,Y);
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
 R:TRect;
begin
 if ssLeft in Shift then begin
   GetWindowRect(handle,R);
   MoveWindow(handle,R.left+(X-pt.X),R.top+(Y-pt.Y) ,R.right-R.left,R.bottom-R.top,true);
 end;
end;


EvChul   (2006-12-27 17:50:00) [4]

А может пойти вообще другим путем? Например в обработчике OnMouseDown формы

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
const
 SC_DRAGMOVE = $F012;
begin
ReleaseCapture;
Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
end;


Calibr   (2006-12-27 17:37:00) [5]


> Юрий Зотов ©   (27.12.06 15:19) [10]


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


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm1 = class(TForm)
 private
   procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
   procedure WMNCLButtonUp(var Message: TWMNCLButtonUp); message WM_NCLBUTTONUP;
   { Private declarations }

 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
begin
 Inherited;
 message.Result := HTCaption;
end;

procedure TForm1.WMNCLButtonUp(var Message: TWMNCLButtonUp);
begin
 ShowMessage('123');
end;

end.


Юрий Зотов   (2006-12-27 15:19:00) [6]

> Calibr ©   (27.12.06 14:51) [9]

Ваш постинг [6] я читал. То, что Вы пыталисьобработать сообщение - это понятно. Непонятно другое - а Вы его действительно обработали, или только попытались?


Calibr   (2006-12-27 14:51:00) [7]


> Юрий Зотов ©   (27.12.06 14:40) [8]


Я уже пытался обрабатывать WM_NCLBUTTONUP, но это работает только для формы в развернутом виде, а мне надо чтоб форма была в нормальном виде!


Юрий Зотов   (2006-12-27 14:40:00) [8]

> Calibr ©   (27.12.06 14:29) [6]

Возвращая HTCaption, вы "обманываете" систему, говоря ей, что мышь находится в области заголовка (поэтому и происходит перемещение формы за клиентскую область, как за заголовок).

Но раз система думает, что мышь находится в области заголовка, то вместо сообщений WM_xBUTTONxx она будет посылать форме аналогичные сообщения WM_ NC xBUTTONxx.

Их и надо обрабатывать.


Elen   (2006-12-27 14:34:00) [9]


> Я всеголишь хотел сделать чтоб форму можно было таскать
> за клиентскую область и при окончании перетаскивания выполнить
> кое-какие действия.

А DragDrop не подходит?


Calibr   (2006-12-27 14:29:00) [10]


> Германн ©   (27.12.06 12:58) [5]


Так катит только если форма развернутая! А когда она развернутая, то ее и перемещать не надо!


Германн   (2006-12-27 12:58:00) [11]


> Calibr ©   (27.12.06 11:31)

Попробуй обрабатывать WM_NCLBUTTONUP вместо WM_LBUTTONUP


Calibr   (2006-12-27 12:37:00) [12]


> Юрий Зотов ©   (27.12.06 12:14) [3]


так тоже не работает!


Юрий Зотов   (2006-12-27 12:14:00) [13]

Сначала inherited, потом Result.


Calibr   (2006-12-27 12:01:00) [14]


> EvChul ©   (27.12.06 11:45) [1]


ну тогда форма не перетаскивается за клиентскую область!


EvChul   (2006-12-27 11:45:00) [15]

Ну как минимум

procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
begin
  Message.Result := HTCaption;
  inherited
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо