Você está na página 1de 8

O OBJETO CANVAS

O OBJETO CANVAS: utilizado para desenharmos dentro de alguns objetos do Delphi, como por exemplo: o formulrio e o Image. CANVAS - PROPRIEDADES: As principais propriedades dos objetos da classe TCanvas esto enumeradas na tabela abaixo: Propriedades de TCanvas Propriedade de TBrush Descrio Forma de preenchimento. As formas podem ser: - bsSolid - bsCross - bsClear bsDiagCross - bsBDiagonal - bsHorizontal - bsFDiagonal - bsVertical Cor de preenchimento

Style

TBrush Color

BitMap Color Name Size TFont Style

Preenche com uma figura Cor da fonte Nome da fonte Tamanho da fonte Estilos: - fsBold - fsItalic - fsUnderline - fsStrikeout Cor da linha Estilo da linha: - psSolid - psDash - psDot - psDashDot - psDashDotDot - psClear Espessura da linha

Color

Tpen

Style

Width

CANVAS - MTODOS:

procedure Arc(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer); Desenha um arco inscrito em um retngulo cujas coordenadas devem ser especificadas. Descrio: Esta rotina desenha uma curva com a especificao da pena atual (propriedade Pen). O arco inscrito em um retngulo de coordenadas (X1,Y1) e (X2,Y2), sendo que o primeiro par se refere ao ponto situado no canto superior esquerdo e o outro par ao canto inferior direito do retngulo. O arco traado para a esquerda iniciando no ponto de partida para o ponto final. O ponto de partida (X3,Y3), sobre a elipse e (X4, Y4) o ponto final. Nota: Em Windows 95, as somas X1 + X2 e Y1 + Y2 no podem exceder 32768, assim como a soma X1 + X2 + Y1 + Y2. No Windows NT, a direo do desenho pode ser mudada usando uma rotina da API do Windows NT: SetArcDirection.

procedure BrushCopy(const Dest: TRect; Bitmap: TBitmap; const Source: TRect; Color: TColor); procedure BrushCopy (objeto TRect, TBitmap, objeto TRect, TColor); Copia uma poro de um bitmap para um retngulo na tela, substituindo uma das cores do bitmap com a cor de preenchimento atual. Descrio: Use BrushCopy para conseguir efeitos especiais, como o de fazer a imagem ser copiada parcialmente transparente. Dest especifica a poro retangular da tela que receber a cpia do bitmap. Bitmap especifica o grfico (figura) que ser copiada. Source especifica a rea retangular de Bitmap para copiar. Color: especifica a cor do preenchimento em Bitmap que ser substitudo. Para usar BrushCopy para fazer a imagem copiada ficar parcialmente transparente, especifique a cor da superfcie da tela (clBackground por exemplo) como a cor da propriedade Brush, e ento chame BrushCopy. Exemplo: O grfico bitmap Aguilera.BMP carregado em Figura e mostrado no Canvas de Form1. BrushCopy substitui a cor preta (clBlack) no grfico (figura) pela cor da propriedade brush do canvas (clBtnFace = cor do formulrio). var Figura: TBitmap; Rec1:TRect; begin Rec1:= Rect(0,0,form1.Width,form1.Height); Figura := TBitmap.Create; Figura.LoadFromFile('D:\Danilo\aguilera.BMP'); Form1.Canvas.Brush.Color:= clBtnFace; Form1.Canvas.BrushCopy(Rec1, Figura, Rec1, clBtnHighlight); Figura.Free; end;

Observamos, no exemplo, o aparecimento do mtodo Create do objeto TBitMap, que possibilita a criao de um objeto deste tipo em tempo de execuo. Desta forma, podemos criar em tempo de execuo qualquer objeto, embora tenhamos que ter o cuidado de liberar o mesmo, aps sua utilizao, com o mtodo Free. procedure Chord(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer); Desenha uma figura fechada representada pela interseo de uma linha e uma elipse. Descrio: O Chord (corda) uma poro de uma elipse que est inscrita em um retngulo representado pelos pontos (X1,Y1) e (X2,Y2), canto superior esquerdo e canto inferior direito. A elipse seccionada por uma linha passa pelos pontos (X3,Y3) e (X4,Y4). O permetro do Chord percorre o sentido anti-horrio a partir do ponto (X3, Y3), indo ao ponto (X4,Y4) na elipse, e retorna ao ponto (X3,Y3). Se (X3,Y3) e (X4,Y4) no estiverem sobre a superfcie da elipse, os pontos considerados como limitadores de Chord sero a interseo da reta que passa por (X3,Y3) e (X4,Y4) com a elipse. A linha da corda utilizar os valores da propriedade Pen e o preenchimento utilizar os valores da propriedade Brush.

