Ir para o conteúdo
Lau13

Combobox com texto de várias cores

Mensagens Recomendadas

Lau13

Bom dia,

Tenho uma dúvida, á qual não consigo resolver, já tentei fazer a coisa de várias maneiras mas não consegui, queria ver se vocês me ajudavam.

A duvida é a seguinte, eu tenho uma Combobox para selecionar qual a cor pretendida pelo cliente e gostava que cada palavra correspondesse a essa mesma cor.

Por exemplo:

Azul (e a palavra azul estava escrita a azul)

Como demonstra esta imagem http://i.imgur.com/p4Nz6x3.png

Se alguém me poder ajudar... :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Existe um método que podes fazer override: OnDrawItem.

Este método é chamado por cada vez que um item precisa de ser desenhado.

É aqui, no override, que tens de interceptar e redesenhar.

Também é necessário alterar o DrawMode da combo, para que seja usado o overload que é overridable.

Eu faria uma classe a herdar da combobox, colocava-lhe uma estrutura para reter o texto e a cor e criava um método para adicionar controladamente aos items.

Quão familiarizado estás tu com heranças e este tipo de situações? Se estiveres mesmo a zero, posso deixar uma implementação "dirty" da coisa para estudares.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Lau13

Bom dia,

Desde já muito obrigado por me estár a ajudar. Em relação á sua pergunta, eu acho que seria melhor deixar um exemplo de código, pois eu não sei nada sobre heranças e override.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Não percebendo nada disso, vais acabar por não querer saber como funciona e usar com copy-paste em todos os sítios onde precises... vou colocar a solução completa, mas aconselho muito a leres um pouco sobre isso.

Basicamente vamos criar uma variante da ComboBox.

1 - Adiciona uma nova classe à solução. Chama-lhe "ComboBoxEx"

2 - Copy paste:

Friend Structure ItemCor
   Public Texto As String
   Public Cor As Color
   Public Overrides Function ToString() As String
       Return Texto
   End Function
End Structure

Public Class ComboBoxEx
   Inherits ComboBox

   Sub New()
       Me.DrawMode = Windows.Forms.DrawMode.OwnerDrawFixed
   End Sub

   Public Sub AdicionarItem(Texto As String, Cor As Color)
       Me.Items.Add(New ItemCor With {.Cor = Cor, .Texto = Texto})
   End Sub

   Public Function CorSeleccionada() As Color
       If Me.SelectedIndex = -1 Then Return Nothing
       Return DirectCast(Me.Items(Me.SelectedIndex), ItemCor).Cor
   End Function

   Protected Overrides Sub OnDrawItem(e As DrawItemEventArgs)
       e.DrawBackground()
       e.DrawFocusRectangle()
       Dim tmpItem As ItemCor = DirectCast(Me.Items(e.Index), ItemCor)
       Dim tmpCorLetra As Brush = New SolidBrush(tmpItem.Cor)
       If e.State = Windows.Forms.DrawItemState.Selected Then tmpCorLetra = Brushes.White
       Dim tmpFont As New Font(Me.Font, FontStyle.Bold)
       e.Graphics.DrawString(tmpItem.Texto, tmpFont, tmpCorLetra, e.Bounds)
   End Sub
End Class

3 - Faz um build do projecto e passarás a ter na toolbox, nos componentes da solução, a ComboBoxEx.

4 - Arrasta-a de lá, cria-a no código, faz o que bem quiseres e entenderes com ela.

Done.

Para adiconar items:

ComboBoxEx1.AdicionarItem("Vermelho", Color.Red)
ComboBoxEx1.AdicionarItem("Amarelo", Color.Yellow)
ComboBoxEx1.AdicionarItem("Verde", Color.Green)

Para consultar o item seleccionado:

ComboBoxEx1.CorSeleccionada()

Estes dois métodos servem apenas para asseugrar que estás a adicionar items correctos, e não só Strings, por exemplo.

Há maneiras melhores de implementar isto, mas esta é a mais simples que me ocorre para entenderes a coisa.

Iu24vwL.jpg

Editado por ribeiro55

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Lau13

Já entendi mais ou menos a coisa, mas andei ás voltas com o código a tentar descobrir onde é que você declarou o tipo de letra e assim, porque a letra que aparece nos items da ComboboxEx é diferente aos comuns parece estar a bolt. Porque se selecionarmos uma cor aparece outro tipo de letra.

É aqui? Dim tmpFont As New Font(Me.Font, FontStyle.Bold)

Já descobri é ali mesmo, passei de bold para regular e já está igual. Muito obrigado, mas só mais uma coisa isto é o quê propriamente para eu poder pesquisar e entender mais sobre esta matéria?

Editado por Lau13

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

A essência são heranças e overriding.

Uma espreitadela também na GDI.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

É um método que foi definido na classe.

Serve para aceder de forma controlada à cor do item seleccionado.

Devolve uma Color. A Color do item seleccionado.

Se pedisses apenas o SelectedItem, a implementação base da ComboBox dava-te a structure e não a cor, que é o que queres.

Editado por ribeiro55

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Lau13

Eu tenho assim o meu código:

Public Class Form1

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       ComboBoxEx1.AdicionarItem("Vermelho", Color.Red)
       ComboBoxEx1.AdicionarItem("Amarelo", Color.Yellow)
       ComboBoxEx1.AdicionarItem("Verde", Color.Green)
       ComboBoxEx1.CorSeleccionada()
   End Sub

   Private Sub ComboBoxEx1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBoxEx1.SelectedIndexChanged
       If ComboBoxEx1.SelectedIndex = "Vermelho" Then
           ComboBoxEx1.ForeColor = Color.Red
       End If
   End Sub
End Class

Porquê que o meu IF não está a funcionar?

Sabe-me dizer?

Editado por pmg
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

É para isso que serve o CorSeleccionada()

Basta ComboBoxEx1.ForeColor = ComboBoxEx1.CorSeleccionada().

Nada de IFs.

Ou isso ou ou alteras logo na classe.

Para alem disso, Index é um número.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.