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

Вниз

Покидание мыши с компонента   Найти похожие ветки 

 
maxim2 ©   (2003-01-25 23:09) [0]

Привет всем!
Такой вопросик, у меня на форме два Image как бы сделать так чтобы при заходы мыши на image1, image2 показывался, а при выходе с image1 скрывался image2.


 
OxOTHuK   (2003-01-25 23:23) [1]

IMHO, ты должен в обработчика OnMouseMove смотреть координаты мыши и сравнивать их с областью ImageN...


 
Kair ©   (2003-01-25 23:24) [2]

onMouseMove


 
maxim2 ©   (2003-01-25 23:32) [3]

А это не проканает, у меня один имадже наложен на другой


 
Kair ©   (2003-01-25 23:37) [4]

>maxim2 © (25.01.03 23:32)
>А это не проканает, у меня один имадже наложен на другой

Это проканает. Подумай.


 
gsu ©   (2003-01-26 00:13) [5]

>> maxim2 ©
Проканает, проканает, точно говорю, главное поглубже канай ... (-:|~


 
Юрий Зотов ©   (2003-01-26 01:10) [6]

Проканает, говорите? Что ж, ОК.
Итак, мышь ушла с Image1. Где ловить будем?

Свой компонент надо писать. С обработкой CM_MOUSEENTER/LEAVE.


 
gsu ©   (2003-01-26 01:39) [7]

>> Юрий Зотов ©
Зря вы так
Вот если поглубже, э ..., как бы это выразиться, проканать, то многое получится (-:|~


 
Юрий Зотов ©   (2003-01-26 02:01) [8]

> gsu © (26.01.03 01:39)

Может, и зря, не спорю. Но тогда докажите.
Итак, мышь ушла с Image1. Где ловить будем?

Можно, конечно, в хуке. Можно в OnMessage. Можно даже свой драйвер написать. Это уж точно будет "проканать поглубже".

Но, знаете, я сторонник простого и понятного кода. И не сторонник стрельбы из пушки по воробьям.

Итак, мышь ушла с Image1. Где ловить будем?



 
gsu ©   (2003-01-26 02:16) [9]

>> Может, и зря, не спорю.
Что зря ?

>> Но тогда докажите.
WM_MOUSEMOVE

>> Где ловить будем
на области обрамляющей нужную


 
gsu ©   (2003-01-26 02:38) [10]

Уважаемый, опять вы куда то исчезли.
А, ведь и в прошлый раз мы так и не обсудили тему AnyFunc.
Ладно, у мя время дома не резиновое.
Можете послать свои замечания на мыло, если хотите.
А у мя к вам 3 вопрос: "почему у мя с - синего цвета, а у вас голубого ?"


 
SammIk ©   (2003-01-26 02:49) [11]


> Юрий Зотов ©

Говорит верно и про СВ_..
Ипро воробьев..
И вообще задолбали..
Тема уже исчерпала себя.


 
gsu ©   (2003-01-26 02:52) [12]

>> SammIk ©
>> Полныи придурок))на всю голову
У вас, кстати тоже синяя с, хоть я вас и не долбал


 
Ray Adams   (2003-01-26 03:43) [13]

Создать свой компонент наследованный от TImage
добавить в private
FOnMouseEnter: TNotifyEvent; //Make the Mouse Enter and Leave available
FOnMouseLeave: TNotifyEvent;
procedure CMMouseEnter(var Msg:TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Msg:TMessage); message CM_MOUSELEAVE;
и в published
property OnMouseEnter: TNotifyEvent read FOnMouseEnter
write FOnMouseEnter;
property OnMouseLeave: TNotifyEvent read FOnMouseLeave
write FOnMouseLeave;


 
gsu ©   (2003-01-26 11:47) [14]

И все таки я чувствую ся непонятым )-:|~


 
Юрий Зотов ©   (2003-01-26 12:25) [15]

> gsu © (26.01.03 02:16)
> на области обрамляющей нужную

Вот в этом-то все и дело. Таких областей может быть десяток. Или даже несколько десятков. Это форма и любой контрол, примыкающий к Image1, либо перекрывающий Image1, либо лежащий поверх Image1. И для КАЖДОГО будет нужен обработчик OnMouseMove (пусть даже один для всех, но все равно его надо будет назначить КАЖДОМУ). А завтра на форме что-то поменяется - и снова придется все проверять и переназначать.

Далее - поставьте Image1.Align = alClient. Теперь где ловить будем? Вероятно, придется вводить какой-то обработчик WM_NCxxx, поскольку больше ловить негде.

Видите, что получается? При любом, даже самом мелком изменении геометрии формы или ее контролов нам придется снова и снова все проверять, писать новый код, вводить новые или снимать старые обработчики - и пр. Имеем головную боль, высокую вероятность ошибки и т.д.

В то же время, написав свой компонент ОДИН раз (а такой простой компонент пишется за 5 минут) и ОДИН раз написав его обработчик, мы можем спокойно кроить форму как хотим и ни о чем не беспокоиться. Кроме того, получаем полезный компонент на будущее.

Разве это не лучше?

P.S.
1. Куда я исчез в 3-часу ночи? Думаю, спать пошел.
2. А что там было насчет AnyFunc? Напомните, pls.
3. Значок - просто я его покрасил. И уже очень давно. :о)


 
gsu ©   (2003-01-26 12:32) [16]