Nota: No Windows 95, a soma X1 + X2 e Y1 + Y2 no pode exceder 32768, assim como a soma X1 + X2 + Y1 + Y2.

No Windows NT, a direo do desenho pode ser alterada utilizando uma funo da API do Windows: SetArcDirection. Exemplo: procedure TForm1.FormClick(Sender: TObject); begin Canvas.Pen.Color:= clBlack; Canvas.Brush.Color:= clRed; Canvas.Chord(60, 50, 130, 150, 40, 50, 150, 100); end;

procedure CopyRect(Dest: TRect; Canvas: TCanvas; Source: TRect); Copia parte de uma imagem de um canvas para outro. Descrio: Use CopyRect para transferir parte da imagem de um outro Canvas para a imagem do objeto de Tcanvas atual. Dest especifica o retngulo na tela onde a imagem-fonte ser copiada. O parmetro Canvas especifica a imagem de fonte. Source especifica um retngulo que delimita a poro do Canvas da fonte que ser copiada. A poro do Canvas da fonte copiada usando o modo especificado em CopyMode. EX.: procedure TForm1.FormClick(Sender: TObject); var Figura: TBitmap; Rec: TRect; begin Rec:= Rect(0,0,form1.Width,form1.Height); Figura := TBitmap.Create; Figura.LoadFromFile('D:\Danilo\aguilera.BMP'); Form1.Canvas.CopyRect(Rec, Figura.Canvas, Rec); Figura.Free; end;

procedure Draw(X, Y: Integer; Graphic: TGraphic); Desenha o grfico especificado no parmetro Graphic na posio do ponto (X,Y), localizado no canto superior esquerdo da mesma. Descrio: Graphic pode ser bitmap, icon, ou metafile. Se o graphic um objeto TBitmap, o bitmap desenhado usando o valor de CopyMode. Ex. procedure TForm1.FormClick(Sender: TObject); var figura:Tbitmap; begin figura:=Tbitmap.Create; figura.LoadFromFile('D:\Danilo\aguilera.BMP'); form1.Canvas.Draw(0,0,figura); end;

procedure DrawFocusRect(const Rect: TRect); Desenha um retngulo no estilo atual para indicar que o objeto dentro do retngulo tem o foco.

Descrio: Deve ser chamado DrawFocusRect para o permetro de uma rea de imagem toda vez que o controle requer ou perde o foco. O DrawFocusRect usa uma funo ou-exclusivo (XOR) com a imagem e em seguida remove o retngulo da tela. O retngulo que esta funo desenha no pode ser movido. Para mover uma rea que contm um retngulo desenhado por DrawFocusRect, chame DrawFocusRect para remover o retngulo da tela, mova a rea, e ento chame DrawFocusRect para redesenhar o retngulo na nova posio.

procedure Ellipse(X1, Y1, X2, Y2: Integer); Desenha uma elipse definida pelo contorno de um retngulo. Descrio: A procedure Ellipse desenha um crculo ou uma elipse no canvas. O ponto (X1,Y1) representa o canto superior esquerdo e o ponto (X2,Y2) o canto inferior direito de um retngulo que circunscreve a elipse ou crculo. A elipse desenhada usando o valor de Pen, e preenchida usando o valor de Brush. Nota: No Windows 95, a soma X1 + X2 e Y1 + Y2 no pode exceder 32768, assim como tambm a soma X1 + X2 + Y1 + Y2. Ex.: form1.Canvas.Ellipse(10,10,300,300);

procedure FillRect(const Rect: TRect); Preenche o retngulo especificado no canvas usando o valor de brush atual. Descrio: A regio preenchida incluindo o topo e o lado esquerdo do retngulo, mas, exclui os lados inferior e direito.

procedure FloodFill(X, Y: Integer; Color: TColor; FillStyle: TFillStyle); Preenche uma rea do canvas usando o valor de brush atual. Descrio: type TFillStyle = (fsSurface, fsBorder); Use FloodFill para preencher uma regio possivelmente no-retangular da imagem com o valor de Brush. O regio preenchida a partir de um ponto (X,Y) situado dentro da regio at encontrar uma cor que envolva a regio. O parmetro FillStyle determina que tipo de cor define o contorno: FsSurface fsBorder Preenche toda a rea que tem a cor indicada pelo parmetro Color. Para quando uma cor diferente encontrada. Preenche toda a rea que NO tem a cor indicada pelo parmetro Color. Para quando a cor encontrada.

