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

Вниз

Проблемы с отловом события WM_MBUTTONUP   Найти похожие ветки 

 
demon ©   (2008-11-06 15:26) [0]

После добавления обработчика событий WM_NCHITTEST перестают отлавливаться события с обработчитка WM_MBUTTONUP.
Как востановить реакцию формы на события средней клавиши мыши?

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
 private
   procedure MidleClick(var Msg: TMessage); message  WM_MBUTTONUP ;
   procedure WMNCHITTEST(var WMNChitTest: TWMNCHITTEST); message WM_NCHITTEST;
 public
 protected
   procedure CreateParams(var Params: TCreateParams); override;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.MidleClick ;
begin
if  Form1.WindowState <> wsMaximized
 then Form1.WindowState := wsMaximized
 else Form1.WindowState := wsNormal;
end;

procedure TForm1.WMNCHITTEST(var WMNChitTest: TWMNCHITTEST);
begin
 inherited;
 if WMNChitTest.Result = HTClient then
   WMNChitTest.Result := hTCaption;
end;

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
 inherited CreateParams(Params);
 with Params do
   Style := (Style OR WS_POPUP) AND NOT WS_DLGFRAME;
end;

end.


 
Vlad Oshin ©   (2008-11-06 16:01) [1]

а зачем так?

можно
обрабатывать нажатие левой, взвести флаг
обрабатывать отпускание левой, сбросить флаг
если флаг и перемещение мыши, то можно таскать окно


 
demon ©   (2008-11-06 16:20) [2]

Это в обработчике WM_NCHITTEST"a выполнять нужно?
Про флаг при нажатии и отпускании ясно.
Как определить перемещение мыши?


 
Vlad Oshin ©   (2008-11-06 16:27) [3]

WM_MOUSEMOVE


 
demon ©   (2008-11-06 16:55) [4]

Наверное WMNCHITTEST обрабатываеться раньше чем TForm1.FormMouseDown...
Следующий код не работает, хотя все как вы советовали (только без WM_MOUSEMOVE )

var mousedownflag: bool;

procedure TForm1.MidleClick ;
begin
if  Form1.WindowState <> wsMaximized
 then Form1.WindowState := wsMaximized
 else Form1.WindowState := wsNormal;
end;

procedure TForm1.WMNCHITTEST(var WMNChitTest: TWMNCHITTEST);
begin
 inherited;

if mousedownflag and (WMNChitTest.Result = HTClient)  then
   WMNChitTest.Result := hTCaption;

end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
if  Button=mbLeft then
 mousedownflag:=true;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
if  Button=mbLeft then
 mousedownflag:=false;
end;


 
Vlad Oshin ©   (2008-11-06 17:04) [5]

да, скорее всего раньше

обрабатывать нажатие левой, взвести флаг
обрабатывать отпускание левой, сбросить флаг


Предлагаю ставить на
 WM_LBUTTONDOWN      = $0201;
 {$EXTERNALSYM WM_LBUTTONUP}
 WM_LBUTTONUP        = $0202;


 
demon ©   (2008-11-06 23:42) [6]

Тоже ничего не получаеться, вернее сказать получаеться совсем не то что надо...
Может у кого-небудь есть еще идеи?


 
Leonid Troyanovsky ©   (2008-11-07 11:13) [7]


> demon ©   (06.11.08 23:42) [6]

procedure MidleClick(var Msg: TMessage); message  WM_NCMBUTTONUP;

--
Regards, LVT.


 
Vlad Oshin ©   (2008-11-07 11:25) [8]

Навскидку
может это доработать получится?

unit Unit1;

interface

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

type
TForm1 = class(TForm)
private
  fl:byte;
  procedure MidleClick(var Msg: TMessage); message  WM_MBUTTONUP;
  procedure LBUTTONDOWNClick(var Msg: TMessage); message  WM_LBUTTONDOWN;
  procedure LBUTTONUPClick(var Msg: TMessage); message  WM_LBUTTONUP;
  procedure WM_MOUSEMOVEClick(var Msg: TMessage); message  WM_MOUSEMOVE;
public
protected
  procedure CreateParams(var Params: TCreateParams); override;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.LBUTTONDOWNClick(var Msg: TMessage);
begin
 fl:=1;
end;

procedure TForm1.LBUTTONUPClick(var Msg: TMessage);
begin
 fl:=0;
end;

procedure TForm1.MidleClick ;
begin
if  Form1.WindowState <> wsMaximized
then Form1.WindowState := wsMaximized
else Form1.WindowState := wsNormal;
end;

procedure TForm1.WM_MOUSEMOVEClick(var Msg: TMessage);
begin
  if fl=1 then
  begin
     fl:=0;
     form1.top:=msg.LParamHi;
     form1.left:=msg.LParamLo;
     fl:=1;
  end;
end;

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do Style := (Style OR WS_POPUP) AND NOT WS_DLGFRAME;
fl:=0;
end;

end.


 
Vlad Oshin ©   (2008-11-07 11:33) [9]


> WM_NCMBUTTONUP

блинн...
:)


 
demon ©   (2008-11-07 13:06) [10]

О как все просто! :))
Спасибо!



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

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

Наверх




Память: 0.49 MB
Время: 0.017 c
2-1225904136
TRSteep
2008-11-05 19:55
2008.12.14
Алгоритм Blowfish


2-1225974414
demon
2008-11-06 15:26
2008.12.14
Проблемы с отловом события WM_MBUTTONUP


15-1223026051
Виталий Глуниц
2008-10-03 13:27
2008.12.14
Премирование программистов


4-1202039343
Gbp
2008-02-03 14:49
2008.12.14
Как узнать права на ключ реестра для определенного пользователя?


15-1223885552
Zlodey
2008-10-13 12:12
2008.12.14
Помогите с формулировкой