Это удобней, согласен с вами, но как это реализуется в самом компоненте ?
1. Ааа, вы еще и спите, а я думал у мастеров круглосуточная вахта.
2. Там на счет цикла и его параметров, но лучше потом, у мя дома инет заканчивается
3. (-:|~


 
Sha ©   (2003-01-26 12:52) [17]

Удобнее и надежнее, по-моему, так:
1. по onMouseMove взводим таймер на 0.5 сек и смотрим, где мышь.
2. по таймеру смотрим, где мышь.
Не забыть правильно включать/выключать таймер:
мышь на комроненте - таймер включен, нет - выключен.



 
Юрий Зотов ©   (2003-01-26 13:45) [18]

> Sha © (26.01.03 12:52)

1. Получаем лишний компонент - таймер.
2. Постоянная обработка OnTimer дает лишнюю загрузку CPU.
3. Получаем запаздывание в 0.5 секунды. Это довольно грубо. Если же интервал уменьшить, загрузка CPU станет еще больше.


> gsu © (26.01.03 12:32)
> но как это реализуется в самом компоненте?

Компонент уже практически написал Ray Adams (см. выше). Он дает СОБЫТИЯ входа мыши на себя и ухода с себя. Далее все как обычно - двойной щелчок в Инспекторе Объектов и пишем простейший код:

procedure TForm1.Image1MouseEnter(Sender: TObject);
begin
inherited;
Image2.Visible := True;
end;

procedure TForm1.Image1MouseLeave(Sender: TObject);
begin
inherited;
Image2.Visible := мышь_над_Image2
end;

И это все. Задача решена, о ней можно забыть и кроить форму как угодно. В палитре имеем полезный компонент на будущее.


 
Sha ©   (2003-01-26 13:59) [19]

2 Юрий Зотов © (26.01.03 13:45)

> Получаем лишний компонент - таймер.
Можно обойтись одним тймером на все приложение, если сделать все как надо.

> Постоянная обработка OnTimer дает лишнюю загрузку CPU.
0,01%

> Получаем запаздывание в 0.5 секунды. Это довольно грубо. Если же интервал уменьшить, загрузка CPU станет еще больше.
0.5 сек - оптимально и приятно для глаза. Никакой задержки не чувствуется.

> Компонент уже практически написал Ray Adams (см. выше).
Кто пробовал так делать, тот знает - быстрый уход мыши с компонента или уход с компонента, расположенного вплотную к краю формы, за границу окна не ловится.



 
Юрий Зотов ©   (2003-01-26 14:03) [20]

Sorry, маленькая неточность - inherited надо убрать.
То есть, все еще проще.


 
Юрий Зотов ©   (2003-01-26 14:12) [21]

> Sha © (26.01.03 13:59)

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

Например, я пробовал. И далеко не один раз (или даже не один десяток раз, не считал). Не помню, чтобы были проблемы.

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


 
Sha ©   (2003-01-26 14:18) [22]

2Юрий Зотов © (26.01.03 14:12)
Поясню: CM_MOUSELEAVE посылается компоненту при перемещении на другой компонент. А если не было перемещения на другой компонент, а было перемещение за границу формы, то ничего послано не будет.


 
Юрий Зотов ©   (2003-01-26 15:30) [23]

> Sha © (26.01.03 14:18)
> CM_MOUSELEAVE посылается компоненту при перемещении
> на другой компонент.

Или когда контрол под мышью стал равен nil. Это и есть уход мыши на другое приложение.

Не хотел ввязываться в спор, но, видимо, придется. Итак, вот выдержки из кода TApplication с моими комментариями.

procedure TApplication.HandleMessage;
// Вызывается в цикле выборки сообщений
var
Msg: TMsg;
begin
if not ProcessMessage(Msg) then Idle(Msg);
// Если сообщений в очереди нет, вызывается Idle
end;

procedure TApplication.Idle(const Msg: TMsg);
var
Control: TControl;
Done: Boolean;
begin
Control := DoMouseIdle; // Сразу вызывается DoMouseIdle
... // Далее нашей темы не касается
end;

function TApplication.DoMouseIdle: TControl;
// Это главное. Привожу полный текст.
var
CaptureControl: TControl;
P: TPoint;
begin
GetCursorPos(P); // Определяется контрол под мышью
Result := FindDragTarget(P, True);
// Из хелпа: If there is not control at the specified position,
// FindDragTarget returns nil. Вот оно - Result может быть nil
// (что означает уход мыши в другое приложение).

if (Result <> nil) and (csDesigning in Result.ComponentState) then
Result := nil; // Сброс для design-time
CaptureControl := GetCaptureControl; // Приемник сообщений мыши
if FMouseControl <> Result then
// Вот оно! Контрол под мышью сменился или стал равен nil (что
// означает уход мыши в другое приложение).

// Далее идут простые проверки и сама посылка сообщений.
begin
// Сначала проверяется контрол, с которого мышь уже ушла.
// *** Он получает сообщение даже если Result = nil
if ((FMouseControl <> nil) and (CaptureControl = nil)) or
((CaptureControl <> nil) and (FMouseControl = CaptureControl)) then
FMouseControl.Perform(CM_MOUSELEAVE, 0, 0);
FMouseControl := Result; // Запомнить новый контрол под мышью
// Теперь проверяется контрол, на который мышь пришла
if ((FMouseControl <> nil) and (CaptureControl = nil)) or
((CaptureControl <> nil) and (FMouseControl = CaptureControl)) then
FMouseControl.Perform(CM_MOUSEENTER, 0, 0);
end;
end;

Делаем вывод - сообщения CM_MOUSEENTER/LEAVE посылаются контролу:
- из общего цикла выборки сообщений (как и все остальные);
- во время простоя приложения (что естественно);
- если мышь не захвачена чем-то другим (что тоже естественно).

Как мы видели, сообщение CM_MOUSELEAVE посылается и при уходе мыши в другое приложение (см. комментарий, помеченный ***).


 
Sha ©   (2003-01-26 16:37) [24]

2 Юрий Зотов © (26.01.03 15:30)

Никакого спора нет. Есть интересное поведение компонентов, использующих CM_MOUSEENTER/LEAVE, описанное мною выше.

Ваши рассуждения верны только в том случае, если TApplication.DoMouseIdle вызывается когда мышь находится за пределами окна. А этого, по-видимому, не происходит.
Иначе откуда берется столь странное поведение?


 
Юрий Зотов ©   (2003-01-26 16:53) [25]

> Ваши рассуждения верны только в том случае, если
> TApplication.DoMouseIdle вызывается когда мышь находится за
> пределами окна. А этого, по-видимому, не происходит

Sorry, не понял. Это как же так?

Приложение получает свой квант времени. В приложении непрерывно крутится цикл выборки сообщений. Если сообщений в очереди нет, то в этом кванте будет вызван метод DoMouseIdle. Независимо от того, где находится мышь.

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


 
Sha ©   (2003-01-26 17:29) [26]

> Юрий Зотов © (26.01.03 16:53)
> Sorry, не понял. Это как же так?

У меня была своя кнопка с подсветкой в стиле IE. Она работала так, как я описывал выше (т.е. иногда при уходе с нее мыши на рабочий стол и, кажется, на меню подсветка не пропадала) до тех пор, пока я ее не переделал.

Мне приходит в голову только такой сценарий:
1. Приложение получает квант времени и выбирает все сообщения из очереди.
2. По Idle вызывается TApplication.DoMouseIdle, который определяет, что мышь находится все еще на нашем компоненте и ничего не делает.
3. Мы быстро перемещаем мыщь с нашего компонента (он находится у края формы) на рабочий стол.
4. Сообщение WM_MOUSEMOVE при этом нашему окну не посылается и кнопка продолжает светиться.
5. При возврате мыши в наше окно на другой компонент после WM_MOUSEMOVE мы получаем свое СM_MOUSELEAVE, и кнопка гаснет.


 
Sha ©   (2003-01-27 01:15) [27]

Предлагаю небольшую демку для желающих исследовать особенности СM_MOUSELEAVE:

unit LeaveTimerU;

interface

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

type
TForm1 = class(TForm)
Timer1: TTimer;
CheckBox1: TCheckBox;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
procedure CMMouseEnter(var Msg:TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Msg:TMessage); message CM_MOUSELEAVE;
procedure OnIdle(Sender: TObject; var Done: Boolean);
public
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.CMMouseEnter(var Msg:TMessage);
begin;
Caption:="In";
end;

procedure TForm1.CMMouseLeave(var Msg:TMessage);
begin;
Caption:="Out";
end;

procedure TForm1.OnIdle(Sender: TObject; var Done: Boolean);
begin;
if CheckBox1.Checked and not Timer1.Enabled then Timer1.Enabled:=true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin;
Application.OnIdle:=OnIdle;
Timer1.Enabled:=false;
Timer1.Interval:=500;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
p: TPoint;
begin;
GetCursorPos(p);
if (FindDragTarget(p,true)=nil) and Timer1.Enabled then Timer1.Enabled:=false;
end;

end.

object Form1: TForm1
Left = 297
Top = 178
Width = 163
Height = 83
Caption = "Form1"
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = "MS Sans Serif"
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object CheckBox1: TCheckBox
Left = 8
Top = 16
Width = 73
Height = 17
Caption = "Use Timer"
TabOrder = 0
end
object Timer1: TTimer
OnTimer = Timer1Timer
Left = 104
Top = 8
end
end


 
xn0bys ©   (2003-01-27 16:24) [28]

Если не хочешь парится, то вот:
http://delphi.mastak.ru/cgi-bin/download.pl?get=1043645299&n=0


 
Sha ©   (2003-01-27 20:38) [29]

2 xn0bys © (27.01.03 16:24)
За ссылку спасибо, посмотрю на досуге.

Я вообще-то не парюсь. Свои проблемы я решил.

Приведенный пример показывает, что одной обработки сообщений СM_MOUSEENTER/СM_MOUSELEAVE недостачно для правильной работы приложения. Стоит добавить таймер - и все работает "как часы".
Чекбокс в примере управляет работой таймера (Enable/Disable).


 
Sha ©   (2003-01-28 12:37) [30]

Пригляделся к реализации своего старого компонента, улучшающего рассылку CM_MOUSELEAVE компонентам приложения, и увидел, что там все сделано красивее.

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

Чекбокс управляет позволяет/запрещает работу таймера. Видно, что без таймера при выходе за границу форм приложения CM_MOUSELEAVE посылается не всегда. Как бы это объяснить? :)

