![]() |
Mausereignisse in meiner Komponente
Hallöchen nochmal!
Ich habe mal mit meinem Buch nocheine Kompo gebastelt: Eine Kompoente aus einem Bild und einem Bevel. Das Bevel ist unsichtbar, bis die Maus über das Bild fährt, wenn die Maus das Bild verlässt, verschwindet auch das Bevel wieder, beim Draufklicken soll es (MouseDown) bsLowered und (MouseUp) bsRaised annehmen (bsRaised ist der Startzustand, beim sichtbar werden). Die leichteste Methode wäre es natürlich, diese Methoden von dem Image abzuleiten, das ich mit benutze, ich weiß aber nicht wie! Eine MouseEnter und Leave Methode von einem alten Thread von mir abgeguckt (da gings um 'ne ScrollBox). Bis jetzt mach' ich's so:
Delphi-Quellcode:
Das MouseEnter und Leave funktioniert, aber das MouseDown und up nicht.
type
TRahmenImage = class(TCustomControl) private FOnMouseDown: TNotifyEvent; FOnMouseUp: TNotifyEvent; FImage: TImage; FBevel: TBevel; procedure WMMButtonDown(var msg: TMessage); message WM_MBUTTONDOWN; procedure WMMButtonUp(var msg: TMessage); message WM_MBUTTONUP; procedure CMMouseEnter(var msg: TMessage); message CM_MOUSEENTER; procedure CMMouseLeave(var msg: TMessage); message CM_MOUSELEAVE; property OnMouseDown: TNotifyEvent read FOnMouseDown write FOnMouseDown; property OnMouseUp: TNotifyEvent read FOnMouseUp write FOnMouseUp; property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter; property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave; { Published-Deklarationen } end; { ... } procedure TRahmenImage.CMMouseEnter(var msg: TMessage); begin if Assigned(FOnMouseEnter) then FOnMouseEnter(Self); FBevel.Style := bsRaised; FBevel.Show; end; procedure TRahmenImage.CMMouseLeave(var msg: TMessage); begin if Assigned(FOnMouseLeave) then FOnMouseLeave(Self); FBevel.Hide; end; procedure TRahmenImage.WMMButtonDown(var msg: TMessage); begin if Assigned(FOnMouseDown) then FOnMouseDown(Self); if FBevel.Visible = False then FBevel.Show; FBevel.Style := bsLowered; end; procedure TRahmenImage.WMMButtonUp(var msg: TMessage); begin if Assigned(FOnMouseUp) then FOnMouseUp(Self); if FBevel.Visible = False then FBevel.Show; FBevel.Style := bsRaised; end; Liegt es vielleicht daran, dass ich WM-Messages nehme, bei den anderen 2 wurde ja CM... verwendet?! Danke schonmal! |
Re: Mausereignisse in meiner Komponente
Eine Frage warum Zeichnest du den Rahmen nicht mittels DrawEdge?
Die Ereignisse MouseDown und MouseUp sollte man lieber über die von TWinControl bereitgestellten virtuellen Methoden abfange. Das sie nciht ankommen liegt an dem Bevel der darüber liegt. |
Re: Mausereignisse in meiner Komponente
Zitat:
Zitat:
|
Re: Mausereignisse in meiner Komponente
Zitat:
Zum DrawEdge, dass etwas einfache Ausschaut: Du Zeichnest sicherlich in der Paint-Methode ein Bild
Delphi-Quellcode:
Wenn du das so machst sollte die anderen Mouse Ereignisse dann auch eintreffen.
type
TRahmenImage = class ... private lHover : Boolean; procedure TRahmenImage.Paint; var rc : TRect; begin // Bild zeichnen rc := ClientRect; if lHover then DrawEdge(Canvas.Handle, rc, BDR_RAISEDINNER {bzw. OUTER}, BF_RECT); end; procedure TRahmenImage.CMMouseEnter(var msg: TMessage); begin if Assigned(FOnMouseEnter) then FOnMouseEnter(Self); lHover := true; Paint; end; procedure TRahmenImage.CMMouseLeave(var msg: TMessage); begin if Assigned(FOnMouseLeave) then FOnMouseLeave(Self); lHover := false; Paint; end; |
Re: Mausereignisse in meiner Komponente
Gut, aber ich bin jetzt schon soweit, das ich das erstmal so machen will.
Ich bräuchte doch wahrscheinlich nur die WM_MButtonDown in der "CM-Version" oder? Wie lautet die? |
Re: Mausereignisse in meiner Komponente
Warum?
Was soll das werden? |
Re: Mausereignisse in meiner Komponente
Naja, mit der CMMouseEnter und leave klapp'ts ja auch. Da könnte ich nämlich auch fragen, warum denn CMMouseEnter und nicht WMMouseleave? Aber das ist ja jetzt nicht das Problem...
Ich würde einfach nur gern das Ereignis in meiner Kompo haben, irgendwie muss es ja gehen. |
Re: Mausereignisse in meiner Komponente
Weil CM_MOUSEENTER von der Delphi VCL erzeugt wird.
Weiterhin liegt das an der Natur der Nachrichten. Setz doch das Ereignis OnMouseDown des Bevels. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz