O TCanvas trata-se do objeto que representa a superfície visível de um componente. Neste objeto pode-se colocar imagens, ou até mesmo desenhá-las através de elementos básicos como Retângulos, Elipses e Arcos. Pode-se também traçar uma figura ponto a ponto.
O TCanvas é formado por pontos (“pixels”) dispostos como uma matriz de pontos. Cada ponto tem uma cor específica determinada pela propriedade Pixels.
A origem do TCanvas, isto é o ponto de coordenadas (0,0), ao contrário do sistema cartesiano, é no canto superior esquerdo, orientado para a direita e para baixo.
Principais propriedades e métodos:
· Pixels – Propriedade do tipo Tcolor que indica a cor de cada um dos pontos (pixels) que formam o Canvas.
Exemplo:
Para alterar a cor do ponto que está na coordenada (10,10) para Azul podemos digitar:
Image1->Canvas->Pixels[10][10] = clBlue;
· Pen – Propriedade do tipo TPen que determina o estilo da caneta que será utilizada para desenhar no Canvas (através dos métodos LineTo e MoveTo, por exemplo).
Exemplos:
Para altera a cor da caneta do Canvas do componente Image1 para Vermelho podemos digitar:
Image1->Canvas->Pen->Color=clRed;
Para alterar a espessura do traço podemos digitar:
Image1->Canvas->Pen->Width=3;
· Brush – Propriedade do tipo TBrush que determina o estilo de preenchimento utilizado no Canvas (por exemplo, pelo método FillRect).
Exemplo:
Para alterar a cor do preenchimento para Azul, podemos digitar:
Image1->Canvas->Brush->Color=clBlue;
· FillRect – Método utilizado para preencher uma porção retangular do Canvas pelo estilo especificado pelo Brush.
Exemplo:
Para preencher um retângulo de vértices nos pontos (50,50) e (100,100), podemos digitar:
Image1->Canvas->FillRect(Rect(50,50,100,100));
· MoveTo – Método utilizado para mover a caneta para um determinado ponto do Canvas. Este método apenas move a caneta, sem desenhar.
Exemplo:
Image1->Canvas->MoveTo(100,100);
· LineTo – Método utilizar para traçar uma reta desde o ponto atual até o ponto especificado.
Exemplo:
Para desenhar um triângulo de vértices (50,50) (50,100) e (100,100), podemos digitar:
Image1->Canvas->MoveTo(50,50);
Image1->Canvas->LineTo(50,100);
Image1->Canvas->LineTo(100,100);
Image1->Canvas->LineTo(50,50);

Figura 14-22
exemplo do resultado dos métodos moveto e lineto
· Font – Propriedade do tipo TFont que determina como os textos serão escritos no Canvas (pelo método TextOut, por exemplo).
· TextOut – Método que exibe um texto no Canvas na coordenada especificada.
Exemplo:
Image1->Canvas->TextOut(50,50,”Exemplo”);
· Rectangle – Método que desenha um retângulo no Canvas. Deve-se especificar as coordenadas do canto superior esquerdo e do canto inferior direito.
Exemplo:
Image1->Canvas->Rectangle(50,50,100,100);
· Ellipse – Método que desenha uma elipse inscrita dentro de um retângulo imaginário.
Exemplo:
Image1->Canvas->Ellipse(50,50,100,100);
.
.
.
Ex 4) Elaborar um programa em C++Builder para exibir a curva da função:
f(x) = 100 seno(x) + 100
Solução:
· Ao se analisar a função podes-se constatar que para qualquer valor de X, o valor máximo da função é 200 e o mínimo 0.
· Sendo f(x) uma função senoidal ela é cíclica, ou seja o intervalo de 0º a +360º representa significativamente o comportamento de f(x).
· Normalmente as funções exigem alguma forma de “Módulo de Escala” para ser exibida apropriadamente. Para se poder desprezar este procedimento o objeto do tipo TImage deve ser do tamanho de 360x200 pixels
· A função se comporta conforme a gravura abaixo, onde se pode detectar: Valor inicial de X (Xo); Valor final de X (Xn); Número de divisões (n) e o Passo (h).

Figura 14-27
gráfico da função 100*sen(x)+100
· O passo pode ser calculado se dividindo o intervalo de Xo a Xn pelo número de divisões (n).
· Os valores que X assume podem ser calculados pela seguinte PA (progressão aritmética):
Xi = Xo + i . h
· Os valores de Y podem ser calculados pela própria função:
Yi = 100 . seno(x) + 100

Figura 14-28
tela do aplicativo da função f(x)=100*sin(x)+100
//-----------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "Unit1.h"
//-----------------------------------------------------
#pragma resource "*.dfm"
//-----------------------------------------------------
#include <math.h>
#define PI 3.1415926535897932384626433832795
//-----------------------------------------------------
TForm1 *Form1;
double DegToRad(double Alfa)
{
return (Alfa*PI/180);
}
//-----------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//-----------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int xi,yi,i,n;
double h,x0,xn;
x0=StrToFloat(Edit1->Text);
xn=StrToFloat(Edit2->Text);
n=StrToInt(Edit3->Text);
h=(xn-x0)/n;
Image1->Canvas->Pen->Color = clRed;
/* Desenho da função */
for (i=0;i<=n;i++)
{
xi=(int)(x0+i*h);
yi=(int)(100*sin(DegToRad(xi))+100);
if (i==0)
Image1->Canvas->MoveTo(xi,200-yi);
else
Image1->Canvas->LineTo(xi,200-yi);
}
/* Desenho dos eixos de R2 */
Image1->Canvas->Pen->Color = clBlack;
Image1->Canvas->MoveTo(0,100);
Image1->Canvas->LineTo(360,100);
Image1->Canvas->MoveTo(0,0);
Image1->Canvas->LineTo(0,200);
}
//-----------------------------------------------------
Observações:
· Pode-se notar que os valores de Xi e Yi são arredondados pela chamada (int). Faz-se isso pois as coordenadas (X,Y) do Canvas são inteiras.
· A expressão 200-Yi que aparece nos métodos MoveTo e LineTo serve para inverter o gráfico, fazendo com que a origem do Canvas coincida com a origem do plano cartesiano. O valor 200 é exatamente a altura do Canvas.