unit Unit1;

interface

uses
Windows, Messages, Classes, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
CheckBox1: TCheckBox;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure OnIdle(Sender: TObject; var Done: Boolean);
procedure Timer1Timer(Sender: TObject);
procedure CMMouseEnter(var Msg:TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Msg:TMessage); message CM_MOUSELEAVE;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin;
Timer1.Interval:=500;
Timer1.OnTimer:=Self.Timer1Timer;
Application.OnIdle:=Self.OnIdle;
end;

procedure TForm1.OnIdle(Sender: TObject; var Done: Boolean);
var
p: TPoint;
begin;
GetCursorPos(p);
Timer1.Enabled:=CheckBox1.Checked and (FindDragTarget(p,true)<>nil);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin;
Timer1.Enabled:=false;
end;

procedure TForm1.CMMouseEnter(var Msg:TMessage);
begin;
Self.Caption:="Enter";
end;

procedure TForm1.CMMouseLeave(var Msg:TMessage);
begin;
Self.Caption:="Leave";
end;

end.


 
Юрий Зотов ©   (2003-01-29 14:48) [31]

Ну, если приведенные куски кода и их разбор Вас не убеждают, то могу сказать вот что: ведь речь шла о покидании мышью КОНТРОЛА на форме, а не САМОЙ формы, как в Вашем примере.

