Você está na página 1de 14

PASCAL MODO GRAFICO

1.0 - Introduo No incio de todos os programas grficos existiro certos passos que devem ser seguidos. Por exemplo, temos que ajustar o hardware de vdeo para o modo grfico. Alm disso, temos de restaurar a tela do computador para o modo normal de exibio no final de todos os programas grficos. Na seo abaixo, veremos os componentes bsicos necessrios em um programa grfico tpico desenvolvido em Pascal.

1.1 - Inicializao da BGI O primeiro passo que todos os programas grficos devem dar inicializar o hardware grfico. Por hardware entendemos a placa do adaptador de vdeo que deve estar presente no PC. Existem diversas placas grficas diferentes disponveis para o PC, cada qual com uma variedade de modos grficos. A BGI (Borland Graphic Interface) oferece suporte a muitos destes "modos". Utilizaremos o modo default da rotina de inicializao da BGI, o que por sua vez nos permitir ajustar o adaptador grfico instalado no seu modo de maior resoluo. A procedure da BGI usada para configurar o seu computador no modo grfico chama-se InitGraph e possui a seguinte declarao: procedure InitGraph(var GraphDriver, GraphMode: integer; DriverPath: string); A procedure InitGraph est definida na unidade Graph do Pascal que deve ser includa na seo uses de todos os programas grficos. Este arquivo contm as estruturas de dados, constantes, procedures e funes da BGI. Os dois primeiros parmetros especificados em initgraph identificam a placa de vdeo instalada e o modo grfico a ser utilizado. O terceiro parmetro especifica o path onde se encontram os drivers para grfico do Turbo Pascal. (Existe pelo menos um driver grfico para cada adaptador grfico). Os arquivos dos drivers so os que terminam todos com a extenso .BGI . No prximo exemplo, InitGraph pesquisa o diretrio atual para encontrar os arquivos de drivers.: InitGraph(Gdriver, Gmode, ' ');

1.2 - Escrita de um Programa Bsico usando a BGI O programa a seguir provavelmente o menor programa grfico que podemos escrever em Turbo Pascal. Este programa apenas para enfatizar a estrutura bsica de um programa grfico tpico em Pascal. Podemos us-lo como esqueleto para nossos prprios programas grficos.

Program SmallestGraphicsProgram; Uses Graph; { unidade grfica do Turbo Pascal } Const Gdriver: integer = Detect; Var Gmode: integer; Begin InitGraph(Gdriver, Gmode, 'c:\bp\bgi'); { Inicializa o modo Grfico } { Coloque os comandos para desenho nesta rea !! } CloseGraph; { Finaliza o Modo Grfico } End.

A Tabela abaixo demonstra os drivers e suas respectivas resolues Valor CGAC0 CGAC CGAC2 CGAC3 CGAHi MCGAC0 MCGAC1 MCGAC2 MCGAC3 MCGAMed MCGAHi EGAMonoHi HercMonoHi VGALo VGAMed Resoluo Valor 320x200 EGALo 320x200 320x200 320x200 640x200 320x200 320x200 320x200 320x200 640x200 640x480 640x350 720x348 640x200 640x350 EGAHi EGA64Lo EGA64Hi ATT400C0 ATT400C1 ATT400C2 ATT400C3 ATT400Med ATT400Hi IBM8514Lo IBM8514Hi PC3270Hi VGAHi Resoluo 640x200 640x350 640x200 640x350 320x200 320x200 320x200 320x200 640x200 640x400 640x480 1024x768 720x350 640x480

2.0 - Trabalhando com coordenadas Nos grficos, acompanhamos as nossas posies usando coordenadas de pixels. Os pixels so pontos muitos pequenos que se v na tela e que podem ser endereados usando um sistema de coordenadas familiar forma por que acessamos as linhas e colunas de uma estrutura de dados bidimensional. O Turbo Pascal apresenta duas funes que obtm o nmero mximo de pixels tanto no eixo x (GetMaxX) quanto no eixo y (GetMaxY). Endereamento por linha e coluna da tela.

2.0 Comandos para Desenhos Declarao Procedure Arc (X,Y; Integer; StAngle, EndAngle, Radius; Word); O Arco vai desde StAngle (ngulo de incio) at EndAngle (ngulo final), com raio Radius usando (x,y) como ponto central.

Declarao Procedure Bar(x1, y1, x2, y2: Integer); Bar desenha um retngulo preenchido. Usa o preenchimento e cores definidos por SetFillStyle ou SetFillPattern. Para desenhar uma barra sem preenchimento, utiliza 3D.

