Sei sulla pagina 1di 8

Lizaro Soft - Artigo

CORES NO VISUAL BASIC

wcostarodrigues@yahoo.com.br

Escrito por: William Costa Rodriguesi

Junho 2005

http://www.lizarosoft.cjb.net
Pgina 1 de 8

Lizaro Soft - Artigo


1 Introduo
Este um assunto que apesar de ser muito abordado por vrios autores, ainda merece ateno, principalmente para o desenvolvedores iniciantes, que nem sempre enxergam algumas solues que podemos ter com apenas algumas explicaes sobre o funcionamento das cores no Visual Basic. Este artigo aborda algumas questes e padres de cores do Visual Basic e tem por objetivo elucid-las.

Funcionamento das Cores no Visual Basic

As especificaes para as propriedades das cores so indicadas em cdigo Hexadecimal. Cada cdigo de cor no Visual Basic formado de seis dgitos hexadecimais, de &H000000& (0) at &HFFFFFF& (16.77.215) (CORNELL, 1998). A sintaxe de uma cor hexadecimal &HBBGGRR. As cores hexadecimais so derivadas das cores RGB (ValorRed, ValorGreen, ValorBlue), que tm seus valores variando de 0 a 255. Na cor hexadecimal os dois ltimos dgitos (no considere o dgito &) retornam o vermelho, os dois dgitos centrais ou intermedirios retornam o verde e os dois primeiros (desconsidere os dgitos &H), retornam o azul, ou seja, a diferena bsica entre os dois tipos de cores est na organizao do retorno das cores e na sintaxe. Na Tabela 1, podemos ver alguns exemplos de cores no formato hexadecimal e sua respectiva correspondncia em RGB.
Tabela 1. Exemplo de algumas cores em Hexadecimal e RGB.

Cdigo HEX &H0000FF& &H00FF00& &HFF0000& &H000000& &HFFFFFF& &H00FFFF& &H808080&

Cdigo RGB 255,0,0 0,255,0 0,0,255 0,0,0 255,255,255 255,255,0 128,128,128

Descrio Retorna o mximo de vermelho Retorna o mximo de verde Retorna o mximo de azul Retorna a cor preta Retorna a cor branca (todas as cores) Retorna a cor amarela Retorna a cor cinza

Existe ainda outro padro de cores, que foi muito utilizado no QuickBasic e ainda suportado no Visual Basic e a sua sintaxe :
QBColor(ValordaCor)

Este valor um nmero inteiro ir varia de 0 a 15. As cores retornada por esta funo esto resumidas na Tabela 2. Temos que convir que est funo est obsoleta e deve ser evitada, pois retorna cores limitadas e como hoje os monitores permitem bilhes de cores, por que utiliz-la?
Tabela 2. Tabela de cores da funo QBColor.

Valor 0 1 2 3 4 5

Preto Azul Verde Ciano Vermelho Magenta

Cor

Valor 6 7 8 9 10 11

Cor Marrom Branco Cinza Azul-claro Verde-claro Ciano claro

Valor 12 13 14 15

Cor Vermelho-claro Magenta-claro Amarelo Branco altaintensidade

http://www.lizarosoft.cjb.net
Pgina 2 de 8

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).

Traduzindo Cores

Para traduzir cores no Visual Basic existem vrias formas, porm iremos abordar alguns exemplos conhecidos, utilizando a API TranslateColor da Biblioteca olepro32.dll. Esta funo converte cores Hexadecimais em cores no padro RGB (Cdigo 1)
Cdigo 1. Funo 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 formulrio R=" + CStr(RealColor And &HFF&) + " G=" + CStr((RealColor And &HFF00&) / 2 ^ 8) + " B=" + CStr((RealColor And &HFF0000) / 2 ^ 16) End Sub

Como visto no Cdigo 1 possvel 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 Cdigo 2 veremos uma funo que possibilida esse tipo de converso.
Cdigo 2. Funo 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 nmerica do 'parametro em Hexadeximal 'Obs.: A funo 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 dilogo de cor CommonDialog1.ShowColor Label1.Caption = ColorTag(CommonDialog1.Color)

http://www.lizarosoft.cjb.net
Pgina 3 de 8

Lizaro Soft - Artigo


4 Retornando Cores de Uma PictureBox
Quem trabalha com a parte grfica no Visual Basic ou mesmo pretende desenvolver um aplicao que necessite retornar a cor em Hexadecimal de uma figura ou imagem (Figura 1), pode lanar mo do Cdigo 3, que retorna este valor. Entretanto se o desenvolvedor quiser retornar este valor em RGB basta utilizar Cdigo 4.

Figura 1. Formulrio onde foi inserido um PictureBox para exemplificar o retorno de cores de uma imagem. Cdigo 3. Funo que possibilita retornar a cores em Hexadecimal de uma PictureBox com imagem atravs 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

Cdigo 4. Funo que possibilita retornar a cores em RGB de uma PictureBox com imagem atravs 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
Pgina 4 de 8

Lizaro Soft - Artigo


5 Criando Gradientes
O Visual Basic possui vrios recursos grficos, como por exemplo criao de gradientes. Mais uma vez digo que este recurso voltado para pessoas que trabalham com tratamento de imagens, para quem pretende desenvolver seu prprio editor de cones, etc. O Cdigo 5 demonstra como criar um gradiente idntico queles encontrados no Photoshop, CorelDraw e em alguns editores de cones (Figura 2). Outro exemplo de gradiente pode ser visto no Cdigo 6 e Figura 3. Este gradiente idntico aos utilizados em programas de instalao.
Cdigo 5. Cdigo para criao de um tringulo 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
Pgina 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. Tringulo em gradiente de cores RGB.

http://www.lizarosoft.cjb.net
Pgina 6 de 8

Lizaro Soft - Artigo


Cdigo 6. Cdigo para criao de um gradiente azul e preto idntico aos utilizados em programas de instalao (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: KPDTeam@Allapi.net '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 'to blue With vert(1) .x = Me.ScaleWidth .y = Me.ScaleHeight .Red = 0& .Green = 0&

'0&

http://www.lizarosoft.cjb.net
Pgina 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 idntico aos utilizados em programas de instalao.

Consideraes Finais

Esta demonstrao de poder, quando se trata de cores demonstra que o Visual Basic no uma plataforma de desenvolvimento voltada para banco de dados, podendo ser mais que isto. No Visual Basic possvel tratar imagens de forma profissional e at mesmo elaborar um programa simples para este fim. Espero que este artigo tenha ajudado a elucidar algumas questes sobre os tpicos abordados. Crticas e sugestes podero ser encaminhadas para wcostarodrigues@yahoo.com.br.

Referncias

CORNELL, G. 1998. Visual Basic 5: Completo e Total. Trad.: L.G.E. UNONIUS. So Paulo: Makron Books, 778p. KPD-TEAM, 1999. API-Guide: API library v3.7, disponvel em http://www.allapi.net/. RODRIGUES, W.C. 2005. Lizaro Visual Basic Dicas v4.0: Biblioteca de dicas do Visual Basic. No publicado.

William Costa Rodrigues Eng. Agrnomo, Ps-doutor em entomologia e programador autodidata. Desenvolve softwares em Visual Basic desde 2000, alem de atuar com Webdesigner.

http://www.lizarosoft.cjb.net
Pgina 8 de 8

Potrebbero piacerti anche