Есть некоторая разница. Состоит она вот в чем: при уходе мыши с котрола за пределы формы она неизбежно пересечет неклиентскую область формы. При этом в очередь сообщений, как минимум, поступят WM_NCHITTEST и WM_SETCURSOR. А после их обработки, как мы уже видели, пройдет CM_MOUSELEAVE.

Поэтому Ваша модель событий:

> 3. Мы быстро перемещаем мыщь с нашего компонента (он
> находится у края формы) на рабочий стол.
> 4. Сообщение WM_MOUSEMOVE при этом нашему окну не посылается
> и кнопка продолжает светиться.

относится, извините, к области ненаучной фантастики. Придет ли в очередь сообщений WM_MOUSEMOVE или что угодно другое, придет ли оно этому окну или какому угодно другому - все равно сообщения будут выбраны и обработаны - после чего неизбежно пойдет CM_MOUSELEAVE. И, как я уже говорил, при пересечении мышью неклиентской области, как минимум, в очередь поступят WM_NCHITTEST и WM_SETCURSOR.

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

Ниже привожу другой пример, с нормально написанным компонентом. Компилировал в D5, тестировал под W2K, мышь PS/2, Genius NetScroll+ Series Mouse (хотя вряд ли это имеет какое-то значение).

Так вот - как я ни старался РЕЗКО и БЫСТРО увести мышь с Image за пределы формы, ее заголовок неизбежно менялся с "Enter" на "Leave". Что говорит об абсолютно корректной работе и компонента, и всей программы.

Я подводил мышь к самому краешку Image, а потом резко дергал ее. Я стучал по ней сбоку так, что она отлетала сантиметров на 30. Я позвал соседей по комнате. Мы упражнялись несколько минут и НИ У КОГО НЕ ПОЛУЧИЛОСЬ ХОТЬ РАЗ УВЕСТИ МЫШЬ ТАК, ЧТОБЫ НЕ ПРОШЛО СООБЩЕНИЕ CM_MOUSELEAVE. Программа срабатывала железно.

Если у Вас это не так... ну что ж, как говорится, обновите драйвер коврика. Это, конечно, шутка - а вот об обновлении драйвера мыши, вполне возможно, стоит подумать. Какой-то он сильно дискретный получается...