Declarao Procedure Bar3D(x1, y1, x2, y2: Integer; Depth: Word; Top: Boolean); Bar3D desenha uma barra pintada e em trs dimenses usando o preenchimento e cores definidos por SetFillStyle ou SetFillPattern. A linha 3d da barra desenhada no estilo de linha corrente e cores como ajustados pelo SetLineStyle e SetColor. Depth a largura em pixeis da linha 3-D. Se Top for Topon (constante que significa true), um

topo 3-D colocado na barra, se Top for Topoff (constange que significa false) o topo no colocado na barra.

Declarao Procedure Circle(X,Y: Integer; Radius: Word); Desenha um crculo na cor corrente estabelecida por SetColor. Cada Driver Grfico contm um aspect raio usado por Circle, Arc e PieSlice.

Declarao Procedure ClearDevice; ClearDevice move a posio corrente para (0, 0), apaga a tela usando a cor de fundo estabelecida por SetBkColor, e prepara para sada de dados.

Declarao Procedure ClearViewPort; ClearViewPort aplica a cor de preenchimento para a cor de fundo (Palette[0]) e move a posio corrente para (0, 0).

Declarao Procedure CloseGraph; CloseGraph restaura o modo de vdeo utilizado antes da biblioteca grfica ser inicializada.

Declarao Procedure DetectGraph( Gdriver, Gmodo: integer); DetectGraph retorna o valor de driver e modo detectados que podem ser utilizados em InitGraph para inicializar o modo grfico usando o driver e modo corretos detectados para o hardware grfico instalado na mquina.

Declarao Procedure DrawPoly(NumPoints: word; var PolyPoints) DrawPoly desenha as linhas de um polgono a cor e estilo correntes de linha. NumPoints: especifica o nmero de pontos contidos na varivel PolyPoints. PolyPoints: uma varivel do tipo PointType. PointType = Record x, y: integer; End;

Declarao Procedure Ellipse(X,Y: integer; StAngle, EndAngle: Word; Xradius, Yradius: word); Desenha um arco elptico. Desenha o arco iniciando em Stangle at EndAngle com Xradius de Raio X e Yradius de Raio Y.

Declarao Procedure FillEllipse(x,y: integer; Xradius, Yradius: integer); Desenha uma elpse pintada. (x,y) o ponto central; Xradius e Yradius so os eixos horizontal e vertical respectivamente.

Declarao Procedure FillPoly(NumPoints: Word; var PolyPoints); Desenha um polgono preenchido com a cor e o estilo de preenchimento correntes. NumPoints: representa o nmero de pontos que formam o polgono. PolyPoints: varivel sem tipo que contm coordenadas de cada ponto. (Geralmente utilizada uma varivel do tipo PointType).

Declarao Procedure FloodFill(x,y: integer; border: Word); Preenche uma rea fechada iniciando em x,y e vai se alimentando at encontrar uma delimitao com cor diferente utilizando as configuraes correntes de preenchimento e pintura.

Declarao Function GetBkColor: Word; Retorna a cor de fundo de tela utilizada atualmente (Um valor de 0 a 15) no caso de um VGA.

Declarao Function GetColor: Word; Retorna a cor do pincel utilizada para desenhar linhas, etc. (Um valor de 0 a 15) no caso de um VGA.

Declarao Function GetDefaultPalette(var Palette: PaletteType);

Retorna as cores originais da paleta de cores para a varivel Palette do tipo PalleteType. Const Maxcolors = 15; PaletteType = Record Size: byte; Colors: array[0..MaxColors] of shortint; Declarao Function GetDriverName: String; Retorna uma string contendo o nome do driver atual utilizado para inicializar o modo grfico.

Declarao Function GetGraphMode: integer; Retorna um nmero que corresponde ao modo atual de vdeo utilizado pela biblioteca grfica. (Verificar Lista Pg. 2).

Declarao Procedure GetImage(x1, y1, x2, y2: integer; var BitMap); Salva a imagem bit a bit contida no espao x1, y1, x2, y2 e salva para um buffer (BitMap). Ex.: Var Size: Word; BitMap: Pointer; Begin ... size:= ImageSize(100, 100, 150, 150); { Retorna o n de bytes necessrios p/ guardar a imagem } getmem(BitMap, size); { Aloca essa quantia de memria } getimage(100, 100, 150, 150, BitMap); { salva a imagem } ... End.

