Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Rundes Image als "Drehregler" - Randbereich weglassen


galagher - Sa 20.02.16 20:03
Titel: Rundes Image als "Drehregler" - Randbereich weglassen
Hallo!

Ich möchte eine Image-Komponente als runden Drehregler nutzen. Wie ich es rund bekomme, weiss ich (HRgn, CreateEllipticRgn). Wie ich abfrage, ob nach links oder rechts "gedreht" wurde, weiss ich auch (X, Y).

Meine Frage: Wie schneide ich den Rand um den runden Bereich weg, sodass ich nicht auch noch extra abfragen muss, ob sich X,Y innerhalb bestimmter Werte befinden? Es soll dann tatsächlich nur der runde Bereich nutzbar sein!


JoelH - Mo 22.02.16 12:08

Ich dachte zunächst, man kann einfach eine Shape drüberlgen, aber die gibt ebenfalls die Koordinaten, die ausserhalb des Kreises liegen zurück.

Deshalb wirst du m.E. wohl rechnen müssen. Wobei das sehr simpel ist, da du ja alle Koordinaten hast, die du benötigst und es relativ simpel ist zu checken ob diese innerhalb des Kreises liegen.

So mach ich das

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  xa := x - xMittelpunkt; 
  ya := y - xMittelpunkt;
  xa2 := xa*xa;
  ya2 := ya*ya;
  xy := ya2+xa2;
  d := sqrt(xy);
  if d < radius then    
    Innerhalb := true;


Das kannst du noch zusammenfassen, wenn du magst. xMittelpunkt ist der Mittelpunkt deines Kreises auf dem TImage. x und y sind die Koordinaten die du von Mousedown erhälst. Wenn d < des Radius deines Kreises ist, dann ist der Klick innerhalb des Kreises gewesen.


Holgerx - Mo 22.02.16 12:47

Hmm..

Für einen Test habe ich ein TImage auf ein Panel gelegt,
dieses mit


Delphi-Quelltext
1:
2:
  FRgn := CreateRoundRectRgn(11, Panel2.Width, Panel2.Height, Panel2.Width, Panel2.Height);
  SetWindowRgn(Panel2.Handle, FRgn, True);


Rund gemacht, somit wird auch das TImage rund gezeichnet.

Beim OnMouseDown oder OnClick des Images wird nun nur der sichtbare Bereich als Click-Ziel verwendet.

Somit sollte dies doch dass sein, was Du haben möchtest. ;)


Martok - Mo 22.02.16 15:49

Wenn du die HRGN schon hast, kannst du auch per Suche im MSDN PTINREGION überprüfen, ob der aktuelle Punkt in dieser Region ist.

Ansonsten könntest du auch eine eigene Komponente von TCustomControl ableiten, die hat dann ein Handle und du kannst das tun was user profile iconHolgerx beschreibt, da kann man dann durchklicken (im Gegensatz zum einfachen Überprüfen auf die Koordinate, wo dann einfach nichts passieren würde).


galagher - Mo 22.02.16 18:23

Ich komme wahrscheinlich erst im Laufe der Woche dazu, das alles zu testen!