Вот такие пироги. А код, как видите, самый обычный, ничего хитрого:

type
TMyImage = class(TImage)
private
FOnMouseEnter: TNotifyEvent;
FOnMouseLeave: TNotifyEvent;
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
protected
procedure DoMouseEnter;
procedure DoMouseLeave;
published
property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
end;

TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
procedure ImageMouseEnter(Sender: TObject);
procedure ImageMouseLeave(Sender: TObject);
end;

{ TMyImage }

procedure TMyImage.CMMouseEnter(var Message: TMessage);
begin
inherited;
DoMouseEnter
end;

procedure TMyImage.CMMouseLeave(var Message: TMessage);
begin
inherited;
DoMouseLeave
end;

procedure TMyImage.DoMouseEnter;
begin
if Assigned(FOnMouseEnter) then FOnMouseEnter(Self)
end;

procedure TMyImage.DoMouseLeave;
begin
if Assigned(FOnMouseLeave) then FOnMouseLeave(Self)
end;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
with TMyImage.Create(Self) do
begin
Parent := Self;
OnMouseEnter := ImageMouseEnter;
OnMouseLeave := ImageMouseLeave;
Stretch := True;
Align := alClient;
Picture.LoadFromFile("что-нибудь.bmp") // Укажите свой файл
end
end;

procedure TForm1.ImageMouseEnter(Sender: TObject);
begin
Caption := "Enter"
end;

procedure TForm1.ImageMouseLeave(Sender: TObject);
begin
Caption := "Leave"
end;


 
Sha ©   (2003-01-29 15:51) [32]

2 Юрий Зотов © (29.01.03 14:48)
> ведь речь шла о покидании мышью КОНТРОЛА на форме, а не САМОЙ формы, как в Вашем примере.

maxim2 © (25.01.03 23:09) спросил:
... у меня на форме два Image как бы сделать так чтобы при заходы мыши на image1, image2 показывался, а при выходе с image1 скрывался image2.
Здесь ничего не сказано о невозможности выхода мыши за форму.

> ...при уходе мыши с котрола за пределы формы она неизбежно пересечет неклиентскую область формы. При этом в очередь сообщений, как минимум, поступят WM_NCHITTEST и WM_SETCURSOR. А после их обработки, как мы уже видели, пройдет CM_MOUSELEAVE.

Вы это проверяли? Если медленно тащить мышь, то так все и будет.
Если быстро, то не будет WM_NCHITTEST и WM_SETCURSOR и, следовательно, CM_MOUSELEAVE.

> Поэтому Ваша модель событий ... относится, извините, к области ненаучной фантастики.

Никакой фантастики. Объективная реальность. Проверено на нескольких компьютерах в офисе и дома (от AMD-500 Com Win98 до Р4-1500 PS2 Win98 SE).

> Придет ли в очередь сообщений WM_MOUSEMOVE или что угодно
> другое, придет ли оно этому окну или какому угодно другому -
> все равно сообщения будут выбраны и обработаны - после чего
> неизбежно пойдет CM_MOUSELEAVE.

А если ничего не придет, то неизбежно не пойдет.

> Вопрос-то ведь был совсем в другом - а зачем вообще нужны еще какие-то таймеры?

Именно для того, чтобы что-то приходило.

> Ниже привожу другой пример ... Так вот - как я ни старался
> РЕЗКО и БЫСТРО увести мышь с Image за пределы формы, ее
> заголовок неизбежно менялся с "Enter" на "Leave".

Мы его тоже проверили на нескольких компьютерах. У нас результат прямо противоположный.

> Мы упражнялись несколько минут и НИ У КОГО НЕ ПОЛУЧИЛОСЬ ХОТЬ
> РАЗ УВЕСТИ МЫШЬ ТАК, ЧТОБЫ НЕ ПРОШЛО СООБЩЕНИЕ CM_MOUSELEAVE.
> Программа срабатывала железно.

