Drawing the Component Image
Go Up to Creating a graphic component Index
The essential element of a graphic control is the way it paints its image on the screen. The abstract type TGraphicControl defines a method called Paint that you override to paint the image you want on your control.
The Paint method for the shape control needs to do several things:
- Use the pen and brush selected by the user.
- Use the selected shape.
- Adjust coordinates so that squares and circles use the same width and height.
Overriding the Paint method requires two steps:
- Add Paint to the component's declaration.
- Write the Paint method in the implementation part of the unit.
For the shape control, add the following declaration to the class declaration:
type TSampleShape = class(TGraphicControl) . . . protected procedure Paint; override; . . . end;
class PACKAGE TSampleShape : public TGraphicControl { . . . protected: virtual void __fastcall Paint(); . . . };
Then write the method in the implementation part of the unit:
procedure TSampleShape.Paint; begin with Canvas do begin Pen := FPen; { copy the component's pen } Brush := FBrush; { copy the component's brush } case FShape of sstRectangle, sstSquare: Rectangle(0, 0, Width, Height); { draw rectangles and squares } sstRoundRect, sstRoundSquare: RoundRect(0, 0, Width, Height, Width div 4, Height div 4); { draw rounded shapes } sstCircle, sstEllipse: Ellipse(0, 0, Width, Height); { draw round shapes } end; end; end;
void __fastcall TSampleShape::Paint() { int X,Y,W,H,S; Canvas->Pen = FPen; // copy the component's pen Canvas->Brush = FBrush; // copy the component's brush W=Width; // use the component width H=Height; // use the component height X=Y=0; // save smallest for circles/squares if( W<H ) S=W; else S=H; switch(FShape) { case sstRectangle: // draw rectangles and squares case sstSquare: Canvas->Rectangle(X,Y,X+W,Y+H); break; case sstRoundRect: // draw rounded rectangles and squares case sstRoundSquare: Canvas->RoundRect(X,Y,X+W,Y+H,S/4,S/4); break; case sstCircle: // draw circles and ellipses case sstEllipse: Canvas->Ellipse(X,Y,X+W,Y+H); break; default: break; } }
Paint is called whenever the control needs to update its image. Controls are painted when they first appear or when a window in front of them goes away. In addition, you can force repainting by calling Invalidate, as the StyleChanged method does.