Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Sounds bei Maus-Hover (https://www.delphipraxis.net/1312-sounds-bei-maus-hover.html)

NiLS-Da-BuBi 13. Nov 2002 13:07


Sounds bei Maus-Hover
 
Ich habe eine ToolBar ... so nun möchte ich jedesmal wenn der Mauszeiger über einer Schaltfläche ist eine Wave Datei abegespielt haben... nun ich finde aber keine Ereignisshandlung die meinen Bedürfnissen entspricht... wenn ich meinen Code in OnMouseMove schreibe hört sich das an wie ein Geigerzähler da die Datei bei jeder kleinen Bewegung erneut abgespielt wird... der Sound soll aber nur einmal abgespielt werden - bis er die nächste schaltfläche überfliegt... irgendeine Idee dazu? Das ist mein Code für die Ereignisshandlung:

PlaySound(PChar(ExtractFilePath(ParamStr(0))+'\aud io\move.wav'), 0, SND_FILENAME + SND_ASYNC);

Villeicht ist mein Ansatz mit PlaySound ja falsch.

d3g 13. Nov 2002 13:14

Hi Nils,

was ist mit den Events OnMouseEnter / OnMouseLeave? Das sollte bringen, was du brauchst und müsste in D4C/S schon vorhanden sein (wenn nicht, musst du eine Komponente als Nachfolger von TButton definieren, die TButton.WndProc überschreibt, und dann diese Komponente benutzen). In OnMouseEnter könntest du PlaySound so wie du es jetzt machst ausführen und in OnMouseLeave PlaySound(nil, 0, SND_PURGE) aufrufen, um den Sound zu killen, damit es keine Überlappungen der Sounds gibt.

MfG,
d3g

braingrenade 13. Nov 2002 16:27

Moin Nils ,

du kannst ja auch einfach ne bool-Variable auf true setzen wenn die maus drüber ist :

if mausdrueber = true then playsound ;

Viel Spaß ,

braingrenade

NiLS-Da-BuBi 14. Nov 2002 22:21

Zitat:

Zitat von d3g
was ist mit den Events OnMouseEnter / OnMouseLeave? Das sollte bringen, was du brauchst und müsste in D4C/S schon vorhanden sein (wenn nicht, musst du eine Komponente als Nachfolger von TButton definieren, die TButton.WndProc überschreibt, und dann diese Komponente benutzen). In OnMouseEnter könntest du PlaySound so wie du es jetzt machst ausführen und in OnMouseLeave PlaySound(nil, 0, SND_PURGE) aufrufen, um den Sound zu killen, damit es keine Überlappungen der Sounds gibt.

MfG,
d3g

Danke für die Hilfe... ich benutze inzwischen Delphi 6... Aber zurück zum Problem... ich versteh nix :) - Also ich verstehe ja die Idee die dahinter steckt - nur in der Umsetzung harpert es, ausserdem habe ich mal die OnEnter Ereignisshandlung eines TButtons probiert - die wird nur dann aktiv - wenn man klickt... was ja eigntlich nicht sein sollte, oder? Hmm...

Luckie 14. Nov 2002 22:34

Einen Hover-Effekt bekommst du mit TTRACKMOUSEEVENT hin: TrackmouseEvent Function. Ist aber nicht einfach!

Christian Seehase 14. Nov 2002 23:00

Moin Nils,

OnEnter/OnExit werden ausgelöst sobald ein Control (Button, Enter, usw.) den Tastaturfokus erhalten.
Das geht nicht nur mit anklicken, sondern, z.B., auch per Tab Taste.

Mit dem von d3g vorgeschlagenen OnMouseEnter/Leave ginge das eventuell so:

Code:
[b]type[/b]
  TForm1 = [b]class[/b](TForm)
    Button1: TButton;
    Edit1: TEdit;
    [b]procedure[/b] Edit1Enter(Sender: TObject);
  [b]private[/b]
    [color=#000080]{ Private-Deklarationen }[/color]
    [b]procedure[/b] CMMouseEnter([b]var[/b] Message: TMessage); message CM_MOUSEENTER;
    [b]procedure[/b] CMMouseLeave([b]var[/b] Message: TMessage); message CM_MOUSELEAVE;
  [b]public[/b]
    [color=#000080]{ Public-Deklarationen }[/color]
  [b]end[/b];

[b]var[/b]
  Form1: TForm1;

[b]implementation[/b]

[color=#000080]{$R *.DFM}[/color]

[b]procedure[/b] TForm1.CMMouseEnter([b]var[/b] Message: TMessage);

[b]var[/b]
  ptWork : TPoint;

[b]begin[/b]
  GetCursorPos(ptWork);
  [b]if[/b] WindowFromPoint(ptWork) = Button1.Handle [b]then[/b]
  [b]begin[/b]
    Edit1.Text := 'Hab ihn';
  [b]end[/b];
[b]end[/b];

[b]procedure[/b] TForm1.CMMouseLeave([b]var[/b] Message: TMessage);

[b]var[/b]
  ptWork : TPoint;

[b]begin[/b]
  GetCursorPos(ptWork);
  [b]if[/b] WindowFromPoint(ptWork) <> Button1.Handle [b]then[/b]
  [b]begin[/b]
    Edit1.Text := 'Weg isser';
  [b]end[/b];
[b]end[/b];

NiLS-Da-BuBi 15. Nov 2002 00:02

Aaah jetzt ja... Danke! Jetzt klappt es... hmmm da kommt aber ne menge auf mich zu - da muss ich ja jede Schaltfläche die im grunde "betont" sein soll dort eintragen... - hmmm naja jedenfalls ein wenig schlauer. Danke.

d3g 15. Nov 2002 13:11

Hi Nils,

du kannst auch im Objektinspektor für alle Buttons die gleiche Prozedur einstellen. Dann kann man das ganze auch schön automataisieren.

Nehmen wir an, dass du ein globales eindimensionales Array sounds[] vom Typ PChar hast, in dem alle Dateinamen zu den Sounds gespeichert sind, dann trägst du an jedem Button in der Eigenschaft Tag die Nummer des jeweiligen Sounds ein, unter der er im Array gespeichert is (sieh zu, dass du das Array mit 1 beginnst, 0 ist nämlich die Standardeinstellung für Tag). Dann kannst du folgendes veranstalten:

Code:
type
  TMyForm = class(TForm)
  private
    procedure ButtonSoundOn(Sender: TObject);
    procedure ButtonSoundOff(Sender: TObject);
  end;

procedure TMyForm.ButtonSoundOn(Sender: TObject);
begin
  PlaySound(sounds[TButton(Sender).Tag], 0, SND_FILENAME or SND_ASYNC);
end;

procedure TMyForm.ButtonSoundOff(Sender: TObject);
begin
  PlaySound(nil, 0, SND_PURGE);
end;
MfG,
d3g


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz