Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Grafika w Image1 z Delphi uzależnione od ruchu myszki

malum 27 Lut 2009 10:45 2284 6
  • #1 27 Lut 2009 10:45
    malum
    Poziom 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?

    0 6
  • #2 27 Lut 2009 11:47
    ekomont
    Poziom 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

    0
  • #3 27 Lut 2009 11:53
    malum
    Poziom 23  

    ekomont napisał:


    Jeszcze inny sposób to ONMOUSE LEAVE


    Możesz powiedzieć coś więcej o tej metodzie?

    0
  • #4 01 Mar 2009 15:55
    kamm24
    Poziom 10  

    Timage nie ma opcji onmouse leave

    0
  • #5 01 Mar 2009 17:31
    Wojtek75
    Poziom 23  

    Możesz wykorzystać komunikaty cm_MouseEnter i cm_MouseLeave generowane przez Delphi do sprawdzenia pozycji myszki.

    I przerobić sobie np. komponent TImage:

    Code:
    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.

    0
  • #6 01 Mar 2009 18:09
    malum
    Poziom 23  

    Wojtek75 napisał:
    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 :-(

    0
  • #7 01 Mar 2009 19:23
    Wojtek75
    Poziom 23  

    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:

    Code:
    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***

    0