Está en la página 1de 20

VISUAL BASIC 5.

0 1

6. GRFICOS
USANDO CONTROLE GRFICOS

Controles grficos so criados a partir da Caixa de Ferramentas e so visveis em tempo de projeto e


de execuo (desde que a propriedade visible seja verdadeira). Existem dois controles deste tipo: Line, usado
para desenhar linhas retas, e Shape, usado para desenhar quadrados, retngulos e crculos.

As propriedades principais de uma linha desenhada com Line so as coordenadas dos dois extremos:
X1, Y1, X2 e Y2. Objetos criados com shape tm as propriedades Left, Width, Top e Height.

O mtodo Move, visto anteriormente, s se aplica a objetos criados com a caixa de ferramentas.

Exemplo: O cdigo abaixo move uma linha aleatoriamente pela tela, variando as propriedades X1, Y1,
X2 e Y2.

Private Sub Timer1_Timer


linLinha.X1 = Rnd*ScaleWidth
linLinha.Y1 = Rnd*ScaleHeight
linLinha.X2 = Rnd*ScaleWidth
linLinha.Y2 = Rnd*ScaleHeight
End Sub

Figura 12 - Uma linha saltitante

A funo Rnd retorna nmeros aleatrios entre zero e um. Para gerar nmeros aleatrios entre 0 e a
mxima coordenada, multiplicamos Rnd pela largura da tela ou altura, conforme a coordenada seja X ou Y,
respectivamente.

USANDO EVENTOS DE MOUSE

Existem trs eventos de mouse que podem ser capturados para realizar aes:

MouseDown: Ocorre quando o mouse pressionado sobre um objeto;


MouseUp: Ocorre quando o mouse liberado sobre um objeto;
MouseMove: Ocorre quando o mouse se move sobre um objeto.

Anotaes:

SETEMBRO/1998
AAA
VISUAL BASIC 5.0 2

Todos estes eventos passam quatro parmetros para as respectivos procedimentos de eventos:
Button, Shift, X e Y. Button representa o boto que foi pressionado (1 para o boto esquerdo, 2 para o boto
direito e 4 para o do meio, se houver). Shift representa o estado das teclas Shift, Ctrl e Alt durante o evento,
de acordo com a tabela abaixo.

Tabela 17

Shift Descrio
1 Shift pressionada
2 Ctrl pressionada
4 Alt pressionada

Os parmetro Button e Shift tambm admite combinaes. Por exemplo, Shift = 3 siginifica as teclas
Shift e Ctrl pressionadas.

Finalmente, X e Y representam as coordenadas do mouse durante o evento.

USANDO MTODOS GRFICOS

Os controles desenhados a partir da Caixa de Ferramentas nem sempre se prestam aos objetivos de
um programa grfico. Por exemplo, para desenhar pontos ou um grande nmero de linhas devemos usar
mtodos grficos e no controles. Mtodos so muito mais versteis e rpidos e no precisam estar presentes
em tempo de projeto.

Para desenhar pontos em um objeto grfico (formulrio, caixa de figuras ou controle de imagens) use o
mtodo PSet, cuja sintaxe a seguinte:

[Objeto.] PSet (X, Y) [,Cor],

onde X e Y so as coordenadas do objeto onde o ponto deve ser desenhado. O parmetro Cor opcional.
Se no for especificado, o ponto ser desenhado usando-se a ForeColor do objeto. Da mesma forma, o
tamanho do ponto pode ser definido pela propriedade DrawWidth do objeto.

Para desenhar linhas retas, use o mtodo Line,

[Objeto.] Line [(X1, Y1)] - (X2, Y2) [,Cor],

onde a linha ser desenhada das coordenadas X1 e Y1 at X2 e Y2. Observe que X1 e Y1 so opcionais. Se
forem omitidas, o mtodo Line desenhar uma linha da posio grfica atual at (X2, Y2). A posio grfica
atual pode ser obtida por meio das propriedades CurrntX e CurrentY dos objetos grficos. As mesmas
observaes feitas sobre cores e espessuras de pontos aplicam-se a linhas. Adicionalmente, a propriedade
DrawStyle do objeto grfico permite determinar o estilo da linha (cheia, tracejada, etc).

Para desenhar retngulos, preenchidos ou no, use o mtodo Line com o parmetro B (de Box),

[Objeto.] Line [(X1, Y1)] - (X2, Y2) [,Cor], B.

