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)