unit KolShapes; // // purpose: KOL Shape control // author: ©2004, Thaddy de Koning, mailto:thaddy@thaddy.com // Portions created by Mat Ballard, Copyright ©1999 Mat Ballard. // His original code is available from http://Chemware.hypermart.net/ // // The contents of this file are subject to the Mozilla Public License // Version 1.1 (the "License"). // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.mozilla.org/MPL/MPL-1.1.html // Software distributed under the License is distributed on an "AS IS" // basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. // See the License for the specific language governing rights and // limitations under the License. // // Remarks: Based on an idea and MPL'd -VCL- code by Mat Ballard, hence the MPL. // Simple example of how to create new KOL controls. // Since it is a true KOL control I could rip out most of the // original code, leaving just the paint routine and a small container // which I assign to the CustomObj property. // This shows that writing KOL custom controls is actually *simpler* // than writing VCL controls! // // Have fun, // // Thaddy interface uses Windows,messages,kol; type TShapeType = (stArrowRight, stArrowLeft, stArrowUp, stArrowDown, stEllipse, stLineHorz, stLineVert, stRectangle, stRectangleRound, stTriangleUp, stTriangleDown, stTriangleLeft, stTriangleRight ); PShapeData=^TShapeData; TShapeData = object(TObj) private FShape: TShapeType; procedure Paint(sender:pControl;DC:HDC); end; function NewShape(aOwner:PControl;aType:TShapeType;PenColor,BrushColor:TColor):Pcontrol; { Creates a Shape control Pencolor = Color1 BrushColor = Color2 Possible Shapes: stArrowRight, stArrowLeft, stArrowUp, stArrowDown, stEllipse, stLineHorz, stLineVert, stRectangle, stRectangleRound, stTriangleUp, stTriangleDown, stTriangleLeft, stTriangleRight} implementation function NewShape(aOwner:PControl;aType:TShapeType;PenColor,BrushColor:TColor):Pcontrol; var Data:PShapeData; begin {Create the Shape data object} New(Data,Create); {Create the control as a paintbox} Result:=NewPaintBox(aOwner).setsize(50,50); with Result^ do begin {CustomObj's are automatically free'd in the TObject destructor} CustomObj:=Data; {Set the shape} Data.FShape:=aType; {Set the paint routine} OnPaint:=Data.Paint; {Set the colors} Color1:=PenColor; Color2:=BrushColor; {Leave the rest transparent} Transparent:=true; end; end; procedure TShapeData.Paint(sender:PControl;DC:HDC); var PT: Integer; begin with sender.canvas^ do begin Pen.Color:=sender.Color1; Brush.Color:=sender.Color2; PT := Pen.PenWidth div 2; case FShape of stRectangle: Rectangle(PT,PT, sender.Width-PT, sender.Height-PT); stRectangleRound: RoundRect(PT,PT, sender.Width-PT, sender.Height-PT, sender.Width div 4, sender.Height div 4); stEllipse: Ellipse(PT, PT, sender.Width-PT, sender.Height-PT); stLineHorz: begin MoveTo(0, sender.Height div 2); LineTo(sender.Width-1, sender.Height div 2); end; stLineVert: begin MoveTo(sender.Width div 2, 0); LineTo(sender.Width div 2, sender.Height-1); end; stArrowLeft: begin MoveTo(sender.Width-1, sender.Height div 2); LineTo(PT, sender.Height div 2); LineTo(sender.Height div 2, sender.Height-1); MoveTo(PT, sender.Height div 2); LineTo(sender.Height div 2, 0); end; stArrowRight: begin MoveTo(0, sender.height div 2); LineTo(sender.width-PT, sender.height div 2); LineTo(sender.width-1-(sender.height div 2), sender.height-1); MoveTo(sender.width-PT, sender.height div 2); LineTo(sender.width-1-(sender.height div 2), 0); end; stArrowUp: begin MoveTo(sender.width div 2, sender.height-1); LineTo(sender.width div 2, PT); LineTo(0, sender.width div 2); MoveTo(sender.width div 2, PT); LineTo(sender.width-1, sender.width div 2); end; stArrowDown: begin MoveTo(sender.width div 2, 0); LineTo(sender.width div 2, sender.height-PT); LineTo(0, sender.height-1-(sender.width div 2)); MoveTo(sender.width div 2, sender.height-PT); LineTo(sender.width-1, sender.height-1-(sender.width div 2)); end; stTriangleUp: Polygon([MakePoint(sender.width div 2, 0), MakePoint(sender.width-1, sender.height-1), MakePoint(0, sender.height-1)]); stTriangleDown: Polygon([MakePoint(0, 0), MakePoint(sender.width-1, 0), MakePoint(sender.width div 2, sender.height-1)]); stTriangleLeft: Polygon([MakePoint(0, sender.height div 2), MakePoint(sender.width-1, 0), MakePoint(sender.width-1, sender.height-1)]); stTriangleRight: Polygon([MakePoint(0, 0), MakePoint(sender.width-1, sender.height div 2), MakePoint(0, sender.height-1)]); end; end; end; end.