A propriedade FillStyle do objeto grfico no qual o retngulo estiver sendo desenhado permitir
preencher o mesmo com um determinado padro, que pode ser slido, tracejado, etc. A propriedade FillColor
determinar a cor do preenchimento.

Anotaes:

SETEMBRO/1998
AAA
VISUAL BASIC 5.0 3

Para desenhar crculos, elipses ou arcos de crculos, use o mtodo Circle,

[Objeto.] Circle (X, Y), Raio, [Cor], [Incio], [Fim], [Aspecto],

onde X e Y so as coordenadas do centro do crculo. Incio e Fim so ngulos opcionais, expressos em


radianos que representam a abertura de arcos de circunferncia (quando for o caso). Aspecto mede a relao
de aspecto de uma elipse. Para crculos perfeitos, Aspecto = 1. Note-se que as vrgulas no so opcionais.

CARREGANDO E SALVANDO FIGURAS

No Visual Basic, somente figuras desenhadas com AutoRedraw = true podem ser salvas. Alm disso, a
propriedade LinkMode for formulrio que contm a figura a ser salva deve estar em Source.

Para carregar figuras em um objeto, use as duas linhas a seguir, que especificam a funo
LoadPicture,

Picture = LoadPicture (Nome_do_Arquivo)


[Objeto.]Picure = LoadPicture (Nome_do_Arquivo).

A sintaxe pode parecer estranha, mas assim mesmo. O arquivo pode ser do tipo Bitmap (*.bmp),
Windows MetaFile (*.wmf) ou Device Independent Bitmap (*.dib).

Para salvar imagens grficas, use o comando SavePicture,

