Cores no Visual Basic

Transcrição

Cores no Visual Basic
Lizaro Soft - Artigo
CORES NO VISUAL BASIC
Escrito por:
William Costa Rodriguesi
[email protected]
Junho 2005
http://www.lizarosoft.cjb.net
Página 1 de 8
Lizaro Soft - Artigo
1
Introdução
Este é um assunto que apesar de ser muito abordado por vários autores, ainda
merece atenção, principalmente para o desenvolvedores iniciantes, que nem sempre
enxergam algumas soluções que podemos ter com apenas algumas explicações sobre o
funcionamento das cores no Visual Basic.
Este artigo aborda algumas questões e padrões de cores do Visual Basic e tem
por objetivo elucidá-las.
2
Funcionamento das Cores no Visual Basic
As especificações para as propriedades das cores são indicadas em código
Hexadecimal. Cada código de cor no Visual Basic é formado de seis dígitos
hexadecimais, de &H000000& (0) até &HFFFFFF& (16.77.215) (CORNELL, 1998). A
sintaxe de uma cor hexadecimal é &HBBGGRR.
As cores hexadecimais são derivadas das cores RGB (ValorRed, ValorGreen,
ValorBlue), que têm seus valores variando de 0 a 255. Na cor hexadecimal os dois
últimos dígitos (não considere o dígito &) retornam o vermelho, os dois dígitos centrais
ou intermediários retornam o verde e os dois primeiros (desconsidere os dígitos &H),
retornam o azul, ou seja, a diferença básica entre os dois tipos de cores está na
organização do retorno das cores e na sintaxe.
Na Tabela 1, podemos ver alguns exemplos de cores no formato hexadecimal e
sua respectiva correspondência em RGB.
Tabela 1. Exemplo de algumas cores em Hexadecimal e RGB.
Código HEX
&H0000FF&
&H00FF00&
&HFF0000&
&H000000&
&HFFFFFF&
&H00FFFF&
&H808080&
Código RGB
255,0,0
0,255,0
0,0,255
0,0,0
255,255,255
255,255,0
128,128,128
Descrição
Retorna o máximo de vermelho
Retorna o máximo de verde
Retorna o máximo de azul
Retorna a cor preta
Retorna a cor branca (todas as cores)
Retorna a cor amarela
Retorna a cor cinza
Existe ainda outro padrão de cores, que foi muito utilizado no QuickBasic e
ainda é suportado no Visual Basic e a sua sintaxe é:
QBColor(ValordaCor)
Este valor é um número inteiro irá varia de 0 a 15. As cores retornada por esta
função estão resumidas na Tabela 2. Temos que convir que está função está obsoleta e
deve ser evitada, pois retorna cores limitadas e como hoje os monitores permitem
bilhões de cores, por que utilizá-la?
Tabela 2. Tabela de cores da função QBColor.
Valor
0
1
2
3
4
5
Cor
Preto
Azul
Verde
Ciano
Vermelho
Magenta
Valor
6
7
8
9
10
11
Cor
Marrom
Branco
Cinza
Azul-claro
Verde-claro
Ciano claro
http://www.lizarosoft.cjb.net
Página 2 de 8
Valor
12
13
14
15
Cor
Vermelho-claro
Magenta-claro
Amarelo
Branco
altaintensidade
Lizaro Soft - Artigo
O motivo pelo qual o &H808080& é a mistura igual de todas as cores é que a
metade de &HFF é &H80, porque a metade de 255 é 128; 128 é igual a 8*16, que é
igual a &H80 (CORNELL, 1998).
3
Traduzindo Cores
Para traduzir cores no Visual Basic existem várias formas, porém iremos abordar
alguns exemplos conhecidos, utilizando a API TranslateColor da Biblioteca
olepro32.dll. Esta função converte cores Hexadecimais em cores no padrão RGB
(Código 1)
Código 1. Função para traduzir cores Hexadecimais em RGB.
Private
Declare
Function
TranslateColor
Lib
"olepro32.dll"
Alias
"OleTranslateColor" (ByVal clr As OLE_COLOR, ByVal palet As Long, col As Long)
As Long
Private Sub Form_Load()
Dim RealColor As Long
'Converte cores OLE para cores RGB
TranslateColor Me.BackColor, 0, RealColor
'exibe os resultados
MsgBox "A cor de fundo do formulário é R=" + CStr(RealColor And &HFF&) + "
G=" + CStr((RealColor And &HFF00&) / 2 ^ 8) + " B=" + CStr((RealColor And
&HFF0000) / 2 ^ 16)
End Sub
Como visto no Código 1 é possível converter cores Hex ou reais em RGB, da
mesma forma poderemos traduzir ou converter cores RGB e as constantes de cores do
Visual Basic em cores hexadecimais. No Código 2 veremos uma função que possibilida
esse tipo de conversão.
Código 2. Função que converte as constantes de cores do Visual Basic e cores RGB em
Hexadecimal.
Public Function ColorTag(ByVal Cor As Long) As String
Dim Texto As String, corHexa As String
Dim Num As Integer
corHexa = Hex(Cor)
'Converte a cor númerica do
'parametro em Hexadeximal
'Obs.: A função Hex Retorna O Num em Texto
Texto = ""
For Num = (6 - Len(corHexa)) To 1 Step -1
Texto = Texto & "0"
Next
ColorTag = "&H" & Texto & corHexa
'Retorna &HBBGGRR&
End Function
'Agora Pode ser Implementado Assim:
Label1.Caption=ColorTag(vbblue)
'Retorna &HFF0000
'Ou usar cores RGB
Label1.BackColor = ColorTag(RGB(192, 195, 192))
'Retorna &HC0C3C0 - Cinza
'Ou usar o CommonDialog:
'Chama a caixa de diálogo de cor
CommonDialog1.ShowColor
Label1.Caption = ColorTag(CommonDialog1.Color)
http://www.lizarosoft.cjb.net
Página 3 de 8
Lizaro Soft - Artigo
4
Retornando Cores de Uma PictureBox
Quem trabalha com a parte gráfica no Visual Basic ou mesmo pretende
desenvolver um aplicação que necessite retornar a cor em Hexadecimal de uma figura
ou imagem (Figura 1), pode lançar mão do Código 3, que retorna este valor. Entretanto
se o desenvolvedor quiser retornar este valor em RGB basta utilizar Código 4.
Figura 1. Formulário onde foi inserido um PictureBox para exemplificar o retorno de cores de
uma imagem.
Código 3. Função que possibilita retornar a cores em Hexadecimal de uma PictureBox com
imagem através o evento MouseMove.
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, _
ByVal x As Long, ByVal y As Long) As Long
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer,
Single, y As Single)
Label1.Caption = "A cor selecionada é: &&H" & _
Hex(GetPixel(Picture1.hdc, x / Screen.TwipsPerPixelX, y / _
Screen.TwipsPerPixelY))
End Sub
x
As
Código 4. Função que possibilita retornar a cores em RGB de uma PictureBox com imagem
através o evento MouseMove.
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, x As
Single, y As Single)
Dim RealColor As Long
'Converte cores OLE para cores RGB
TranslateColor "&H" & _
Hex(GetPixel(Picture1.hdc, x / Screen.TwipsPerPixelX, y / _
Screen.TwipsPerPixelY)), 0, RealColor
'Exibe o resultado
Label1.Caption = "A cor selecionada é: R=" + CStr(RealColor And &HFF&) + "
G=" + CStr((RealColor And &HFF00&) / 2 ^ 8) + " B=" + CStr((RealColor And
&HFF0000) / 2 ^ 16)
Me.Text1.BackColor = RGB(CStr(RealColor And &HFF&), CStr((RealColor And
&HFF00&) / 2 ^ 8), CStr((RealColor And &HFF0000) / 2 ^ 16))
End Sub
http://www.lizarosoft.cjb.net
Página 4 de 8
Lizaro Soft - Artigo
5
Criando Gradientes
O Visual Basic possui vários recursos gráficos, como por exemplo à criação de
gradientes. Mais uma vez digo que este recurso é voltado para pessoas que trabalham
com tratamento de imagens, para quem pretende desenvolver seu próprio editor de
ícones, etc. O Código 5 demonstra como criar um gradiente idêntico àqueles
encontrados no Photoshop, CorelDraw e em alguns editores de ícones (Figura 2). Outro
exemplo de gradiente pode ser visto no Código 6 e Figura 3. Este gradiente é idêntico
aos utilizados em programas de instalação.
Código 5. Código para criação de um triângulo em gradiente de cores RGB (KPD-TEAM, 1999).
Requires Windows 2000 or later; Requires Windows 98 or later
Option Explicit
Private Type GRADIENT_TRIANGLE
Vertex1 As Long
Vertex2 As Long
Vertex3 As Long
End Type
Private Type TRIVERTEX
x As Long
y As Long
Red As Integer 'Ushort value
Green As Integer 'Ushort value
Blue As Integer 'ushort value
Alpha As Integer 'ushort
End Type
Private Type GRADIENT_RECT
UpperLeft As Long 'In reality this is a UNSIGNED Long
LowerRight As Long 'In reality this is a UNSIGNED Long
End Type
Const GRADIENT_FILL_RECT_H As Long = &H0 'In this mode, two endpoints describe
a rectangle. The rectangle is
'defined to have a constant color (specified by the TRIVERTEX structure) for
the left and right edges. GDI interpolates
'the color from the top to bottom edge and fills the interior.
Const GRADIENT_FILL_RECT_V
As Long = &H1 'In this mode, two endpoints
describe a rectangle. The rectangle
' is defined to have a constant color (specified by the TRIVERTEX structure)
for the top and bottom edges. GDI interpolates
' the color from the top to bottom edge and fills the interior.
Const GRADIENT_FILL_TRIANGLE As Long = &H2 'In this mode, an array of
TRIVERTEX structures is passed to GDI
'along with a list of array indexes that describe separate triangles. GDI
performs linear interpolation between triangle vertices
'and fills the interior. Drawing is done directly in 24- and 32-bpp modes.
Dithering is performed in 16-, 8.4-, and 1-bpp mode.
Private Declare Function GradientFillTriangle Lib "msimg32" _
Alias "GradientFill" (ByVal hdc As Long, pVertex As TRIVERTEX, _
ByVal dwNumVertex As Long, pMesh As GRADIENT_TRIANGLE, ByVal dwNumMesh As
Long, _
ByVal dwMode As Long) As Long
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As
Long, ByVal y As Long) As Long
Private Sub Form_Load()
Dim vert(4) As TRIVERTEX
Dim gTRi(1) As GRADIENT_TRIANGLE
ScaleMode = vbPixels
AutoRedraw = True
Move Left, Top, 3945, 4230
vert(0).x = 0
vert(0).y = 0
vert(0).Red = -256
vert(0).Green = 0&
vert(0).Blue = 0&
vert(0).Alpha = 0&
http://www.lizarosoft.cjb.net
Página 5 de 8
Lizaro Soft - Artigo
vert(1).x = 255
vert(1).y = 0
vert(1).Red = 0&
vert(1).Green = -256
vert(1).Blue = 0&
vert(1).Alpha = 0&
vert(2).x = 256
vert(2).y = 256
vert(2).Red = 0&
vert(2).Green = 0&
vert(2).Blue = -256
vert(2).Alpha = 0&
vert(3).x = 0
vert(3).y = 256
vert(3).Red = -256
vert(3).Green = -256
vert(3).Blue = -256
vert(3).Alpha = 0&
gTRi(0).Vertex1 = 0
gTRi(0).Vertex2 = 1
gTRi(0).Vertex3 = 2
gTRi(1).Vertex1 = 0
gTRi(1).Vertex2 = 2
gTRi(1).Vertex3 = 3
GradientFillTriangle hdc, vert(0), 4, gTRi(0), 2, GRADIENT_FILL_TRIANGLE
Form1.Show
End Sub
Private Function RgbParse(hdc As Long, x As Single, y As Single) As String
Dim ColorMe As Long
ColorMe = GetPixel(hdc, x, y)
Dim rgbRed, rgbGreen, rgbBlue As Long
rgbRed = Abs(ColorMe Mod &H100)
ColorMe = Abs(ColorMe \ &H100)
rgbGreen = Abs(ColorMe Mod &H100)
ColorMe = Abs(ColorMe \ &H100)
rgbBlue = Abs(ColorMe Mod &H100)
ColorMe = RGB(rgbRed, rgbGreen, rgbBlue)
RgbParse = "RGB(" & rgbRed & ", " & rgbGreen & ", " & rgbBlue & ")"
End Function
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y
As Single)
Caption = RgbParse(hdc, x, y)
End Sub
Figura 2. Triângulo em gradiente de cores RGB.
http://www.lizarosoft.cjb.net
Página 6 de 8
Lizaro Soft - Artigo
Código 6. Código para criação de um gradiente azul e preto idêntico aos utilizados em
programas de instalação (KPD-TEAM, 1999).
Private Type TRIVERTEX
x As Long
y As Long
Red As Integer 'Ushort value
Green As Integer 'Ushort value
Blue As Integer 'ushort value
Alpha As Integer 'ushort
End Type
Private Type GRADIENT_RECT
UpperLeft As Long 'In reality this is a UNSIGNED Long
LowerRight As Long 'In reality this is a UNSIGNED Long
End Type
Const GRADIENT_FILL_RECT_H As Long = &H0 'In this mode, two endpoints describe
a rectangle. The rectangle is
'defined to have a constant color (specified by the TRIVERTEX structure) for
the left and right edges. GDI interpolates
'the color from the top to bottom edge and fills the interior.
Const GRADIENT_FILL_RECT_V
As Long = &H1 'In this mode, two endpoints
describe a rectangle. The rectangle
' is defined to have a constant color (specified by the TRIVERTEX structure)
for the top and bottom edges. GDI interpolates
' the color from the top to bottom edge and fills the interior.
Const GRADIENT_FILL_TRIANGLE As Long = &H2 'In this mode, an array of
TRIVERTEX structures is passed to GDI
'along with a list of array indexes that describe separate triangles. GDI
performs linear interpolation between triangle vertices
'and fills the interior. Drawing is done directly in 24- and 32-bpp modes.
Dithering is performed in 16-, 8.4-, and 1-bpp mode.
Const GRADIENT_FILL_OP_FLAG As Long = &HFF
Private Declare Function GradientFillRect Lib "msimg32" Alias "GradientFill"
(ByVal hdc As Long, pVertex As TRIVERTEX, ByVal dwNumVertex As Long, pMesh As
GRADIENT_RECT, ByVal dwNumMesh As Long, ByVal dwMode As Long) As Long
Private Function LongToUShort(Unsigned As Long) As Integer
'A small function to convert from long to unsigned short
LongToUShort = CInt(Unsigned - &H10000)
End Function
Private Sub Form_Load()
'KPD-Team 1999
'URL: http://www.allapi.net/
'E-Mail: [email protected]
'API uses pixels
Me.ScaleMode = vbPixels
End Sub
Private Sub Form_Paint()
Dim vert(1) As TRIVERTEX
Dim gRect As GRADIENT_RECT
'from black
With vert(0)
.x = 0
.y = 0
.Red = 0&
.Green = 0& '&HFF&
.Blue = 0&
.Alpha = 0&
End With
'0&
'to blue
With vert(1)
.x = Me.ScaleWidth
.y = Me.ScaleHeight
.Red = 0&
.Green = 0&
http://www.lizarosoft.cjb.net
Página 7 de 8
Lizaro Soft - Artigo
.Blue = LongToUShort(&HFF00&)
.Alpha = 0&
End With
gRect.UpperLeft = 0
gRect.LowerRight = 1
GradientFillRect Me.hdc, vert(0), 2, gRect, 1, GRADIENT_FILL_RECT_H
End Sub
Figura 3. Gradiente idêntico aos utilizados em programas de instalação.
6
Considerações Finais
Esta demonstração de poder, quando se trata de cores demonstra que o Visual
Basic não é uma plataforma de desenvolvimento voltada para banco de dados, podendo
ser mais que isto. No Visual Basic é possível tratar imagens de forma profissional e até
mesmo elaborar um programa simples para este fim.
Espero que este artigo tenha ajudado a elucidar algumas questões sobre os
tópicos abordados. Críticas e sugestões poderão ser encaminhadas para
[email protected].
7
Referências
CORNELL, G. 1998. Visual Basic 5: Completo e Total. Trad.: L.G.E. UNONIUS. São
Paulo: Makron Books, 778p.
KPD-TEAM, 1999. API-Guide: API library v3.7, disponível em http://www.allapi.net/.
RODRIGUES, W.C. 2005. Lizaro Visual Basic Dicas v4.0: Biblioteca de dicas do Visual
Basic. Não publicado.
i
William Costa Rodrigues é Eng. Agrônomo, Pós-doutor em entomologia e programador autodidata. Desenvolve
softwares em Visual Basic desde 2000, alem de atuar com Webdesigner.
http://www.lizarosoft.cjb.net
Página 8 de 8