AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Transparentes Bild soll nur an bestimmten stellen angeklickt
Thema durchsuchen
Ansicht
Themen-Optionen

Transparentes Bild soll nur an bestimmten stellen angeklickt

Ein Thema von Hallo_Thomas · begonnen am 18. Aug 2005 · letzter Beitrag vom 22. Aug 2005
Antwort Antwort
Seite 2 von 2     12   
Robert Marquardt
(Gast)

n/a Beiträge
 
#11

Re: Transparentes Bild soll nur an bestimmten stellen angekl

  Alt 20. Aug 2005, 05:57
Eigentlich geht es um eine Ableitung von TImage. Dort ueberschreibt man die Message CM_HITTEST und liefert im Result der TMessage-Struktur
je nachdem ob die Maus ueber einem transparenten Pixel ist 0 oder 1. Die Mausposition ist im LParam der Struktur kodiert.
Danach fuehlt sich die Komponente nur angeklickt wenn sie auf einem nicht-transparenten Pixel getroffen wird.
Genaugenommen ist sie jetzt auch fuer Klicks transparent.
TJvImage der JVCL hat das bereits implementiert.
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#12

Re: Transparentes Bild soll nur an bestimmten stellen angekl

  Alt 20. Aug 2005, 06:14
@Robert Marquardt JVCL Schleichwerbung ?

@Puhbaehr Warum nicht einfach das MousUp- bzw. MouseDown-Ereignis des Images verwenden ?

Delphi-Quellcode:
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if (Shift = [ssRight]) and (Image1.Canvas.Pixels[X, Y] <> clWhite) then
  begin
    // Was dann gemacht werden Soll...
    // ...
  end;
end;
Ich verwende meistens die Farbe clFuchsia (RGB = 255, 0, 255) für Transparenz, da clFuchsia nicht so oft vorkommt. IMHO ist clWhite ist nicht immer die beste Wahl.

// Edit:

Zitat von Puhbaehr:
PS: An einen Mod: Kann ich auch Textformatierungen innerhalb der Codeformatierung anwenden? (z.B. Hervorheben durch Fettschrift oder farblich hervorheben)
Ich nix Mod, aber : [color] innerhalb [code]/[delphi]
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#13

Re: Transparentes Bild soll nur an bestimmten stellen angekl

  Alt 20. Aug 2005, 06:22
Weil das die Komponente nicht fuer Klicks durchsichtig macht.
  Mit Zitat antworten Zitat
Puhbaehr
(Gast)

n/a Beiträge
 
#14

Re: Transparentes Bild soll nur an bestimmten stellen angekl

  Alt 20. Aug 2005, 12:26
Zitat von turboPASCAL:
@Puhbaehr Warum nicht einfach das MousUp- bzw. MouseDown-Ereignis des Images verwenden ?
Stimmt stimmt, daran hatte ich noch gar nicht gedacht

Zitat von turboPASCAL:
Zitat von Puhbaehr:
PS: An einen Mod: Kann ich auch Textformatierungen innerhalb der Codeformatierung anwenden? (z.B. Hervorheben durch Fettschrift oder farblich hervorheben)
Ich nix Mod, aber : [color] innerhalb [code]/[delphi]
Habe mich mal dem Thema angeschlossen

Zitat von turboPASCAL:
Ich verwende meistens die Farbe clFuchsia (RGB = 255, 0, 255) für Transparenz, da clFuchsia nicht so oft vorkommt. IMHO ist clWhite ist nicht immer die beste Wahl.
Zudem rate ich auch. Da ich auch bei meinem Bild das ich ins Beispiel eingebunden hatte merkte, dass viele Stellen weiß sind und da die 'Maus' auch nicht reagiert hatte.
Aber wie wäre es statt FF00FF (255, 0, 255) lieber eine eher seltenere Farbe nimmst. Denn kommt deine Freundin und will das Programm in einem pfiffigem Pink dann musst du auch umbauen.
Interessanter wäre da z.B. FE01FE (254, 1, 254) zu verwenden.

Aber nun gut
  Mit Zitat antworten Zitat
Puhbaehr
(Gast)

n/a Beiträge
 
#15

Re: Transparentes Bild soll nur an bestimmten stellen angekl

  Alt 20. Aug 2005, 12:27