Constante Valor CopyPut XorPut OrPut AndPut 0 1 2 3

Descrio Copia a imagem como se encontra Faz um xor da imagem com o contedo atual da tela Faz um or da imagem com o contedo atual da tela Faz um and da imagem com o contedo atual da tela

NotPut

Copia o inverso da imagem

Declarao Function GetLineSettings(var LineInfo: LineSettingsType); Retorna o estilo de linha corrente. LineSettingsType = Record LineStyle: Word; Pattern: Word; ThickNess: Word; End;

Declarao Function GetMaxColor: word; Retorna o n mximo de cores suportado pelo driver grfico atualmente utilizado.

Declarao Function GetMaxX: integer; Retorna o n mximo de pixels suportado pela resoluo X.

Declarao Function GetMaxY: integer; Retorna o n mximo de pixels suportado pela resoluo Y.

Declarao Function GetPalette(Palette: PaletteType); Retorna a paleta de cores utilizada atualmente e seu tamanho para uma varivel do tipo PaletteType.

Declarao Function GetPaletteSize: integer; Retorna o n mximo de cores suportado pela paleta de cores do modo grfico atual.

Declarao Function GetPixel(x,y: integer): word; Retorna a cor atual do pixel de coordenada (x,y).

Declarao Function GetTextSettings(var TextInfo: TextSettingsType); Retorna as configuraes atuais de texto (fonte, tamanho, etc) para uma varivel do tipo TextSettingsType. TextSettingsType = Record Font: Word; Direction: Word; CharSize: Word; Horiz: Word; Vert: Word; End;

Declarao Function GetX; Retorna a coordenada X a ser utilizada. (Posio X do Cursor).

Declarao Function GetY; Retorna a coordenada Y a ser utilizada. (Posio Y do Cursor).

Declarao Function ImageSize(x1, y1, x2, y2: integer): Word; Retorna o n de bytes necessrios para armazenar uma regio retangular delimitada por (x1, y1, x2, y2) na memria.

Declarao Procedure InitGraph(var gDriver: Integer, var gMode: Integer, PathtoDriver: String); Inicializa o modo grfico com o modo e driver especificados. necessrio tambm, especificar o caminho onde se encontram os drivers da BGI em PathtoDriver.

Declarao Procedure Line(x1, y1, x2, y2: integer); Desenha uma linha com as configuraes estabelecidas em SetLineStyle que vai do ponto 1(x1, y1) at o ponto 2(x2, y2).

Declarao Procedure LineRel(x1,y1: integer);

Desenha uma linha que vai desde a posio atual do cursor (x0, y0) at a posio (x0+x1), (y0+y1).

Declarao Procedure LineTo(x, y: integer); Desenha uma linha que vai desde a posio atual do cursor (x0, y0) at o ponto especificado (x,y).

Declarao MoveRel(Dx, Dy: integer); Move a posio atual do cursor (x0, y0) at a posio (x0+Dx, y0+Dy).

Declarao Moveto(x, y: integer); Move a posio atual do cursor (x0, y0) para a posio especificada (x,y).

Declarao OutText(TextString: String); Manda uma string para o dispositivo de Sada (Tela) na posio atual do cursor.

Declarao OutTextXY(x,y: integer; TextString: String); Manda uma string para o dispositivo de Sada (Tela) na posio especificada (x, y).

Declarao PieSlice(x, y: integer; StAngle, EndAngle, Radius: Word); Desenha e pinta uma pedao de torta com as coordenadas especificadas. (x,y) Ponto Central. Inicia com o ngulo StAngle e termina com o ngulo EndAngle.

Declarao PutImage(x,y: integer; var Bitmap; Bitblt: Word); (x, y) o canto superior esquerdo o qual a figura ser iniciada. Bitmap uma varivel sem tipo que contm a imagem a ser colocada na tela. BitBlt uma operao booleana a ser realizada na plotagem de cada pixel da

figura. BitBlt pode ser: NormalPut, OrPut, XorPut, NotPut ou AndPut.

Declarao PutPixel(x,y: integer; pixel: word); Desenha um pixel na coordenada especificada (x, y) com a cor pixel que uma word.

Declarao Rectangle(x1, y1, x2, y2: integer); Desenha um retngulo na rea retangular delimitada por (x1,y1) e (x2, y2) com os estilos de cor e linhas atuais.

