2013-04-10 3 views
2

Я поставил изображения (TImage) в качестве кнопок в моей программе. Я хочу, чтобы добавить некоторые дополнительные эффекты, поэтому в OnMouseMove (каждый раз, когда пользователь перемещает его курсор на изображение) изображение заменяется другим изображением, чтобы дать дополнительный эффект:Как определить, когда мышь больше не находится в элементе управления?

procedure TForm1.Image4MouseMove(Sender: TObject; Shift: TShiftState; X, 
    Y: Integer); 
var 
    Path, Destination: String; 
begin 
    Path := ParamStr(0); 
    Destination := Extractfilepath(Path) + 'Images\Image2.bmp'; 
    Image4.Picture.LoadFromFile(Destination); 
end; 

Но всякий раз, когда пользователь перемещает его мышь (когда он оставляет изображение), он не отменяет сделанные вещи (измените изображение на Image1). Как я это сделаю? Не существует события OnMouseLeave. Я использую delphi 7.

+1

Вы знаете, что «пункт назначения» является антонимом «источника»? –

ответ

8

Во-первых, код в вашем вопросе ужасен! Он будет (повторно) загружать растровое изображение каждый раз, когда курсор перемещает пиксель внутри элемента управления изображением! Это пустая трата времени процессора!

Во всяком случае, в современных версиях Delphi вы просто используете события OnMouseEnter и OnMouseLeave. Я не думаю, что они существуют в Delphi 7, так что вы должны сделать что-то вроде этого:

TImage = class(ExtCtrls.TImage) 
protected 
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; 
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; 
end; 

где

{ TImage } 

procedure TImage.CMMouseEnter(var Message: TMessage); 
begin 
    // Do something 
end; 

procedure TImage.CMMouseLeave(var Message: TMessage); 
begin 
    // Do something else 
end; 

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

+0

Если вы не хотите выводить новый класс, вы можете альтернативно подклассифицировать свойство 'TImage.WindowProc', чтобы поймать одни и те же сообщения. –

0

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

Но загрузка изображений в обработчик перемещения мыши ужасна, так как Andreas already explained.

Могу ли я представить альтернативу? Создайте два элемента управления изображением и поместите их в одно и то же место. Затем добавьте следующие обработчики:

procedure TForm1.Image4AMouseMove(Sender: TObject; Shift: TShiftState; X, 
    Y: Integer); 
begin 
    Image4B.BringToFront; 
    Image4B.Tag := 1; 
end; 

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, 
    Y: Integer); 
begin 
    if Image4B.Tag = 1 then 
    begin 
    Image4B.Tag := 0; 
    Image4A.BringToFront; 
    end; 
end; 
+1

Что делать, если нет свободного пространства (или очень узких областей) вокруг изображений? Тем не менее, меня даже немного беспокоит моя собственная реализация, потому что, если изображение выровнено по какой-либо границе формы, курсор может оставить всю форму без сброса изображения. –

+0

@AndreasRejbrand, но какие будут альтернативы, кроме InstallLLMouseHook – bummi

+0

@Andreas 'OnMouseLeave' будет запущен, даже если элемент управления будет выровнен по границе формы или другому элементу управления. – NGLN

Смежные вопросы