Форум: "Основная";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];
ВнизПокидание мыши с компонента Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.58 MB
Время: 0.011 c