![]() |
Transparentes Bild soll nur an bestimmten stellen angeklickt
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
Ich wollte das angehängte Bild(Die farbe weiss soll transparnet sein) als Button darstellen, dabei soll er nur reagieren, wenn er auf dem Haus ist! |
Re: Transparentes Bild soll nur an bestimmten stellen angekl
Überprüfe doch beim Klick auf das Bild, welche Farbe "unter" dem Mauszeiger liegt. Wenn es weiss ist, dann lass das Programm nicht reagieren...
|
Re: Transparentes Bild soll nur an bestimmten stellen angekl
Welche Componente meinst Du?, Ich hab das Bild mal als Image, Speedbutton und BitBtn dargestellt, habs aber irgendwie nich geschafft?
|
Re: Transparentes Bild soll nur an bestimmten stellen angekl
Es geht auch ganz simpel:
Mal zwei Shapes draus. Ein Dreieck und drunter eine Rechteck.... |
Re: Transparentes Bild soll nur an bestimmten stellen angekl
Ich bin da noch nich ganz so bewandert in den sachen, wie mach ich ein Dreieck?
|
Re: Transparentes Bild soll nur an bestimmten stellen angekl
Zitat:
|
Re: Transparentes Bild soll nur an bestimmten stellen angekl
Man kann Tricks mit der VCL-internen Message CM_HITTEST treiben.
Man behandelt diese Message und liefert nur bei nicht transparenten Pixeln eine 1 sonst eine 0 in Msg.Result. Die Position des Klicks ist in Msg.LParam enthalten. |
Re: Transparentes Bild soll nur an bestimmten stellen angekl
Ich bin den sachen wohl noch recht unbelesen, und auch nicht wirklich viel Literatur zu CM_HITTEST gefunden, wieverbinde ich den Befehl mit TImage, damits funktioniert?
|
Re: Transparentes Bild soll nur an bestimmten stellen angekl
Hallo Hallo_Thomas *g*,
also, da ich selbst noch am Experimentieren bin was Delphi betrifft konnte ich mit dem oben genannten Vorschlägen wenig Anfangen. Bis eben wusste ich nicht einmal wie man die Farbe hinter der Maus ausliest usw.. Ich habe auch nach z.B. CM_HITTEST gesucht und habe einiges damit zusammen gebastelt. Aber es hat nicht richtig bzw. überhaupt nicht funktioniert, weil ich a) vielleicht nicht das nötige Wissen habe oder/und b) es so einfach nicht funktioniert Aber ich habe mal für dich und einfach weil mich dieses Thema selbst sehr interessiert etwas weiter rumgesucht und bin zu folgendem Ergebnis gekommen: *erklär* Du benötigst im Prinzip nichts weiter als die aktuelle Position der Maus ausgehend vom TImage-Objekt. Diese erfährst du z.B. mit dem Ereignis OnMouseMove:
Delphi-Quellcode:
Ähnliches Ergebnis bringt folgende Funktion:
procedure TForm1.Image1MouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin // x, y = Mausposition im TImage end;
Delphi-Quellcode:
Allerdings mit dem Nachteil das du damit die absolute Position am Bildschrim zurück bekommst.
Mouse.CursorPos.X;
Mouse.CursorPos.Y; Du müsstest von diesem Wert noch die Fensterposition und die Position des TImage im Fenster abrechnen was nicht einfach wird da (zumindest ist mir keine Funktion bekannt) Höhe der Titelleiste, Rahmenbreite und ähnliches nicht bekannt sind. Da du aber sowieso die aktuelle Position von deinem TImage-Objekt ausgehend haben willst ist erstens die bessere Wahl. Nun benötigst du nur noch die Farbe an der Position. Das machen wir mit:
Delphi-Quellcode:
Zurück erhalten wir die Farbe als Hexadezimalwert.
Image1.Canvas.Pixels [X, Y];
Schrauben wir beides zusammen erhalten wir das hier:
Delphi-Quellcode:
Nun kann der so gewonnene Wert gespeichert und in einem OnClick-Ereignis ausgewertet werden:
procedure TForm1.Image1MouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin if (Image1.Canvas.Pixels[x, y] = $FFFFFF) then begin MausDarfKlicken := false; end else begin MausDarfKlicken := true; end; end;
Delphi-Quellcode:
Fertig sieht das ganze z.B. so aus:
procedure TForm1.Image1Click(Sender: TObject);
begin if MausDarfKlicken then begin // mache irgendetwas z.B. showmessage ('Ins schwarze Getroffen! ;)'); end; end;
Delphi-Quellcode:
Sicherlich nicht sehr elegant aber für den Zweck und zur Erklärung reicht es.
unit UForm;
interface uses Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) Image1 : TImage; procedure Image1Click (Sender: TObject); procedure Image1MouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); private MausDarfKlicken : boolean; end; var Form1 : TForm1; implementation {$R *.DFM} procedure TForm1.Image1Click(Sender: TObject); begin if MausDarfKlicken then begin // mache irgendetwas z.B. showmessage ('Ins schwarze Getroffen! ;)'); end; end; procedure TForm1.Image1MouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); begin // $FFFFFF = clWhite = entspricht weiß if (Image1.Canvas.Pixels[x, y] = $FFFFFF) then begin MausDarfKlicken := false; end else begin MausDarfKlicken := true; end; end; end. Robert Marquardt hatte sicherlich vor für MouseMove und OnClick eigene Behandlungsroutinen zu schreiben. Wie schon oben erwähnt versuchte ich selbiges ebenfalls was mir nur Teilweise gelang. Ich hoffe das Problem ist nun geklärt? Bei Fragen stehen ich und auch andere sicherlich gerne zur Verfügung. Bis dann! Gruß, Robert (ja, so heiß ich auch ;)) PS: An einen Mod: Kann ich auch Textformatierungen innerhalb der Codeformatierung anwenden? (z.B. Hervorheben durch Fettschrift oder farblich hervorheben) Edit: Delphiformatierung statt Codeformatierung verwendet ([code] durch [delphi] ersetzt) |
Re: Transparentes Bild soll nur an bestimmten stellen angekl
Ergänzend zum obigem:
cm_hittest ist eine Konstante die u.a. bei der Behandlung von Botschaften (Nachrichten --> ![]() Es ist Möglich z.B. eine OnClick-Behandlungsroutine selbst zu bauen die dann gleich die Mauskoordinaten mitliefert. So wird nicht ständig beim Überfahren mit der Maus über die TImage die Koordinaten und die Farbe ausgewertet sondern erst beim Klick (spart Ressorcen). Bei mir hatte das aber nicht wirklich geklappt da ich es nicht geschafft habe das Ereignis nur auf das TImage-Objekt anzuwenden. Wenn du das selbst nocheinmal versuchen möchtest: Stichwörter: ![]() ![]() ![]() ![]() ![]() ![]() Nebenbei: Schöne Grüße nach Dresden ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:46 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