Einzelnen Beitrag anzeigen

Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.337 Beiträge
 
Delphi 11 Alexandria
 
#1

Regionen, Rahmen und Schatten

  Alt 3. Jun 2015, 23:56
Ich bastle an eigenen Controls. Solange das nur Rechtecke waren, war das alles recht gut zu lösen.

Nun habe ich Page-Controls, die unregelmäßig sind. Im Bild mal 10 hintereinander und etwas versetzt.
Man erkennt, dass die Controls aus Regionen bestehen und oben solche "Laschen" haben.
Neben den Laschen sind sie sowohl transparent als auch für die Maus nicht erfassbar.

So weit so gut.

Ich habe nun zwei Fragen:

1) Wenn ich für den Rahmen ein Polygon definiere und dieses Polygon dann auch mit CreatePolygonRgn benutze, um den Zeichenbereich zu begrenzen, dann werden die rechts und unten positionierten Rahmenlinien nicht mehr gezeichnet.
Daher habe ich das Polygon für die Region nach Rechts und unten um 1 Pixel vergrößert.

Delphi-Quellcode:
  SetLength(fPolygonF, 8);
  SetLength(fPolygonR, 8);

  PolygonF[0] := Point(ClientRect.Left, ClientRect.Top + 24);
  PolygonF[1] := Point(ClientRect.Left + RL, ClientRect.Top + 24);
  PolygonF[2] := Point(ClientRect.Left + RL, ClientRect.Top);
  PolygonF[3] := Point(ClientRect.Left + (RL + RW), ClientRect.Top);
  PolygonF[4] := Point(ClientRect.Left + (RL + RW), ClientRect.Top + 24);
  PolygonF[5] := Point(ClientRect.Right, ClientRect.Top + 24);
  PolygonF[6] := Point(ClientRect.Right, ClientRect.Bottom);
  PolygonF[7] := Point(ClientRect.Left, ClientRect.Bottom);

  PolygonR[0] := Point(ClientRect.Left, ClientRect.Top + 24);
  PolygonR[1] := Point(ClientRect.Left + RL, ClientRect.Top + 24);
  PolygonR[2] := Point(ClientRect.Left + RL, ClientRect.Top);
  PolygonR[3] := Point(ClientRect.Left + (RL + RW) + 1, ClientRect.Top);
  PolygonR[4] := Point(ClientRect.Left + (RL + RW) + 1, ClientRect.Top + 24);
  PolygonR[5] := Point(ClientRect.Right + 1, ClientRect.Top + 24);
  PolygonR[6] := Point(ClientRect.Right + 1, ClientRect.Bottom + 1);
  PolygonR[7] := Point(ClientRect.Left, ClientRect.Bottom + 1);
Für den Zweck ist das ja noch ok, aber kann man das irgendwie automatisieren?
Man könnte ja auch mal ein unregelmäßiges (z.B. sternförmiges mit schrägen und vielen Zacken) Polygon haben.

Gibt es eine Funktion, die ein Polygon nach rechts und unten um 1 Pixel vergrößert?
Man müsste ja erst einmal erkennen, welche Linien rechts oder unten liegen.


2) Den Controls habe ich auf Wunsch Schatten zugewiesen.
Jetzt wird der Schatten natürlich rechts am ClientRect des Controls gezeichnet.
(Der Schatten wird natürlich außerhalb des ControlRects gezeichnet, da er ja nicht zum Control gehört.)
Nun ist der Schatten neben dem freigestellten Bereich natürlich unsinnig und sollte dafür neben der Lasche oben gezeichnet werden.

Ich könnte das natürlich als Sonderfall für das Control explizit regeln, aber gibt es vielleicht eine günstige generelle Lösung?

Auch hier müsste (wie bei Punkt 1) ermittelt werden, welche Kanten (rechts und unten) einen Schatten werfen müssen.


Natürlich will ich hier keine 3D-Graphicengine bauen.
Ein Ausstanzen unregelmäßiger Polygone mit sichtbarem Rahmen und einem kleinen Schatten wäre völlig ausreichend.


Hat jemand Ideen dazu?


Edit: ich habe eine idee. Schreibe später weiter.
Miniaturansicht angehängter Grafiken
pc.png  
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli ( 4. Jun 2015 um 00:33 Uhr)
  Mit Zitat antworten Zitat