Use a propriedade Pixels para pegar a cor exata no ponto (X,Y) quando usar um FillStyle com o valor fsSurface. Da mesma forma, quando FillStyle fsBorder, use Pixels para pegar a cor exata do contorno se um ponto do mesmo for conhecido.

procedure LineTo(X, Y: Integer); Desenha uma linha no canvas a partir de PenPos at o ponto especificado por X e Y, e passa a considerar a nova posio da pena em (X, Y). Descrio: Use FloodFill para preencher uma regio possivelmente no-retangular da imagem com o valor de Brush. O regio preenchida a partir de um ponto (X,Y) situado dentro da regio at encontrar uma cor que envolva a regio. Exemplo: procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin Canvas.FillRect(ClientRect); //apaga toda a tela antes de desenhar a linha Canvas.MoveTo(0, 0); // coloca a pena na posio (0,0) Canvas.LineTo(X, Y); end;

procedure MoveTo(X, Y: Integer); Troca a posio da ltima posio da pena para a posio (X,Y). Descrio: Use MoveTo para atribuir o valor de PenPos antes de chamar LineTo. Chamar MoveTo o mesmo que alterar a propriedade PenPos.

procedure Pie(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Longint); Desenha um grfico de setor em uma elipse inscrita em um retngulo definido por (X1, Y1) e (X2, Y2). Descrio: A elipse definida pelo retngulo que a circunscreve determinado pelos pontos (X1, Y1) e (X2,Y2). O setor e determinado por duas linhas radiais saindo do centro da elipse e indo at os pontos (X3,Y3) e (X4,Y4). Tudo desenhado usando os valores definidos por Pen e Brush. Nota: No Windows 95, a soma X1 + X2 e Y1 + Y2 no pode exceder a 32768, assim como a soma X1 + X2 + Y1 + Y2.

procedure Rectangle(X1, Y1, X2, Y2: Integer); Desenha um retngulo definido por (X1, Y1) e (X2, Y2), onde o primeiro ponto representa o canto superior esquerdo e o segundo ponto, o canto inferior direito. procedure PolyBezier(const Points: array of TPoint); Desenha um conjunto de curvas de Bzier (curvas que passam por pontos). Descrio Use PolyBezier para desenhar uma seqncia de curvas de Bzier usando o ltimo ponto desenhado e pontos de controle especificados pelo parmetro de Points. A primeira curva desenhada do primeiro ponto ao quarto ponto, usando o segundo e terceiro pontos como pontos de controle. Cada curva subseqente na sucesso precisa de trs mais pontos exatamente: o ponto final da curva anterior usado como o ponto de partida da prxima, sendo que os dois pontos seguintes na sucesso so de controle, e o tereiro o ponto final; e assim sucessivamente:

Este procedimento desenha linhas utilizando a pen atual. Use a funo Slice (Fatia) para passar uma parte de vrios pontos para o mtodo de PolyBezier. Exemplo: para formar uma curva de Bzier que usa os primeiros dez pontos de um array de 100 pontos, use a funo Slice como segue: Canvas.PolyBezier(Slice(PointArray, 10));

procedure Polygon(Points: array of TPoint); Desenha uma srie de linhas, de acordo com o ltimo valor de Pen, conectando o ponto anterior com o seguinte e fechando o polgono ligando o ltimo ponto ao primeiro. Alm disso, preenche o interior do mesmo com as caractersticas de preenchimento do ltimo valor de Brush. Para desenhar polgonos sem preenchimento melhor usar o mtodo Polyline especificando o primeiro ponto e o segundo sucessivamente at o final. Use a funo Slice para passar uma parte dos pontos da array para o mtodo Polygon. Examplo: Para desenhar um polgono com os 10 primeiros pontos de um vetor de 100 pontos, use a funo Slice da seguinte forma: Canvas.Polygon(Slice(PointArray, 10));

procedure Polyline(Points: array of TPoint); Desenha uma srie de linhas com o valor corrente de pen conectando cada um dos pontos passados pelo parmetro Points. Se tivermos apenas 2 pontos, este mtodo desenhar uma simples linha. Chamando a funo MoveTo com o valor do primeiro ponto, e chamando repetidamente o mtodo LineTo com todos os pontos subseqentes, obteremos o mesmo desenho. Porm, utsando PolyLine no temos como mudar as caractersticas da linha para cada uma das partes desenhadas, o que pode ser feito u tilizando LineTo. Use a funo Slice para passar uma parte do vetor de pontos para o mtodo Polyline. Examplo: para conectar os primeiros 10 pontos de um vetor de 100 pontos usando a funo Slice faa da seguinte forma: Canvas.Polyline(Slice(PointArray, 10));

procedure Refresh;

