Einzelnen Beitrag anzeigen

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