AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mausereignisse in meiner Komponente

Ein Thema von F.W. · begonnen am 23. Mär 2004 · letzter Beitrag vom 25. Mär 2004
Antwort Antwort
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#1

Mausereignisse in meiner Komponente

  Alt 23. Mär 2004, 20:58
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:
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;
Das MouseEnter und Leave funktioniert, aber das MouseDown und up nicht.
Liegt es vielleicht daran, dass ich WM-Messages nehme, bei den anderen 2 wurde ja CM... verwendet?!

Danke schonmal!
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#2

Re: Mausereignisse in meiner Komponente

  Alt 23. Mär 2004, 21:09
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.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#3

Re: Mausereignisse in meiner Komponente

  Alt 23. Mär 2004, 21:55
Zitat von neolithos:
Eine Frage warum Zeichnest du den Rahmen nicht mittels DrawEdge?
> Weil ich davon noch nichts gehört habe und weil mir die Methode besser gefällt (mag jetzt komisch klingen, aber wegen der Komponentenprogrammiererei ist das denke ich gut so)

Zitat von neolithos:
Das sie nciht ankommen liegt an dem Bevel der darüber liegt
> ? ? Wie meinst du das denn? Die Ereignisse gelten doch für die neue (also ganze) Komponente, oder? Hääää??
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#4

Re: Mausereignisse in meiner Komponente

  Alt 23. Mär 2004, 22:23
Zitat von F.W.:
> ? ? Wie meinst du das denn? Die Ereignisse gelten doch für die neue (also ganze) Komponente, oder? Hääää??
Du hast aber diesen Bevel als Child zu von dem neuen Control erzeugt.

Zum DrawEdge, dass etwas einfache Ausschaut:

Du Zeichnest sicherlich in der Paint-Methode ein Bild

Delphi-Quellcode:
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;
Wenn du das so machst sollte die anderen Mouse Ereignisse dann auch eintreffen.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#5

Re: Mausereignisse in meiner Komponente

  Alt 24. Mär 2004, 15:14
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?
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#6

Re: Mausereignisse in meiner Komponente

  Alt 24. Mär 2004, 17:15
Warum?
Was soll das werden?
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#7

Re: Mausereignisse in meiner Komponente

  Alt 24. Mär 2004, 20:25
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.
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#8

Re: Mausereignisse in meiner Komponente

  Alt 25. Mär 2004, 00:24
Weil CM_MOUSEENTER von der Delphi VCL erzeugt wird.

Weiterhin liegt das an der Natur der Nachrichten.

Setz doch das Ereignis OnMouseDown des Bevels.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:52 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