TGroupLayer32

Ancestors

   |
TLayer32


Apart from the top-most layer (TLayeredImage32.Root), all layers are nested within other layers. Nested layers are usually confined to the clipping region of their Parent layer, unless that Parent happens to be a TGroupLayer32 object. TGroupLayer32 objects are intended to group related child layers (to simplify their construction and destruction) without confining them to a specific region. Grouping layers also improves rendering performance since they can be blended collectively rather than as individual layers.

TLayeredImage32.Root) is a TGroupLayer32 that's created automatically when its owner TLayeredImage32 is created.

The Img32.Layers unit also defines several descendants of TGroupLayer32 - TSizingGroupLayer32, TRotatingGroupLayer32 and TButtonGroupLayer32.

Note: Since TGroupLayer32 is a TLayer32 descendant, it has an Image property. However, this Image is used internally and should not be drawn on directly.

var
  clickedPoint      : TPoint;
  clickedLayer      : TLayer32;
  targetLayer       : TLayer32;
  sizingbuttongroup : TSizingGroupLayer32;
    
procedure TForm1.FormMouseDown(Sender: TObject; 
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  clickedPoint := Types.Point(X,Y);
  clickedLayer := layeredImage.GetLayerAt(clickedPoint);

  if not Assigned(clickedLayer) then 
  begin
    //destroy any existing sizing buttons
    FreeAndNil(sizingbuttongroup);     
	targetLayer := nil;
  end
  
  //else if clicking on a new target ...
  else if not (clickedLayer is TDesignerLayer32) and 
    (clickedLayer <> targetLayer) then
  begin
    //destroy any existing sizing buttons
    FreeAndNil(sizingbuttongroup);     
	//assigned target
	targetLayer := clickedLayer;
    //create a new group of sizing buttons
	sizingbuttongroup := 
	  CreateSizingButtonGroup(targetLayer,
	    ssCorners, bsRound, DefaultButtonSize, clRed32);
  end;

  //The surface where layeredImage is being 
  //displayed will need refreshing
  Invalidate; 
end;

procedure TForm1.FormMouseMove(Sender: TObject; 
  Shift: TShiftState; X,Y: Integer);
var
  layer  : TLayer32;
  dx, dy : integer;
  rec    : TRect;
begin
  if not (ssLeft in Shift) then
  begin
    layer := layeredImage.GetLayerAt(Types.Point(X,Y));
    if Assigned(layer) then
      Cursor := layer.CursorId else
      Cursor := crDefault;
  end;
  if not Assigned(clickedLayer) then Exit;
  
  dx := X - clickedPoint.X;
  dy := Y - clickedPoint.Y;
  clickedPoint := Types.Point(X,Y);
  
  clickedLayer.Offset(dx, dy);
  
  if (clickedLayer = targetLayer) then
    //also move all the sizing buttons
    sizingbuttongroupbuttongroup.Offset(dx, dy)
  else
  begin
    //respond to a sizing button move ...  
	//UpdateSizingButtonGroup auto-adjusts other 
	//button positions and returns the new BoundsRect
    rec := UpdateSizingButtonGroup(clickedLayer);
    targetLayerLayer.SetBounds(rec);
	//and targetLayer may also need redrawing
  end;  
  
  //The surface where layeredImage is being 
  //displayed will need refreshing
  Invalidate; 
end;

procedure TForm1.FormMouseUp(Sender: TObject; 
  Button: TMouseButton; Shift: TShiftState; 
  X, Y: Integer);
begin
  clickedLayer := nil;
end;
      

Reference

Methods Properties
In TGroupLayer32:
FirstChild
LastChild
In TLayer32:
AddChild BlendFunc
BringForwardOne Child
BringToFront ChildCount
ClearChildren ClipPath
Create CursorId
DeleteChild Height
Destroy Image
InsertChild Index
Invalidate InnerBounds
MakeAbsolute InnerRect
MakeRelative Left
Offset Location
PositionAt MidPoint
PositionCenteredAt Name
SendBackOne Opacity
SendToBack OuterBounds
SetInnerBounds Parent
SetSize Root
RootOwner
Top
UserData
Visible
Width

See Also

TButtonGroupLayer32, TLayer32, TLayeredImage32.Root, TRotatingGroupLayer32, TSizingGroupLayer32