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

Вниз

Сообщение не обрабатывается   Найти похожие ветки 

 
Calibr ©   (2006-12-27 11:31) [0]

Почему не обрабатывается сообщение 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.


 
EvChul ©   (2006-12-27 11:45) [1]

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

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


 
Calibr ©   (2006-12-27 12:01) [2]


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


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


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

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


 
Calibr ©   (2006-12-27 12:37) [4]


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


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


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


> Calibr ©   (27.12.06 11:31)

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


 
Calibr ©   (2006-12-27 14:29) [6]


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


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


 
Elen ©   (2006-12-27 14:34) [7]


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

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


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

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

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

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

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


 
Calibr ©   (2006-12-27 14:51) [9]


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


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


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

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

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


 
Calibr ©   (2006-12-27 17:37) [11]


> Юрий Зотов ©   (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.


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

А может пойти вообще другим путем? Например в обработчике 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;


 
easy ©   (2006-12-28 12:28) [13]

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;


 
easy ©   (2006-12-28 12:31) [14]

pt: TPoint;
//****


 
Calibr ©   (2006-12-28 16:34) [15]


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


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



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

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

Наверх




Память: 0.5 MB
Время: 0.039 c
15-1170671330
Dimedrol
2007-02-05 13:28
2007.02.25
Посоветуйте MySQL клиента с UTF-8


3-1163439069
FBuilder
2006-11-13 20:31
2007.02.25
mysql stability


2-1170797599
Pasha L
2007-02-07 00:33
2007.02.25
IdTcpClient и дополнительный поток


2-1170858958
Novichok_new
2007-02-07 17:35
2007.02.25
как можно реализовать идею "экономии дисков"


6-1158240246
progmax
2006-09-14 17:24
2007.02.25
Direct connect через IdMappedPortTCP