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 1 von 2  1 2      
Hallo_Thomas

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

Transparentes Bild soll nur an bestimmten stellen angeklickt

  Alt 18. Aug 2005, 21:39
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!
Angehängte Grafiken
Dateityp: bmp haus_779.bmp (64,6 KB, 79x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#2

Re: Transparentes Bild soll nur an bestimmten stellen angekl

  Alt 18. Aug 2005, 21:43
Überprüfe doch beim Klick auf das Bild, welche Farbe "unter" dem Mauszeiger liegt. Wenn es weiss ist, dann lass das Programm nicht reagieren...
Bisheriger Nutzername "DJ-SPM"
  Mit Zitat antworten Zitat
Hallo_Thomas

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

Re: Transparentes Bild soll nur an bestimmten stellen angekl

  Alt 18. Aug 2005, 22:59
Welche Componente meinst Du?, Ich hab das Bild mal als Image, Speedbutton und BitBtn dargestellt, habs aber irgendwie nich geschafft?
  Mit Zitat antworten Zitat
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Transparentes Bild soll nur an bestimmten stellen angekl

  Alt 18. Aug 2005, 23:34
Es geht auch ganz simpel:
Mal zwei Shapes draus. Ein Dreieck und drunter eine Rechteck....
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
Hallo_Thomas

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

Re: Transparentes Bild soll nur an bestimmten stellen angekl

  Alt 19. Aug 2005, 00:33
Ich bin da noch nich ganz so bewandert in den sachen, wie mach ich ein Dreieck?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Transparentes Bild soll nur an bestimmten stellen angekl

  Alt 19. Aug 2005, 00:48
Zitat von Hallo_Thomas:
Welche Componente meinst Du?, Ich hab das Bild mal als Image, Speedbutton und BitBtn dargestellt, habs aber irgendwie nich geschafft?
Mit einer Schaltfläche lässt sich das natürlich nicht so einfach realisieren, aber mit einem TImage ist das ganze kein Problem, wie es DJ-SPM gesagt hat.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#7

Re: Transparentes Bild soll nur an bestimmten stellen angekl

  Alt 19. Aug 2005, 07:04
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.
  Mit Zitat antworten Zitat
Hallo_Thomas

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

Re: Transparentes Bild soll nur an bestimmten stellen angekl

  Alt 19. Aug 2005, 20:30
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?
  Mit Zitat antworten Zitat
Puhbaehr
(Gast)

n/a Beiträge
 
#9

Re: Transparentes Bild soll nur an bestimmten stellen angekl

  Alt 20. Aug 2005, 04:27
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:
procedure TForm1.Image1MouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer);
 begin
  // x, y = Mausposition im TImage
 end;
Ähnliches Ergebnis bringt folgende Funktion:
Delphi-Quellcode:
Mouse.CursorPos.X;
Mouse.CursorPos.Y;
Allerdings mit dem Nachteil das du damit die absolute Position am Bildschrim zurück bekommst.
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:
Image1.Canvas.Pixels [X, Y]; Zurück erhalten wir die Farbe als Hexadezimalwert.

Schrauben wir beides zusammen erhalten wir das hier:
Delphi-Quellcode:
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;
Nun kann der so gewonnene Wert gespeichert und in einem OnClick-Ereignis ausgewertet werden:
Delphi-Quellcode:
procedure TForm1.Image1Click(Sender: TObject);
 begin
  if MausDarfKlicken then
   begin
    // mache irgendetwas z.B.
    showmessage ('Ins schwarze Getroffen! ;)');
   end;
 end;
Fertig sieht das ganze z.B. so aus:

Delphi-Quellcode:
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.
Sicherlich nicht sehr elegant aber für den Zweck und zur Erklärung reicht es.

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)
  Mit Zitat antworten Zitat
Puhbaehr
(Gast)

n/a Beiträge
 
#10

Re: Transparentes Bild soll nur an bestimmten stellen angekl

  Alt 20. Aug 2005, 05:03
Ergänzend zum obigem:

cm_hittest ist eine Konstante die u.a. bei der Behandlung von Botschaften (Nachrichten --> Hier im Forum suchenMessage) gebraucht wird. Sobald eine Nachricht dieses "Typs" eintrifft wird darauf die definierte Prozedur aufgerufen.
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: Hier im Forum suchenMessage, Hier im Forum suchenTMessage und Hier im Forum suchenMsg, Hier im Forum suchenTMsg und vorallem z.B. Hier im Forum suchencm_mouseenter (gefunden hier)

Nebenbei: Schöne Grüße nach Dresden
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 20:34 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