Faz com que os valores selecionados para Pen, Brush, e Font retornem ao seu estado padro (default). Mas, os valores no so perdidos, ao chamar qualquer um dos mtodos de desenho depois de ter sido chamado o mtodo Refresh os valores destas 3 propriedades voltam aos valores anteriormente selecionados. procedure RoundRect(X1, Y1, X2, Y2, X3, Y3: Integer);

Desenha um retngulo com os cantos arredondados, usando os valores anteriores de Pen e de Brush. O retngulo definido pelas coordenadas do canto superior esquerdo (X1,Y1) e do canto inferior direito (X2,Y2) e um quarto de elipse definida pela largura X3 e altura Y3. Ex.: form1.Canvas.RoundRect(10,10,400,400,30,30); procedure Lock; Impede que outras linhas utilizem a tela, isto , o canvas no aceita mais nenhum desenho. Usa-se chamar Lock em aplicativos multitarefa para impedir que outras tarefas desenhem no canvas. Este travamento permanece at que o mtodo UnLock seja chamado. Depois de vrias tentativas de desenhar, os travamentos so aninhados e contados, sendo esta quantidade guardada na propriedade LockCount. Da, o canvas ser destravado somente depois que todas as tentativas de desenho forem destravadas.

For i:= 1 to Canvas.LockCount do Canvas.UnLock; Em aplicaes multi-tarefas que usam Lock para proteger uma tela, todas as chamadas que usam a tela devem ser protegidas por uma chamada a Lock. Qualquer tarefa que no proteger a tela antes de us-la causar erros. No use Lock indiscriminadamente, a menos que haja um perigo de que outra linha desenhada venha a interferir no desenho da tela. procedure StretchDraw(const Rect: TRect; Graphic: TGraphic ); Coloca a figura guardada no parmetro Graphic dentro do retngulo determinado por Rect. Corresponde propriedade Stretch dos objetos Image. Estas figuras podem ser bitmaps, icons, ou metafiles. Se a figura um TBitmap, o bitmap desenhado usando o valor de CopyMode. EX.: procedure TForm1.FormClick(Sender: TObject); var rec:Trect; figura:TBitmap; begin rec:=Rect(0,0,800,600); figura:=Tbitmap.Create; figura.LoadFromFile('D:\Danilo\aguilera.BMP'); form1.Canvas.StretchDraw(rec,figura); figura.Free; end;

function TextExtent(const Text: string): TSize; Esta funo retorna a largura e a altura, em pixels, de uma string desenhada com a fonte atual. type TSize = record cx: Longint; // largura cy: Longint; // altura end; Exemplo: Var TamFonte: Tsize; : : : TamFonte:= Form1.Canvas.TextExtent(M); ShowMessage(Largura da letra M = ,Inttostr(TamFonte.cx), Altura da letra M = ,InttoStr(TamFonte.cy); Use TextExtent para determinar o espao ocupado por um string na imagem. Outros elementos da imagem como linhas, retngulos, ou linhas adicionais de texto podem ser posicionadas de modo a respeitar o tamanho do texto. Para determinar somente a altura, chame TextHeight. Para determinar somente a largura, chame TextWidth.

function TextHeight(const Text: string): Integer; Retorna a altura, em pixels, de um string desenhado na fonte atual. TextHeight retorna o mesmo valor que TextExtent(Text).cy.

procedure TextOut(X, Y: Integer; const Text: string);

Escreve um string no canvas, partindo do ponto (X,Y), utilizando os valores da propriedade PenPos e Font at o final do string.

procedure TextRect(Rect: TRect; X, Y: Integer; const Text: string); Escreve um string dentro do espao definido por um retngulo. O que exceder ao espao do retngulo ser cortado. O canto superior esquerdo de onde o texto ser escrito definido pelas coordenadas (X, Y).

function TextWidth(const Text: string): Integer; Retorna a largura, em pixels, de um string desenhado na fonte atual. TextWidth returns the same value as TextExtent(Text).cx.

function TryLock: Boolean; Trava (Lock) o canvas se ele estiver destravado. Se o canvas estiver destravado, Trylock ir trav-lo, atribuindo o valor 1 para LockCount, e retornando o valor True. Se o canvas j estiver travado, Trylock retornar o valor False sem fazer nenhuma troca. Use TryLock antes de efetuar alteraes no canvas que possam interferir com outros cdigos de proteo realizados por um conjunto de Lock ... Unlock de outros mtodos.

procedure Unlock;

Decrementa o valor de LockCount, permitindo que outras linhas possam ser desenhadas quando este valor atingir o valor Zero. Para evitar problemas, sempre use um Unlock para cada Lock utilizado.