Autor Beitrag
NetSpider
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 123

Windows XP Pro
Delphi 7 Enterprise
BeitragVerfasst: Do 19.03.09 07:43 
Hi,

ich hab zwei Image-Komponenten auf einer Form. Die kleinere enthaelt ein Image welches bei einem OnClick-Event des grossen Image einen Teil ueberblendet. Das Problem ist, dass die Image-Komponenten Rechteckig sind, der Teil der ersetzt wird aber eine Rundung hat.

Mit dieser Funktion pruefe ich, ob der Curser an der Position ist an dem das kleine Image ueberblendet:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function Tfrm_OAPhone.MouseOverHotImage(aImage: TImage; x, y: Integer): Boolean;
var i: Integer;
begin
Result := false;
If (x > aImage.Left) and (x < aImage.Left + aImage.Width) then begin
If (y > aImage.Top) and (y < aImage.Top + aImage.Height) then begin
 Result := true;
end;
end;
end;


Das klappt auch - gibt aber nicht die wirkliche geometrische Form des Buttons wieder. Ich moechte aber, dass die Funktion nur dann true zurueckliefert, wenn der Curser sich unterhalb der Rundung befindet.

Ich haenge das Image mal an um mein Problem zu verdeutlichen.

Danke schonmal.
Einloggen, um Attachments anzusehen!
_________________
Wer in die Fußstapfen anderer tritt hinterlässt keine eigenen Spuren!
passiv
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 270

WIN XP Professional
Delphi 7 Enterprise, Java (Eclipse), Python 2.5, Django 1.1
BeitragVerfasst: Do 19.03.09 12:34 
ich seh auf die schnelle 2 möglichkeiten: 1. du rechnest dir über den radius den der knopf hat (ist ja ein viertel-kreis) aus, ob er drauf liegt. oder (2.) du machst den teil "im off" clFuchsia oder so ähnlich (auf jeden fall extrem und anders und kohärent -> jpeg würd nicht gehen) und schaust im OnMouseMove ob der pixel da jetzt im off ist oder nicht. und dann setzt du noch auf transparent, weil das is ja nicht unbedingt schön :D

bis dann
Fabian

_________________
Die Probleme, die es in der Welt gibt, sind nicht mit der gleichen Denkweise zu lösen, die sie erzeugt hat.
Albert Einstein
NetSpider Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 123

Windows XP Pro
Delphi 7 Enterprise
BeitragVerfasst: Do 19.03.09 14:45 
Das mit der Pixel-Farbe waere mit Sicherheit eine Loesung... Doch mir gefaellt das mit dem Radius viel besser - und ich denke das ist auch die Loesung.

Ich werde das jetzt mal versuchen - hab aber noch keine Ahnung wie. Jeder Denkanstoss ist willkommen. Sollte ich alleine auf die Loesung kommen, werde ich sie hier posten.

Danke

_________________
Wer in die Fußstapfen anderer tritt hinterlässt keine eigenen Spuren!
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Do 19.03.09 14:55 
Stichwort Cosinus und Sinus ;)
NetSpider Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 123

Windows XP Pro
Delphi 7 Enterprise
BeitragVerfasst: Do 19.03.09 16:39 
So - geloest...

Die allgemeine Formel ist (x - xm)2 + (y - ym)2 = r2. Damit kann man pruefen, ob ein punkt auf der Kreislinie liegt. Soll geprueft werdern, ob ein punkt im Kreis liegt aendert man
die Formel zu (x - xm)2 + (y - ym)2 < r2 - oder ausserhalb - (x - xm)2 + (y - ym)2 > r2 (2 = quadrieren).

Die Delphi-Funktion sieht folgendermassen aus:
ausblenden Delphi-Quelltext
1:
if (SQR(x - 394) + SQR(y - 308)) < SQR(86) then Result := true else Result := false;					

Hier wird geprueft ob der Punkt Punkt (x/y) innerhalb des Kreises liegt.

Danke nochmals

_________________
Wer in die Fußstapfen anderer tritt hinterlässt keine eigenen Spuren!