Zitat von Robert Marquardt:
Weil das die Komponente nicht fuer Klicks durchsichtig macht.
Zeig uns mal bitte wie wenn du Zeit hast (etwas Code als Beispiel meine ich) Danke
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#16

Re: Transparentes Bild soll nur an bestimmten stellen angekl

  Alt 20. Aug 2005, 12:29
Zitat:
da (zumindest ist mir keine Funktion bekannt) Höhe der Titelleiste, Rahmenbreite und ähnliches nicht bekannt sind.
Nur so am Rande: MSDN-Library durchsuchenGetSystemMetrics.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#17

Re: Transparentes Bild soll nur an bestimmten stellen angekl

  Alt 20. Aug 2005, 12:34
Zitat von Luckie:
Zitat:
da (zumindest ist mir keine Funktion bekannt) Höhe der Titelleiste, Rahmenbreite und ähnliches nicht bekannt sind.
Nur so am Rande: MSDN-Library durchsuchenGetSystemMetrics.
Oder gleich Delphi-Referenz durchsuchenTControl.ScreenToClient .
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#18

Re: Transparentes Bild soll nur an bestimmten stellen angekl

  Alt 20. Aug 2005, 16:44
Hier eine aeltere Komponente von mir. Die ist nicht ideal konstruiert, aber funktioniert.
Wichtig ist, das PicUp und PicDown sich moeglichst nur in der Farbgebung unterscheiden.
Es ist sehr unangenehm wenn das Bild sich beim Betreten mit der Maus aendert und sich dabei der Hittest veraendert.
Damit ist die Maus wieder draussen und das Bild schaltet zurueck usw usf.

Mit CM_MOUSEENTER und CM_MOUSELEAVE gibt es in Delphi ein paar Macken. Manchmal wird das CM_MOUSELEAVE nicht generiert.
Man kann beispielsweise ueber ein Kontextmenue das man mit ESC abbricht die Komponente heimlich verlassen.
Delphi-Quellcode:
unit MouseImage;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls;

type
  TOnMouseEvent = procedure(Msg: TWMMouse) of object;

  TMouseImage = class(TImage)
  private
    FOnMouseEnter: TOnMouseEvent;
    FOnMouseLeave: TOnMouseEvent;
    FPicDown: TPicture;
    FPicUp: TPicture;
    FDown: Boolean;
    FEntered: Boolean;
    procedure SetPicDown(Value: TPicture);
    procedure SetPicUp(Value: TPicture);
    procedure SetDown(Value: Boolean);
    procedure SetEntered(Value: Boolean);
  protected
    procedure Loaded; override;
    procedure WMMouseEnter(var Msg: TWMMouse); message CM_MOUSEENTER;
    procedure WMMouseLeave(var Msg: TWMMouse); message CM_MOUSELEAVE;
    procedure CMHitTest(var Msg: TWMMouse); message CM_HITTEST;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Down: Boolean read FDown write SetDown;
    property Entered: Boolean read FEntered write SetEntered;
    property PicDown: TPicture read FPicDown write SetPicDown;
    property PicUp: TPicture read FPicUp write SetPicUp;
    property OnMouseEnter: TOnMouseEvent read FOnMouseEnter write FOnMouseEnter;
    property OnMouseLeave: TOnMouseEvent read FOnMouseLeave write FOnMouseLeave;
  end;

procedure Register;

implementation

{$R *.RES}

(*******************************************************************************)

procedure Register;
begin
  RegisterComponents('3rdParty', [TMouseImage]);
end;

(*******************************************************************************)

constructor TMouseImage.Create;
begin
  inherited;
  FPicDown := TPicture.Create;
  FPicUp := TPicture.Create;
  FDown := False;
  FEntered := False;
end;

(*******************************************************************************)

destructor TMouseImage.Destroy;
begin
  FreeAndNil(FPicDown);
  FreeAndNil(FPicUp);
  inherited;
end;

(*******************************************************************************)

procedure TMouseImage.Loaded;
begin
  Picture.Assign(PicUp);
end;

(*******************************************************************************)

procedure TMouseImage.WMMouseEnter(var Msg: TWMMouse);
var
 P: TControl;
begin
  inherited;
  P := Self;
  repeat
    P := P.Parent;
  until (P = nil) or (P is TForm);
  if (P = nil) or TForm(P).Active then
  begin
    Entered := True;
    if Assigned(FOnMouseEnter) then
      FOnMouseEnter(Msg);
  end;