SavePicture [Objeto.Picture, Nome_do_Arquivo.

UM EDITOR DE FIGURAS

Nosso recm-adquiridos conhecimentos sobre variveis e mtodos grficos podem ser usados para
implementar um editor de figuras, com capacidade para editar, gravar e abrir arquivos do tipo .BMP. Vamos
aproveitar a oportunidade para implementar tambm um controle do tipo Barra de Ferramentas, usando os
controles ToolBar e ImageList.

ToolBar: Este controle usado para mostrar botes que correspondem a itens do menu do
aplicativo, provendo uma interface grfica para os comandos mais usuais. Cada boto pode ter uma
imagem associada, proveniente de uma ImageList. Para iniciar uma barra de ferramentas voc deve
antes disponibilizar os controles Microsoft Windows Common Controls (COMCTL32.OCX) na caixa
de ferramentas. Depois, posicione o controle em um formulrio e, clicando com o boto direito do mouse,
escolha a opo properties. Nesta janela, escolha a opo Buttons para inserir tantos botes quantos forem
necessrios. Note que estes botes podem ser de vrios tipos:

tbrDefault: este boto no permanece acionado aps o clique, sendo o boto utilizado para
opes de salvar ou abrir arquivo, por exemplo;
tbrCheck: este boto permanece acionado aps o clique independente do estado dos outros
botes da barra;

Anotaes:

SETEMBRO/1998
AAA
VISUAL BASIC 5.0 4

tbrButtonGroup: use esta opo para implementar botes de opo do tipo botes de rdio,
onde apenas um dos botes do grupo que tem a propriedade tbrButtonGroup pode
permanecer acionado;
tbrSeparator: este no propriamente um boto, mas sim um separador com largura de oito
pixels, usado geralmente para separar grupos de botes com diferentes funes;
tbrPlaceHolder: este boto igual ao separador, mas tem largura ajustvel.

Voc deve, tambm, modificar a propriedade Key de cada um dos botes. Esta propriedade um
string que descreve a funo do boto (por exemplo, salvar, imprimir, etc). Isto necessrio porque o
evento padro dos botes, ButtonClick, passa o parmetro Key do boto que foi clicado. Voc pode usar este
parmetro e o comando Select ... Case para atribuir um cdigo a cada um dos botes. No interesante usar
ndices aqui, pois o usurio pode reconfigurar a barra de ferramentas em tempo de execuo, mudando os
ndices.

Voc tambm pode atribuir imagens aos botes, mas, antes disso, ser necessrio inserir um controle
ImageList que conter tais imagens, conforme visto a seguir.

ImageList: Este controle simplesmente um depsito de imagens .BMP ou .ICO Comece


posicionando este objeto no formulrio, clicando o boto direito do mouse e escolhendo a opo
properties. As imagens podem ser inseridas escolhendo-se a opo Images. Note que o ndice das
imagens incrementado automaticamente a medida que estas vo sendo inseridas.

Volte, agora, para as propriedades da barra de ferramentas. Na opo General, associe a ImageList
barra de ferramentas. A seguir, use a opo Buttons para associar uma imagem da ImageList a cada um
dos botes.

Voc tambm pode configurar a propriedade Align da barra de ferramentas para obter uma barra de
ferramentas vertical ou alinhada na parte de baixo do formulrio.

O Applications Wizard do VB 5.0 pode ser usado para produzir esqueletos de aplicativos que
contm barras de ferramentas prontas para serem usadas, juntamente com a ImageList e todas as
imagens adequadas. Para usar este assistente, clique sobre o menu File|New Project, escolha a
opo VB Applications Wizard e siga as instrues. Os botes da barra de ferramentas que
formada correspondem aos comandos de um editor de textos simples e podem ser configuradas
conforme a necessidade do usurio.

Anotaes:

SETEMBRO/1998
AAA
VISUAL BASIC 5.0 5

Para iniciar o Editor de Figuras, insira um novo projeto e posicione os seguintes objetos sobre o
formulrio:

duas Caixas de Figuras (Picture Box);


duas Barras de Ferramentas;
duas Listas de Imagens;
um Common Dialog;
um painel;
uma barra de paginao vertical;
uma barra de paginao horizontal.

Configure as propriedades deste controles conforme a tabela 18 a seguir:

Tabela 18 - Definies das propriedades

Controle Propriedade Definio


Formulrio Name frmPaint
LinkMode Source
ScaleMode Pixel
WindwoState Maximized
Barra de Ferramentas Name tblVert
Top 420
Left 0
Width 750
Height 4380
ImageList imlVert
Barra de Ferramentas Name tblHoriz
Top 0
Left 0
Width 4830
Height 420
ImageList imlHoriz
Lista de Imagens Name imlVert
Lista de Imagens Name imlHoriz
Caixa de Figuras Name picPaint
Height 3975
Left 300
Top 240
Width 6975
ScaleMode Pixel
Painel Name panColor
Height 495
Left 0
Top 5700
Width 9585
Barra de Paginao Horizontal Name hsbHoriz
Height 4935

Anotaes:

SETEMBRO/1998
AAA
VISUAL BASIC 5.0 6

Tabela 18 (continuao)

Controle Propriedade Definio


LargeChange 600
Left 9300
Max 10000
Min 1
SmallChange 60
Barra de Paginao Vertical Name vsbVert
Height 255
LargeChange 500
Left 780
Max 15000
Min 1
SmallChange 50

Note que a caixa de figuras picFrame deve ser inserida antes da caixa picPaint, pois esta ltima estar
contida na primeira. Alm dos objetos mencionados, voc deve posicionar doze caixas de figuras dentro do
painel panColor, da seguinte forma:

desenhe, antes, uma pequena caixa de figuras e renomeie-a para picShowFillColor. Esta caixa ir
mostra a cor atual de preenchimento de figuras fechadas;
dentro de picShowFillColor, desenhe outra caixa de figuras, menor ainda, e renomeie-a para
picShowForeColor. Esta caixa ir mostra a cor atual de desenho;
ao lado de picShowFillColor desenhe dez caixas de figuras, conforme mostrado na figura 13. Estas
caixas devem ser criadas como um array de controles e tero todas o mesmo nome (picColor), com
ndices variando de zero at nove. A posio e as cores destas caixas sero configuradas
automaticamente durante o evento Activate de frmPaint.

Os botes das barras de ferramentas podem ser inseridos da forma j explicada, com as seguintes
observaes:

os botes ativos de tblHoriz so todos no estilo tbrDeafault, com exceo dos separadores;
os botes de tblVert so todos no estilo tbrButtonGroup.
as imagens para as duas Listas de Imagens podem ser buscadas nos diretrios
BITMAPS\TLBR_W95 e ICONS\WRTING. Estes diretrios acompanham o Visual Basic e tero sido
instalados se voc tiver escolhido a instalao completa ou, se na instalao personalizada, tiver
escolhido a opo de inatalar cones e bitmaps.

Observao: Dependendo do tipo de monitor, os valores das propriedades descritas na tabela 18 podem no
reproduzir os efeitos mostrados na figura 13. Neste caso, defina as propriedades, especialmente Left, Top,
Width e Height de modo a obter uma aparncia semelhante da figura 13.

Anotaes:

SETEMBRO/1998
AAA
VISUAL BASIC 5.0

Figura 13 - O formulrio frmPaint

Anotaes:

panColor

SETEMBRO/1998
AAA
VISUAL BASIC 5.0

vsbVert
picPaint

tblHoriz
imlHoriz

picFrame
tblVert

imlVert
Common Dialog 1

picShowFillColor & picShowForeColor hsbHoriz

picColor (1) a (10)


A primeira procedure a ser implementada diz respeito ao evento Activate de frmPaint. Para
tanto, ser necessrio introduzir um mdulo de programao e definir as seguintes variveis
pblicas (seo General-Declarations):

Option Explicit
Public FlagFormaLivre As Boolean
Public FlagDesenho As Boolean
Public FlagLinha As Boolean
Public FlagRetngulo As Boolean
Public FlagElipse As Boolean
Public FlagApagar As Boolean
Public FlagTexto As Boolean
Public FlagCortar As Boolean
Public FlagTrava
Public ColorIndex As Single

Anotaes:

SETEMBRO/1998

AAA
VISUAL BASIC 5.0

Public MyFill As Single


Public MyFillColor As Long
Public FileName As String
Type ColorPalette
ColorValue As Long
End Type
Public NovaPaleta(0 To 9) As ColorPalette

As primeiras variveis so flags que sero usados posteriormente. ColorIndex varivel


que indicar qual a cor selecionada. MyFill e MyFillColor sero usadas na definio do padro de
preenchimento. FimeName o nome do arquivo .BMP a ser aberto. ColorPalette uma varivel
definida pelo usurio que ser usada para armazenar os valores das cores da paleta de cores.

Para inicializar propriedades de controles devemos usar o evento Activate de frmPaint.


Este evento ocorre aps o evento Load e indica que o fromulrio est ativo e visvel. Se
tentssemos modificar propriedades de controles, especialmente propriedades grficas, durante o
evento Load, poderamos ter problemas com a visibilidade destes controles. Inicie a
implementao do evento Form_Activate carregando valores de cores pr-determinadas na
varvel NovaPaleta(). Isto feito com auxlio da funo RGB(), que retorna um inteiro longo
correspondente a uma cor composta de uma parte de vermelho, uma parte de verde e uma parte
de azul. Os valores destas partes podem variar de zero (intensiade nula) at 255 (saturao total
da cor).

Nota. A funo RGB() compe cores a partir das chamadas cores bsicas aditivas (vermelho,
verde e azul). Em desenhos feitos com tintas, como em aquarelas, as cores bsicas so o
vermelho, o azul e o amarelo, sendo denominadas cores bsicas subtrativas. Se voc colocar um
pintor e um programador para conversar sobre cores, talvez d origem a uma grande briga sobre
cores bsicas !

Depois de criadas as cores, devemos atribu-las s caixas de cores picColor, o que feito
com um pequeno lao For ... Next.

Private Sub Form_Activate()


NovaPaleta(0).ColorValue = RGB(255, 0, 0)
NovaPaleta(1).ColorValue = RGB(128, 0, 0)
NovaPaleta(2).ColorValue = RGB(255, 128, 0)
NovaPaleta(3).ColorValue = RGB(0, 128, 0)
NovaPaleta(4).ColorValue = RGB(0, 128, 64)
NovaPaleta(5).ColorValue = RGB(0, 0, 255)
NovaPaleta(6).ColorValue = RGB(0, 0, 160)
NovaPaleta(7).ColorValue = RGB(128, 0, 128)
NovaPaleta(8).ColorValue = RGB(128, 0, 255)
NovaPaleta(9).ColorValue = RGB(0, 0, 0)

For dummy = 0 To 9
picColor(dummy).BackColor = NovaPaleta(dummy).ColorValue
Next dummy
.
.
.

Anotaes:

SETEMBRO/1998

AAA
VISUAL BASIC 5.0

End Sub

O prximo passo acertar as bordas das caixas que compem a paleta de cores. Primeiro,
calculamos o espao que existe para mostra a paleta, descontando a largura de picShowFillColor
da largura do formulrio e dividindo o nmero resultante por 10. Depois, acertamos as
propriedades Left e Width de cada uma das caixas picColor.

Private Sub Form_Activate()


.
.
.picShowFillColor.Left = 0
picColor(0).Width = (frmPaint.Width - picShowFillColor.Width) / 10
picColor(0).Left = picShowFillColor.Width
For dummy = 1 To 9
picColor(dummy).Width = picColor(0).Width
picColor(dummy).Left = picColor(dummy - 1).Left + picColor(dummy - 1).Width
picColor(dummy).Visible = True
Next
picColor(0).Visible = True
.
End Sub

Para concluir a procedure, inicializamos os demais controles e algumas variveis.

Private Sub Form_Activate()


.
.
frmPaint.picPaint.ForeColor = RGB(0, 0, 255)
MyFillColor = RGB(255, 255, 255)
MyFill = 1
picShowForeColor.BackColor = RGB(0, 0, 255)
picShowFillColor.BackColor = RGB(255, 255, 255)

FillOption = 1
FlagFormaLivre = True

tblVert.Width = tblVert.ButtonWidth * 1.055


tblVert.ButtonHeight = tblVert.ButtonWidth
tblVert.Height = tblVert.ButtonHeight * 8.15

picPaint.Top = 0
picPaint.Left = 0
vsbVert.Max = picPaint.Width
hsbHoriz.Max = picPaint.Height
vsbVert.LargeChange = vsbVert.Max / 5
hsbHoriz.LargeChange = hsbHoriz.Max / 5
vsbVert.SmallChange = vsbVert.Max / 50
hsbHoriz.SmallChange = hsbHoriz.Max / 50
End Sub

Anotaes:

SETEMBRO/1998

AAA
VISUAL BASIC 5.0

As prximas procedures a serem implementadas dizem respeito aquisio de cores


quando o usurio clica sobre a paleta. Para tanto, iremos convencionar que um clique com o boto
esquerdo sobre uma das caixas define a cor de desenho, enquanto um clique com o boto direito
define a cor de preenchimento de objetos fechados. Devemos usar os eventos MouseUp ou
MouseDown, pois o evento Click no diferenciaria os botes. Optamos por usar MouseUp, dando
uma chance ao usurio de se arrepender, podendo mover o cursor para fora da caixa, evitando
que a cor seja mudada.

Se o usurio clicar com o boto esquerdo, atribumos a cor da caixa escolhido cor de
desenho (ForeColor) do formulrio e cor de fundo (BackColor) de picShowForeColor. Para indicar
qual a caixa selecionada atualmente, mudamos a propriedade BorderSyle para 1 (Fixed Single),
enquanto as bordas das outras nove caixas sero definidas em 0 (None).

Private Sub picColor_MouseUp(index As Integer, Button As Integer, Shift As


Integer, X As Single, Y As Single)
If Button = 1 Then
frmPaint.picPaint.ForeColor = picColor(index).BackColor
picShowForeColor.BackColor = picColor(index).BackColor
For dummy = 0 To 9
picColor(dummy).BorderStyle = 0
Next
picColor(index).BorderStyle = 1
ColorIndex = index
End If
If Button = 2 Then
MyFillColor = picColor(index).BackColor
picShowFillColor.BackColor = picColor(index).BackColor
End If
End Sub

Se o usurio clicar com o boto direito, atribmos a cor da caixa selecionada varivel
MyFillColor e cor de fundo de picShowFillColor.

Antes de implementar a maquinaria para abrir e salvar arquivos de imagem e arquivos de


paleta, devemos ter alguma coisa desenhada. As ferramentas de desenho esto representadas na
barra de ferramentas vertical e tm as seguintes funes:

Anotaes:

SETEMBRO/1998

AAA
VISUAL BASIC 5.0

Usaremos o evento ButtonClick da barra de ferramentas para definir um flag que indicar
qual o boto selecionado no momento. Note que usamos a instruo Select Case para verificar
qual o boto clicado, mas a clusula Case foi substituda por Case Is, pois se trata de um objeto
boto.

Private Sub toolVert_ButtonClick(ByVal Button As Button)


FlagFormaLivre = False
FlagDesenho = False
FlagLinha = False
FlagRetngulo = False
FlagElipse = False
FlagTexto = False
FlagApagar = False
FlagTrava = False
FlagCortar = False
Select Case Button.Key
Case Is = "Forma Livre"
FlagFormaLivre = True
Case Is = "Linha"
FlagLinha = True
Case Is = "Retngulo"
FlagRetngulo = True
Case Is = "Elipse"
FlagElipse = True
Case Is = "Apagar"
FlagApagar = True
Case Is = "Desenho"
FlagDesenho = True
Case Is = "Texto"
FlagTexto = True
Case Is = "Cortar"
FlagCortar = True
End Select
End Sub

Para implementar as procedures de desenho, comearemos pelas mais fceis. Em


primeiro lugar, desenhar a mo livre muito fcil. Basta desenhar uma linha que vai da posio
grfica atual at a posio definida pelas coordenadas (X, Y) do evento MouseMove.

Private Sub picPaint_MouseMove(Button As Integer, Shift As Integer, X As


Single, Y As Single)
.
.
If Button = 1 Then
If FlagDesenho Then
picPaint.Line -(X, Y)
End If
.
.
End If

Anotaes:

SETEMBRO/1998

AAA
VISUAL BASIC 5.0

End Sub

As procedures para desenhar linhas, retngulos, crculos e elipses elsticas so parecidas.


Denominamos figuras elsticas quelas figuras que podem ser esticadas pela tela com o mouse,
sendo fixadas quando o usurio libera o boto. O que precisamos fazer, inicialmente, usar o
evento MouseDown para fixar uma ncora na tela. A seguir, no evento MouseMove, mudamos o
modo de desenho para XOR e a proriedade ForeColor para o mesmo valor de BackColor. Desta
forma, quando desenhamos uma linha sobre ela mesma obtemos o desenho anterior ao primeiro
desenho. O efeito final ser da linha sendo apagada. Portanto, no evento MouseMove a linha
dever ser desenhada duas vezes a cada evento, aparecendo em preto do primeiro e sendo
apagada no segundo. Finalmente, usamos o evento MouseUp para fixar a linha ou figura na
posio definitiva.

Private Sub picPaint_MouseDown(Button As Integer, Shift As Integer, X As


Single, Y As Single)
If (Button = 1) Then 'Boto esquerdo
ncoraX = X 'Fixa ncora X
ncoraY = Y 'Fixa ncora Y
If FlagTrava = False Then
CurrentX = X
CurrentY = Y
IncioX = X
IncioY = Y
End If
If FlagFormaLivre Then
FlagTrava = True
End If
End If
End Sub

As variveis ncoraX, ncoraY, IncioX e IncioY so pblicas e devem ser definidas no


mdulo Paint.bas. A procedure completa do evento MouseMove a seguinte.

Private Sub picPaint_MouseMove(Button As Integer, Shift As Integer, X As


Single, Y As Single)
Dim Aspecto As Single
Aspecto = 1
If Button = 1 Then
If FlagDesenho Then
picPaint.Line -(X, Y)
End If

If FlagFormaLivre Then
TempFore = picPaint.ForeColor
TempMode = picPaint.DrawMode
picPaint.ForeColor = picPaint.BackColor
picPaint.DrawMode = 7 'Modo XOR
picPaint.Line (ncoraX, ncoraY)-(CurrentX, CurrentY)
picPaint.Line (ncoraX, ncoraY)-(X, Y)

Anotaes:

SETEMBRO/1998

AAA
VISUAL BASIC 5.0

picPaint.ForeColor = TempFore
picPaint.DrawMode = TempMode
CurrentX = X
CurrentY = Y
End If

If FlagLinha Then
TempFore = picPaint.ForeColor
TempMode = picPaint.DrawMode
picPaint.ForeColor = picPaint.BackColor
picPaint.DrawMode = 7 'Modo XOR
picPaint.Line (ncoraX, ncoraY)-(CurrentX, CurrentY)
picPaint.Line (ncoraX, ncoraY)-(X, Y)
picPaint.ForeColor = TempFore
picPaint.DrawMode = TempMode
CurrentX = X
CurrentY = Y
End If

If FlagRetngulo Then
TempFore = picPaint.ForeColor
TempMode = picPaint.DrawMode
picPaint.ForeColor = picPaint.BackColor
picPaint.DrawMode = 7 'Modo XOR
If FormaPerfeita = True Then
picPaint.Line (ncoraX, ncoraX)-(CurrentX, CurrentX), , B
picPaint.Line (ncoraX, ncoraX)-(X, X), , B
Else
picPaint.Line (ncoraX, ncoraY)-(CurrentX, CurrentY), , B
picPaint.Line (ncoraX, ncoraY)-(X, Y), , B
End If
picPaint.ForeColor = TempFore
picPaint.DrawMode = TempMode
CurrentX = X
CurrentY = Y
End If

If FlagElipse Then
TempFore = picPaint.ForeColor
TempMode = picPaint.DrawMode
picPaint.ForeColor = picPaint.BackColor
picPaint.DrawMode = 7 'Modo XOR
If FormaPerfeita = True Then
Aspecto = Abs(ncoraY - CurrentY) / Abs(ncoraX - CurrentX)
Else
Aspecto = 1
End If
raio = Sqr((ncoraX - CurrentX) ^ 2 + (ncoraY - CurrentY) ^ 2)
picPaint.Circle (ncoraX, ncoraY), raio, , , , Aspecto
If FormaPerfeita = True Then

Anotaes:

SETEMBRO/1998

AAA
VISUAL BASIC 5.0

Aspecto = Abs(ncoraY - Y) / Abs(ncoraX - X)


Else
Aspecto = 1
End If
raio = Sqr((ncoraX - X) ^ 2 + (ncoraY - Y) ^ 2)
picPaint.Circle (ncoraX, ncoraY), raio, , , , Aspecto
picPaint.ForeColor = TempFore
picPaint.DrawMode = TempMode
CurrentX = X
CurrentY = Y
End If

If FlagApagar Then
TempFore = ForeColor
TempMode = DrawMode
TempWidth = DrawWidth
picPaint.ForeColor = picPaint.BackColor
picPaint.DrawMode = 13 'Modo Copy
picPaint.DrawWidth = 30
picPaint.PSet (X, Y), picPaint.ForeColor
picPaint.ForeColor = TempFore
picPaint.DrawMode = TempMode
picPaint.DrawWidth = TempWidth
End If

If FlagCortar Then
TempFore = picPaint.ForeColor
TempMode = picPaint.DrawMode
TempStyle = picPaint.DrawStyle
TempWidth = picPaint.DrawWidth
picPaint.DrawStyle = 2
picPaint.ForeColor = picPaint.BackColor
picPaint.DrawMode = 7 'Modo XOR
picPaint.DrawWidth = 1
picPaint.Line (ncoraX, ncoraY)-(CurrentX, CurrentY), , B
picPaint.Line (ncoraX, ncoraY)-(X, Y), , B
picPaint.ForeColor = TempFore
picPaint.DrawMode = TempMode
picPaint.DrawStyle = TempStyle
picPaint.DrawWidth = TempWidth
CurrentX = X
CurrentY = Y
End If
End If
End Sub

Finalmente, a procedure completa do evento MouseUp fica da seguinte forma:

Anotaes:

SETEMBRO/1998

AAA
VISUAL BASIC 5.0

Private Sub picPaint_MouseUp(Button As Integer, Shift As Integer, X As Single, Y


As Single)
Dim Aspecto As Single
If Button = 1 Then
If FlagFormaLivre Then
picPaint.Line (ncoraX, ncoraY)-(X, Y)
If Abs(IncioX - X) < 10 Then
picPaint.Line (IncioX, IncioY)-(X, Y)
CurrentX = X
CurrentY = Y
FlagTrava = False
End If
End If

If FlagLinha Then
picPaint.Line (ncoraX, ncoraY)-(X, Y)
End If

If FlagRetngulo Then
picPaint.FillStyle = MyFill
picPaint.FillColor = MyFillColor
If FormaPerfeita = True Then
picPaint.Line (ncoraX, ncoraX)-(X, X), , B
Else
picPaint.Line (ncoraX, ncoraY)-(X, Y), , B
End If
End If

If FlagElipse Then
picPaint.FillStyle = MyFill
picPaint.FillColor = MyFillColor
If FormaPerfeita = True Then
Aspecto = Abs(ncoraY - Y) / Abs(ncoraX - X)
Else
Aspecto = 1
End If
raio = Sqr((ncoraX - X) ^ 2 + (ncoraY - Y) ^ 2)
picPaint.Circle (ncoraX, ncoraY), raio, , , , Aspecto
End If

If FlagCortar Then
picPaint.FillStyle = 0
picPaint.FillColor = picPaint.BackColor
picPaint.ForeColor = picPaint.BackColor
picPaint.Line (ncoraX, ncoraY)-(X, Y), , B
FlagCortar = False
End If
picPaint.FillStyle = MyFill
picPaint.FillColor = MyFillColor
picPaint.ForeColor = TempFore

Anotaes:

SETEMBRO/1998

AAA
VISUAL BASIC 5.0

End If
FormaPerfeita = False
End Sub

A diferena entre desenho de crculos e elipses, por um lado, e quadrados perfeitos e


retngulos de outro lado , como usual, ditada pela tecla CTRL. Se esta tecla estiver pressionada
quando o usurio escolhe a ferramenta, o desenho ser uma forma perfeita (crculo ou quadrado).
Caso a tecla CTRL no seja pressionada, o desenho ser livre (elipse ou retngulo). Iremos
capturar o evento KeyDown para definir a varivel FormaPerfeita - que voc deve declarar como
Public em Paint.bas - em verdadeiro ou falso, conforme o caso.

Private Sub picPaint_KeyDown(KeyCode As Integer, Shift As Integer)


Dim a As String
a = Asc(KeyCode)
If a = 49 Then 'CTRL foi pressionada
FormaPerfeita = True
Else
FormaPerfeita = False
End If
End Sub

Note que, no desenho de crculos, devemos especificar o raio, enquanto no desneho de


elipses devemos especificar tambm a relao de aspecto.

As propriedades CurrentX e CurrentY so usadas para armazenar a ltima posio grfica


da caixa de figuras. Na primeira vez que o evento MouseMove for gerado, finalizamos com uma
linha (ou elipse ou retngulo) desenhado desde (ncoraX, ncoraY) at (X, Y). Da segunda vez,
apagamos esta linha, desenhando por cima dela com DrawMode = 7 (XOR) e ForeColor =
BackColor e desenhamos uma segunda linha at a posio (X, Y) atual.

O a procedure associada ao menu editar a seguinte:

Private Sub mnuEditarItem_Click(index As Integer)


Select Case index
Case 0 'Copiar
Clipboard.SetData frmPaint.picPaint.Image
Case 1 'Cortar
Clipboard.SetData frmPaint.picPaint.Image
frmPaint.picPaint.Cls
frmPaint.picPaint.Picture = LoadPicture()
Case 2 'Colar
frmPaint.picPaint.Picture = Clipboard.GetData()
End Select
End Sub

Note que estamos usando o objeto Clipboard para implementar os efeitos de cortar, copiar
e colar.

Anotaes:

SETEMBRO/1998

AAA
VISUAL BASIC 5.0

As procedures do menu Arquivo fazem uso do controle Common Dialog e de funes de


arquivo para abrir e salvar as figuras em disco.

Private Sub mnuArquivoItem_Click(index As Integer)


Select Case index
Case 0 'Abrir
On Error GoTo OcorreuErro 'CancelError verdadeiro
CommonDialog1.Filter = "Todos os arquivos (*.*)|*.*|Arquivos bitmap (*.bmp)|
*.bmp|"
CommonDialog1.FilterIndex = 2
CommonDialog1.ShowOpen
Picture = LoadPicture(CommonDialog1.FileName)
frmPaint.picPaint.Picture = LoadPicture(CommonDialog1.FileName)
Case 1 'Save
SavePicture frmPaint.picPaint.Image, FileName
Case 2 'Save As
On Error GoTo OcorreuErro
CommonDialog1.Filter = "Todos os arquivos (*.*)|*.*|Arquivos bitmap (*.bmp)|
*.bmp|"
CommonDialog1.FilterIndex = 2
CommonDialog1.ShowSave
FileName = CommonDialog1.FileName
SavePicture frmPaint.picPaint.Image, CommonDialog1.FileName

Case 3 'Load Color Palette


On Error GoTo OcorreuErro
CommonDialog1.Filter = "Palette Files (*.pal)|*.pal|" 'Set filters
CommonDialog1.FilterIndex = 2
CommonDialog1.ShowOpen
Open CommonDialog1.FileName For Random As #1 Len = Len(NovaPaleta(0))
For dummy = 0 To 9
Get #1, , NovaPaleta(dummy)
picColor(dummy).BackColor = NovaPaleta(dummy).ColorValue
Next dummy
Close #1
Case 4 'Save Color Palette
For dummy = 0 To 9
NovaPaleta(dummy).ColorValue = picColor(dummy).BackColor
Next dummy
On Error GoTo OcorreuErro 'CancelError is true
CommonDialog1.Filter = "Palette Files (*.pal)|*.pal|" 'Set filters
CommonDialog1.FilterIndex = 2
CommonDialog1.ShowSave
Open CommonDialog1.FileName For Random As #1 Len = Len(NovaPaleta(0))
For dummy = 0 To 9
Put #1, , NovaPaleta(dummy)
Next dummy
Close #1
Case 5 'Print

Anotaes:

SETEMBRO/1998

AAA
VISUAL BASIC 5.0

CommonDialog1.ShowPrinter
panColor.Visible = False
PrintForm
panColor.Visible = True
Case 6 'Barra separadora, no executado
Case 7 'Exit
End
End Select
OcorreuErro: 'Usurio pressionou Cancel
Exit Sub
End Sub

Anotaes:

SETEMBRO/1998

AAA
VISUAL BASIC 5.0

Anotaes:

SETEMBRO/1998

AAA

También podría gustarte