А нам даже этого не пришлось делать. Даже у самого ленивого из нас программа корректно работала лишь в одном случае из десяти. Программа срабатывала железно неправильно. Может из-за Win98. Может кто-нибудь еще проверит?

> Если у Вас это не так... ну что ж, как говорится, обновите
> драйвер коврика. Это, конечно, шутка - а вот об обновлении
> драйвера мыши, вполне возможно, стоит подумать. Какой-то он
> сильно дискретный получается...

Я-то обновлю. Но вряд ли это смогут сделать сразу все пользователи.

> Вот такие пироги. А код, как видите, самый обычный, ничего хитрого...

Ну так и у меня такой же с одним маленьким добавлением, о котором я и хотел сообщить почтенной публике. :)


 
Юрий Зотов ©   (2003-01-29 17:49) [33]

Во-первых, из контеста Вы должны были понять, что когда я говорил о покидании контрола, то имелось в виду - с контрола ЗА форму. Несерьезно.

Во-вторых, как это понять?
> Вы это проверяли?
Вы читали мой постинг? Или пишете ответы по ходу чтения, а не прочитав до конца?

Ладно, по сути.

У Вас на ВСЕХ компах стоит 9х? Это, пожалуй, единственное, что может меня убедить, что Вы не сказки рассказываете. Потому что у нас на всех компах (2k и XP) оба примера - и Ваш, и мой, работают железно. К сожалению, сам проверить под 9х сейчас не могу, негде.


 
Sha ©   (2003-01-29 18:27) [34]

2 Юрий Зотов © (29.01.03 17:49)

> Во-первых, из контеста Вы должны были понять, что когда я
> говорил о покидании контрола, то имелось в виду - с контрола ЗА форму. Несерьезно.

Не понял. По-моему, из контекста моих постов вы должы были понять, о чем я все это время говорил и продолжаю говорить.
Похоже, мы друг друга в чем-то не понимаем. Понять бы в чем.

> Во-вторых, как это понять?
>> Вы это проверяли?
> Вы читали мой постинг? Или пишете ответы по ходу чтения, а не прочитав до конца?

Понять так, как написано. Проверить - означает проверить на разных компьютерах под разными Windows. Отвечал не только дочитав ваш постинг до конца, но и ПРОВЕРИВ все, что вы написали. Кстати, если вы пишете ответы не по ходу чтения, а прочитав до конца, до должны были понять это.

> Ладно, по сути.
> У Вас на ВСЕХ компах стоит 9х? Это, пожалуй, единственное, что
> может меня убедить, что Вы не сказки рассказываете. Потому что у
> нас на всех компах (2k и XP) оба примера - и Ваш, и мой,
> работают железно. К сожалению, сам проверить под 9х сейчас не могу, негде.

Проверили также на P4-1500 PS WindowsME & WindowsXP. С тем же успехом.
Задачи убедить вас перед собой не ставил - просто разобраться хочу.
Так хочется верить, что вы не сказки рассказываете. Если бы так было везде и всегда, жизнь была бы куда проще.

2 All

Может ли кто-нибудь еще поучаствовать в тестировании обоих вариантов программы? Давайте наберем хоть какую-нибудь статистику.


 
Sha ©   (2003-01-30 20:40) [35]

2 Юрий Зотов ©
Похоже, тема никому кроме нас неинтересна.
Что вы думаете по поводу обмена экзешниками?



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

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

Наверх




Память: 0.6 MB
Время: 0.018 c
9-28570
Dmitriy Polskoy
2002-08-30 17:41
2003.02.10
DXInput и мышь


14-29039
msoftware
2003-01-23 09:15
2003.02.10
Помогите найти


1-28755
race1
2003-02-01 11:28
2003.02.10
vcl50


7-29138
sw
2002-12-03 04:02
2003.02.10
Есть ли ф-я, к-рая преобразует код символа в скан-код клавиши?


7-29139
Чегермек
2002-11-30 20:55
2003.02.10
Время (высокоточное)