end;

(*******************************************************************************)

procedure TMouseImage.WMMouseLeave(var Msg: TWMMouse);
var
 P: TControl;
begin
  inherited;
  P := Self;
  repeat
    P := P.Parent;
  until (P = nil) or (P is TForm);
  if (P = nil) or TForm(P).Active then
  begin
    Entered := False;
    if Assigned(FOnMouseLeave) then
      FOnMouseLeave(Msg);
  end;
end;

(*******************************************************************************)

procedure TMouseImage.CMHitTest(var Msg: TWMMouse);
begin
  inherited;
  if Assigned(PicUp) and Assigned(PicUp.Bitmap) and Transparent and
    (Msg.XPos < PicUp.Bitmap.Width) and (Msg.YPos < PicUp.Bitmap.Height) and
    (PicUp.Bitmap.Canvas.Pixels[Msg.XPos, Msg.YPos] = (Picture.Bitmap.TransparentColor and $FFFFFF)) then
    Msg.Result := 0;
end;

(*******************************************************************************)

procedure TMouseImage.SetPicUp(Value: TPicture);
begin
  FPicUp.Assign(Value);
end;

(*******************************************************************************)

procedure TMouseImage.SetPicDown(Value: TPicture);
begin
  FPicDown.Assign(Value);
end;

(*******************************************************************************)

procedure TMouseImage.SetDown(Value: Boolean);
begin
  FDown := Value;
  Entered := Value;
end;

(*******************************************************************************)

procedure TMouseImage.SetEntered(Value: Boolean);
begin
  FEntered := Value;
  if Down or Entered then
    Picture.Assign(PicDown)
  else
    Picture.Assign(PicUp);
end;

end.
Die Tests in WMMouseEnter und WMMouseLeave stellen sicher das die Komponente nur auf die Maus reagiert wenn sie auf der aktiven Form ist.
Es ist selten gewuenscht das die komponente reagiert, wenn sie auf einer im Hintergrund liegenden Form liegt.
CMHitTest ist das Herz der Komponente. Es wird getestet ob die Maus wirklich ueber dem Komponentenrechteck liegt und ob der Pixel unter dem Cursor transparent ist.
inherited; hat bereits dafuer gesorgt, das Msg.Result 1 ist, da dies die Standardantwort eines TImage ist.
Die Konsequenz ist, das die Komponente jetzt auch fuer Klicks transparent ist.
  Mit Zitat antworten Zitat
Hallo_Thomas

Registriert seit: 18. Apr 2005
Ort: Dresden
405 Beiträge
 
Delphi 2005 Professional
 
#19

Re: Transparentes Bild soll nur an bestimmten stellen angekl

  Alt 22. Aug 2005, 14:57
@Robert Marquardt
Toll, hab mich jetzt in den letzten Tagen damit beschäftigt, da ich mit den selbstgemachten Komponenten noch nich so auskenne, vom Grundgerüst her, würdch sagen, isses genau das was ich suche.

Nun zu meiner Frage
wie schon gesagt, mein wissen über eigene Komonenten ist noch nicht so gross.Also hab ich sie wie folft verucht einzubinden:


Delphi-Quellcode:
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private-Deklarationen }
    Haus: TBitmap;
    Bild: TMouseImage;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Haus := TBitmap.create;
  Haus.LoadFromFile(ExtractFilePath(ParamStr(0)) + '\Bilder\aktiv.bmp');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Haus.Free;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  Bild := TMouseImage.create(self);
  Bild.parent := self;
  Bild.Autosize := True;
  Bild.Transparent := True;
  Bild.Picture.Assign(Haus);
  Bild.Top := 10;
  Bild.Left := 10;
  Bild.PicUp.create;
  Bild.PicDown.create;
  Bild.PicUp.Assign(Haus);
  Bild.PicDown.LoadFromFile(ExtractFilePath(ParamStr(0)) + '\Bilder\unten.bmp');
end;
end.
Das klappt auch so weit, nur leider soll das Bildchen ja nicht beim darüberfahren nach unten gedrückt werden, sondern nur so ne Art OnMouseDown Eigenschaft.
Angehängte Dateien
Dateityp: zip button2_461.zip (24,3 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 07:50 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