Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Grafika w Image1 z Delphi uzależnione od ruchu myszki

malum 27 Feb 2009 10:45 2512 6
  • #1
    malum
    Level 23  
    Witam!
    Mam pewien mały problem.
    Jak uzyskać efekt zbliżony do aktywnego przycisku na stronach internetowych, tzn. gdy najedzie się na grafikę myszką to zmienia się ona na inną (to nie problem - funkcja OnMouseMove), ale po zjechaniu myszką z grafiki powinna ona wrócić do grafiki wyjściowej, a to już jest problem.
    Skorzystałem w pewnego triku umieszczając Image1 na Panel1, który jest nieco szerszy. W moim przypadku jednak to się nie sprawdza z dwóch powodów:
    1. Ustawiłem panel szerszy o 10 pikseli w stosunku do wielkości grafiki, ale mimo to przy dość szybkim ruchu muszki program pomija ustawienia Panel1
    2. Przy 10pikselach różnicy obiekty dość sporo się od siebie odsunęły, na co nie mogę sobie pozwolić.
    Czy jest inna metoda na obejście tego problemu?
  • #2
    ekomont
    Level 16  
    rozwiazania są 2...Pierwszy na formie dajesz takie samo zdarzenie onmousemove...

    Drugie to obsługa myszy po winapi i kontrolowanie położenia bezwzględnego wraz z monitorowaniem położenia tej bitmapy...Tylko potrzebny wtedy timer albo wątek obsługi myszy...

    Jeszcze inny sposób to ONMOUSE LEAVE
  • #3
    malum
    Level 23  
    ekomont wrote:


    Jeszcze inny sposób to ONMOUSE LEAVE


    Możesz powiedzieć coś więcej o tej metodzie?
  • #4
    kamm24
    Level 10  
    Timage nie ma opcji onmouse leave
  • #5
    Wojtek75
    Level 24  
    Możesz wykorzystać komunikaty cm_MouseEnter i cm_MouseLeave generowane przez Delphi do sprawdzenia pozycji myszki.

    I przerobić sobie np. komponent TImage:

    unit MyImage1;
    
    interface
    
    uses
      SysUtils, Classes, Controls, ExtCtrls, Messages;
    
    type
      TImage1 = class(TImage)
      private
        { Private declarations }
      protected
        { Protected declarations }
        FMouseOver, FMouseOut : TNotifyEvent;
        procedure CMMouseEnter(var Message:TMessage); message cm_MouseEnter;
        procedure CMMouseLeave(var Message:TMessage); message cm_MouseLeave;
      public
        { Public declarations }
      published
        { Published declarations }
        property OnMouseOver: TNotifyEvent read FMouseOver write FMouseOver;
        property OnMouseOut: TNotifyEvent read FMouseOut write FMouseOut;
      end;
    
    procedure Register;
    
    implementation
    
    procedure TImage1.CMMouseEnter(var Message:TMessage);
    begin
      if Assigned(FMouseOver) then OnMouseOver(Self);
      Message.Result := 1;
    end;
    
    procedure TImage1.CMMouseLeave(var Message:TMessage);
    begin
      if Assigned(FMouseOut) then OnMouseOut(Self);
      Message.Result := 1;
    end;
    
    procedure Register;
    begin
      RegisterComponents('ImageMod', [TImage1]);
    end;
    
    end.


    W zmodyfikowanym komponencie masz do dyspozycji dwa nowe zdarzenia:

    Grafika w Image1 z Delphi uzależnione od ruchu myszki

    I teraz pokombinuj jak je wykorzystać ;)
    pozdr.
  • #6
    malum
    Level 23  
    Wojtek75 wrote:
    Możesz wykorzystać komunikaty cm_MouseEnter i cm_MouseLeave generowane przez Delphi do sprawdzenia pozycji myszki.

    I przerobić sobie np. komponent TImage:


    Możesz mnie jeszcze uświadomić jak to przerobić, tzn. gdzie wkleić ten kod, bo nigdy jeszcze nie robiłem czegoś takiego :-(
  • #7
    Wojtek75
    Level 24  
    ok.

    Na przykładzie Delphi7 prof bo na to środowisko mam licencje.

    Odpalasz Delphi z menu 'Component' wybierasz opcję 'New Component...' pojawi ci się okno jak poniżej:

    Grafika w Image1 z Delphi uzależnione od ruchu myszki

    w opcji 'Ancestor Type:' wybierasz to, co widać na obrazku 'Class Name:' również z takim wpisem jak na obrazku pozostałe pola możesz pozostawić z domyślnymi wpisami. Klikasz OK. Otwiera ci się okno w które wklejasz cały podany wyżej kod podmieniając ten który już się tam znajduje.
    Z menu 'File' wybierasz 'Save Ass...' nadaj plikowi jakąś nazwę np 'MyImage1.pas' zapisz go do domyślnego katalogu który sugeruje Delphi.

    Następnie z menu 'Component wybierasz opcję 'Install Component...' pojawia ci się okienko jak poniżej:

    Grafika w Image1 z Delphi uzależnione od ruchu myszki

    w polu 'Unit file name:' powinieneś mieć ścieżkę do pliku który przed chwilą zapisałeś, jeżeli pole jest puste klikasz 'Browse' i odszukujesz zapisany przed chwilą plik. klikasz ok.

    Pojawia ci się okienko jak poniżej:

    Grafika w Image1 z Delphi uzależnione od ruchu myszki

    Zaznaczasz plik, który znajduje się w 'Contains' i klikasz na 'Compile' a następnie na 'Install' po tym powinien się pojawić komunikat informujący o tym, że komponent został zainstalowany, klikasz ok i gotowe.

    I jeszcze jedno ten fragment kodu:

    procedure Register; 
    begin 
      RegisterComponents('ImageMod', [TImage1]); 
    end;


    Ustala nazwę zakładki w palecie komponentów, na której pojawi ci się instalowany komponent, chodzi o 'ImageMod' możesz ją zmienić na taką, która odpowiada tobie.



    Edit*** poprawiłem obrazek***