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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.04 c
15-1170333880
boriskb
2007-02-01 15:44
2007.02.25
История PC в рекламных роликах


15-1170214820
Slider007
2007-01-31 06:40
2007.02.25
С днем рождения ! 31 января


15-1170311796
апмав
2007-02-01 09:36
2007.02.25
Просмотр событий системы


2-1170675823
Medved_
2007-02-05 14:43
2007.02.25
MessageBox


11-1148567746
GigAl
2006-05-25 18:35
2007.02.25
HTML и KOL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский