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