Declarao Procedure SetAllPalette(var Palette); Altera todas as cores da paleta de cores para as especificadas na varivel Palette que pode ser do tipo PaletteType.

Declarao Function SetAspectRatio(xAsp, yAsp: integer): Word; O Aspect Ratio utilizado para desenhar crculos. Se diminuirmos o valor default, obteremos maior correo e preciso.

Declarao Procedure SetBkColor(ColorNum: Word); Altera a cor do fundo da tela para a cor especificada em ColorNum.

Declarao Procedure SetColor(Color: Word); Altera a cor de desenho usando a paleta de cores.

Declarao Procedure SetFillPattern(Patern: FillPatternType; Color: Word); Altera o estilo de preenchimento para um estilo definido pelo usurio FillPatternType = Array[1..8] of byte;

Padres de Preenchimento Pr-Definidos Constante EmptyFill SolidFill LineFill LtSlashFill SlashFill BkSlashFill LtBkSlashFill HatchFill XhatchFill InterleaveFill WideDotFill CloseDotFill Valor 0 1 2 3 4 5 6 7 8 9 10 11 Descrio Preenche com a cor de fundo Preenche completamente com a cor de preenchimento Preenche usando linhas horizontais Preenche usando linhas finas inclinadas Preenche usando linhas espessas inclinadas Preenche usando linhas espessas inclinadas da direita p/ a esquerda Preenche usando linhas finas inclinadas da direita p/ a esquerda Preenche usando um padro hachurado leve Preenche usando um padro xadrez espesso Preenche usando um padro formado por linhas intercaladas Preenche usando pontos largamente espaados Preenche usando pontos bastante prximos

Padres de Preenchimento Pr-Definidos

Declarao Procedure SetFillStyle(Pattern: Word; Color: Word); Altera a cor e estilo de preenchimento para um estilo j existente na BGI.

Declarao Procedure SetLineStye(LineStyle: Word; Pattern: Word; ThickNess: Word); Altera o estilo de preenchimento da linha. Estilos de Linhas Constante Valor SolidLn 0 DottedLn CenterLn DashedLn UserBitLn 1 2 3 4

NormalWidth Solidln DottedLn CenterLn DashedLn

ThickWidth

Declarao Procedure SetPalette(ColorNum: Word; Color: Shortint); Altera a entrada ColorNum da paleta de cores para a cor especificada em Color.

Declarao Procedure SetRgbPalette(ColorNum, RedValue, GreenValue, BlueValue: integer); Altera a cor localizada em ColoNum na paleta de cores com as coordenadas RGB (Red, Green, Blue) que correspondem um valor de 0 a 63 cada uma. RedValue

especifica a itensidade de Vermelho, GreenValue verde e BlueValue azul.

Declarao Procedure SetTextJustify(Horiz, Vert: Word); Altera os valores de justificao de texto usados por OutText e OutTextxy.

Declarao Procedure SetTextStyle(Font, Direction: Word; CharSize: Word); Altera o Estilo de Texto para sada no Dispositivo Grfico. (Isto inclui a Fonte e Tamanho das letras e se a Direo Vertical ou Horizontal).

Declarao Procedure SetViewPort(x1, y1, x2, y2: integer; Clip: Boolean); Altera os limites da rea grfica atravs de uma rea retangular. Semelhante ao procedimento Window no modo texto, mas seu funcionamento s ocorre no modo grfico. O parmetro clip especifica se os comandos grficos que desenham algo na tela obedecero as coordenadas (x1, y1) como sendo (0,0) ou no. Obs.: Caso no, tudo o que sair fora do limite de SetViewPort ser cortado e no aparecer na tela. Caso for True, o desenho ser cortado, seno ser transportado para as novas coordenadas

Declarao Procedure SetVisualPage(Page: Word); Altera o n de pgina utilizada atualmente no modo Grfico. Mltiplas pginas so suportadas apenas de EGA com 256 Kb ou mais. Obs.: Utilizada para criar animaes grficas.

Declarao Procedure SetWriteMode(WriteMode: integer); Altera o modo de desenhar linhas na tela. Afeta as chamadas dos seguintes Procedimentos: DrawPoly, Line, LineRel, LineTo e Retngulo.

Declarao Function TextHeight(TextString: String): Word; Retorna a altura de uma string em pixels (Leva em considerao o tamanho e estilo da fonte).

Declarao Function TextWidth(TextString: String): Word; Retorna a largura de uma string em pixels (Leva em considerao o tamanho e estilo da fonte).