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

n/a Beiträge
 
#9

Re: Transparentes Bild soll nur an bestimmten stellen angekl

  Alt 20. Aug 2005, 05: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
 


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 12:34 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 by Thomas Breitkreuz