TABS QUE PISCAM
Olá a todos.
Estou tentando encontrar material a respeito e não encontro. Acho que a forma como imagino fazer isso deve estar errada.
Eu tenho uma programa que recebe varias atualizações de informação. Existem várias abas nele também.
Eu quero fazer com que a aba pisque, mude de cor de forma intermitente, alertando o usuário que há novas informações ali.
A princÃpio pensei em usar um sistema para editar as configurações do tab e colocar um loop que é ativado quando precisa. Esse loop alteraria a cor da aba chamando a atenção.
Me parece algo bastante utilizado, mas infelizmente não acho nada sobre o assunto. Há outra forma mais correta para isso?
Uso VB 2008.
Sou amador, fiz uma agenda em ActionScript e Zinc e agora estou construindo ela em VB.
Obrigado.
Estou tentando encontrar material a respeito e não encontro. Acho que a forma como imagino fazer isso deve estar errada.
Eu tenho uma programa que recebe varias atualizações de informação. Existem várias abas nele também.
Eu quero fazer com que a aba pisque, mude de cor de forma intermitente, alertando o usuário que há novas informações ali.
A princÃpio pensei em usar um sistema para editar as configurações do tab e colocar um loop que é ativado quando precisa. Esse loop alteraria a cor da aba chamando a atenção.
Me parece algo bastante utilizado, mas infelizmente não acho nada sobre o assunto. Há outra forma mais correta para isso?
Uso VB 2008.
Sou amador, fiz uma agenda em ActionScript e Zinc e agora estou construindo ela em VB.
Obrigado.
Uma possivel solução ..
Criar um Panel superior, com botões que ficarao habilitados somente qdo existir alguma atualização.
Você poderia inserir uma imagem no botão. E tb poderia fazer o botão piscar ...
Pelo que sei, não tem como fazer isso com o TabControl
não é exatamente o que você está querendo ... mas ....
Criar um Panel superior, com botões que ficarao habilitados somente qdo existir alguma atualização.
Você poderia inserir uma imagem no botão. E tb poderia fazer o botão piscar ...
Pelo que sei, não tem como fazer isso com o TabControl
não é exatamente o que você está querendo ... mas ....
Opa, obrigado fera.
Com certeza é mais uma forma de fazer. No meu programa em Zinc tenho uma lanterna, imagem mesmo, tipo de farol de rua, que pisca do verde para o vermelho indicando que há novas atualizações.
E é possÃvel, então não mexer nas cores, mas fazer piscar uma TAB? Usando o Timer mesmo e fazer o texto da TAB aparecer e sumir?
Com certeza é mais uma forma de fazer. No meu programa em Zinc tenho uma lanterna, imagem mesmo, tipo de farol de rua, que pisca do verde para o vermelho indicando que há novas atualizações.
E é possÃvel, então não mexer nas cores, mas fazer piscar uma TAB? Usando o Timer mesmo e fazer o texto da TAB aparecer e sumir?
Bom, parece que dá para usar imagens para preencher a Aba. Se assim for, fica mais fácil, basta alterar a imagem para cores diferentes.
Acho que fazer piscar, tem que ser com a troca de imagens, e com o uso de um Timer.
Lembrando: o componente tabControl possui tabPage. E são elas que devem ser alteradas
Lembrando: o componente tabControl possui tabPage. E são elas que devem ser alteradas
Private Sub TabControl1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles TabControl1.DrawItem
[ô]Firstly we[ô]ll define some parameters.
Dim CurrentTab As TabPage = TabControl1.TabPages(e.Index)
Dim ItemRect As Rectangle = TabControl1.GetTabRect(e.Index)
Dim FillBrush As New SolidBrush(Color.Black)
Dim TextBrush As New SolidBrush(Color.Black)
Dim sf As New StringFormat
sf.Alignment = StringAlignment.Center
sf.LineAlignment = StringAlignment.Center
[ô]If we are currently painting the Selected TabItem we[ô]ll
[ô]change the brush colors and inflate the rectangle.
If CBool(e.State And DrawItemState.Selected) Then
FillBrush.Color = Color.Black
TextBrush.Color = Color.Black
ItemRect.Inflate(2, 2)
End If
[ô]Set up rotation for left and right aligned tabs
If TabControl1.Alignment = TabAlignment.Left Or TabControl1.Alignment = TabAlignment.Right Then
Dim RotateAngle As Single = 90
If TabControl1.Alignment = TabAlignment.Left Then RotateAngle = 270
Dim cp As New PointF(ItemRect.Left + (ItemRect.Width \ 2), ItemRect.Top + (ItemRect.Height \ 2))
e.Graphics.TranslateTransform(cp.X, cp.Y)
e.Graphics.RotateTransform(RotateAngle)
ItemRect = New Rectangle(-(ItemRect.Height \ 2), -(ItemRect.Width \ 2), ItemRect.Height, ItemRect.Width)
End If
[ô] We draw in the TabRect rather than on e.Bounds
[ô] so we can use TabRect later in MouseDown.
Dim tab_rect As Rectangle = TabControl1.GetTabRect(e.Index)
[ô] Allow room for margins.
Dim layout_rect As New RectangleF( _
tab_rect.Left + TAB_MARGIN, _
tab_rect.Y + TAB_MARGIN, _
tab_rect.Width - 4 * TAB_MARGIN, _
tab_rect.Height - 2 * TAB_MARGIN)
Dim string_format As New StringFormat
[ô]Next we[ô]ll paint the TabItem with our Fill Brush
e.Graphics.DrawImage(My.Resources.texture2, ItemRect)
[ô] Draw the tab[ô]s text centered.
Dim big_font As New Font(Me.Font, FontStyle.Regular)
string_format.Alignment = StringAlignment.Center
string_format.LineAlignment = StringAlignment.Center
e.Graphics.DrawString( _
TabControl1.TabPages(e.Index).Text, _
big_font, _
FillBrush, _
layout_rect, _
string_format)
[ô]Reset any Graphics rotation
e.Graphics.ResetTransform()
[ô]Finally, we should Dispose of our brushes.
FillBrush.Dispose()
TextBrush.Dispose()
End Sub
Consegui colocar a imagem como fundo usando esse código acima. Peguei da net um semelhante e adaptei para meu uso.
Agora tenho que ver uma forma de colocar um verificar que com novas informações, vai chamar uma função onde vai fazer piscar o tab.
Como eu poderia montar essa rotina? Veja que no topo do código, essa primeira linha é diferente da do Timer:
Drawitem:
Private Sub TabControl1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles TabControl1.DrawItem
Timer:
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Se eu consigo jogar esses códigos do Drawitem dentro do Timer aà é molesa, por que simplesmente faço ele ler uma variável e mudar ou não de cor.
Desculpe-me pela ignorância, mas ainda não estou acostumado com a estrutura do VB.
Obrigado.
[ô]Firstly we[ô]ll define some parameters.
Dim CurrentTab As TabPage = TabControl1.TabPages(e.Index)
Dim ItemRect As Rectangle = TabControl1.GetTabRect(e.Index)
Dim FillBrush As New SolidBrush(Color.Black)
Dim TextBrush As New SolidBrush(Color.Black)
Dim sf As New StringFormat
sf.Alignment = StringAlignment.Center
sf.LineAlignment = StringAlignment.Center
[ô]If we are currently painting the Selected TabItem we[ô]ll
[ô]change the brush colors and inflate the rectangle.
If CBool(e.State And DrawItemState.Selected) Then
FillBrush.Color = Color.Black
TextBrush.Color = Color.Black
ItemRect.Inflate(2, 2)
End If
[ô]Set up rotation for left and right aligned tabs
If TabControl1.Alignment = TabAlignment.Left Or TabControl1.Alignment = TabAlignment.Right Then
Dim RotateAngle As Single = 90
If TabControl1.Alignment = TabAlignment.Left Then RotateAngle = 270
Dim cp As New PointF(ItemRect.Left + (ItemRect.Width \ 2), ItemRect.Top + (ItemRect.Height \ 2))
e.Graphics.TranslateTransform(cp.X, cp.Y)
e.Graphics.RotateTransform(RotateAngle)
ItemRect = New Rectangle(-(ItemRect.Height \ 2), -(ItemRect.Width \ 2), ItemRect.Height, ItemRect.Width)
End If
[ô] We draw in the TabRect rather than on e.Bounds
[ô] so we can use TabRect later in MouseDown.
Dim tab_rect As Rectangle = TabControl1.GetTabRect(e.Index)
[ô] Allow room for margins.
Dim layout_rect As New RectangleF( _
tab_rect.Left + TAB_MARGIN, _
tab_rect.Y + TAB_MARGIN, _
tab_rect.Width - 4 * TAB_MARGIN, _
tab_rect.Height - 2 * TAB_MARGIN)
Dim string_format As New StringFormat
[ô]Next we[ô]ll paint the TabItem with our Fill Brush
e.Graphics.DrawImage(My.Resources.texture2, ItemRect)
[ô] Draw the tab[ô]s text centered.
Dim big_font As New Font(Me.Font, FontStyle.Regular)
string_format.Alignment = StringAlignment.Center
string_format.LineAlignment = StringAlignment.Center
e.Graphics.DrawString( _
TabControl1.TabPages(e.Index).Text, _
big_font, _
FillBrush, _
layout_rect, _
string_format)
[ô]Reset any Graphics rotation
e.Graphics.ResetTransform()
[ô]Finally, we should Dispose of our brushes.
FillBrush.Dispose()
TextBrush.Dispose()
End Sub
Consegui colocar a imagem como fundo usando esse código acima. Peguei da net um semelhante e adaptei para meu uso.
Agora tenho que ver uma forma de colocar um verificar que com novas informações, vai chamar uma função onde vai fazer piscar o tab.
Como eu poderia montar essa rotina? Veja que no topo do código, essa primeira linha é diferente da do Timer:
Drawitem:
Private Sub TabControl1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles TabControl1.DrawItem
Timer:
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Se eu consigo jogar esses códigos do Drawitem dentro do Timer aà é molesa, por que simplesmente faço ele ler uma variável e mudar ou não de cor.
Desculpe-me pela ignorância, mas ainda não estou acostumado com a estrutura do VB.
Obrigado.
Em vez de jogar o código para o TImer1, pq não chama o evento DrawItem do Timer?? o evento nada mais é do que uma função(Metodo)
Tópico encerrado , respostas não são mais permitidas