Jul 10

Кнопка, которая нажимается автоматом

Данный компонент являктся кнопкой, на которую нет необходимости нажимать, чтобы произошло событие OnClick. Полностью достаточно будет навести мышки курсор на кнопку. Если же создавать такой компонент по обычной методике, нужно достаточно много времени, потому что надо обрабатывать саму  мышку и далее еще и перехватывать её и т.д. Но по-любому, игра по моему мнению, стоит свечь!..

Давайте посмотрим на 2 версии представленного компонента. В простейшей версии обработчик перемещения мыши, обычным способом перехватывает Windows-сообщения  с необходимым кодом и вызывает обработчик события под названием OnClick:

type
TAutoButton1 = class(TButton)
private
procedure WmMouseMove (var Msg: TMessage);
message wm_MouseMove;
end;

procedure TAutoButton1.WmMouseMove (var Msg: TMessage);
begin
inherited;
if Assigned (OnClick) then
OnClick (self);
end;

Надо отметить, что во второй версии представлено намного больше исходного кода, именно в ней мы попробуем

повторить событие мышки OnClick, в том случае если пользователь двигает мышку над кнопкой или по истечении некоторого времени.

Нам следует объявить класс:

type
TAutoKind = (akTime, akMovement, akBoth);

TAutoButton2 = class(TButton)
private
FAutoKind: TAutoKind;
FMovements: Integer;
FSeconds: Integer;
// really private
CurrMov: Integer;
Capture: Boolean;
MyTimer: TTimer;
procedure EndCapture;
// это есть обработчики сообщений
procedure WmMouseMove (var Msg: TWMMouse);
message wm_MouseMove;
procedure TimerProc (Sender: TObject);
procedure WmLBUttonDown (var Msg: TMessage);
message wm_LBUttonDown;
procedure WmLButtonUp (var Msg: TMessage);
message wm_LButtonUp;
public
constructor Create (AOwner: TComponent); override;
published
property AutoKind: TAutoKind
read FAutoKind write FAutoKind default akTime;
property Movements: Integer
read FMovements write FMovements default 5;
property Seconds: Integer
read FSeconds write FSeconds default 10;
end;

Когда уже мыши курсор наконец попадает в область кнопки, то наш компонент сразу запускает либо таймер, либо же счётчик, отображающий количество сообщений о самом перемещении. Когда проходит определённое время или при получении необходимого к-ва сообщений именно о перемещении, компонент автоматически эмулирует требуемое событие нажатия кнопкой:

procedure TAutoButton2.WmMouseMove (var Msg: TWMMouse);
begin
inherited;
if not Capture then
begin
SetCapture (Handle);
Capture := True;
CurrMov := 0;
if FAutoKind <> akMovement then
begin
MyTimer := TTimer.Create (Parent);
if FSeconds <> 0 then
MyTimer.Interval := 3000
else
MyTimer.Interval := FSeconds * 1000;
MyTimer.OnTimer := TimerProc;
MyTimer.Enabled := True;
end;
end
else // здесь захватываем
begin
if (Msg.XPos > 0) and (Msg.XPos < Width)
and (Msg.YPos > 0) and (Msg.YPos < Height) then
begin
// в том случае, когда мы подсчитываем количество движений...
if FAutoKind <> akTime then
begin
Inc (CurrMov);
if CurrMov >= FMovements then
begin
if Assigned (OnClick) then
OnClick (self);
EndCapture;
end;
end;
end
else // находится за пределами... стоп!
EndCapture;
end;
end;

procedure TAutoButton2.EndCapture;
begin
Capture := False;
ReleaseCapture;
if Assigned (MyTimer) then
begin
MyTimer.Enabled := False;
MyTimer.Free;
MyTimer := nil;
end;
end;

procedure TAutoButton2.TimerProc (Sender: TObject);
begin
if Assigned (OnClick) then
OnClick (self);
EndCapture;
end;

procedure TAutoButton2.WmLBUttonDown (var Msg: TMessage);
begin
if not Capture then
inherited;
end;

procedure TAutoButton2.WmLButtonUp (var Msg: TMessage);
begin
if not Capture then
inherited;
end;

Спонсор поста: сервис contentru.com - это не только грамотное написание текстов и статей на заказ, а и комплексные услуги по копирайтингу,  качественное написание рекламных текстов и рекламных статей,  создание эффективных пресс-релизов, а также профессиональный нейминг.


Поделитесь вашими мыслями

Поддерживаемые теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>