TABS QUE PISCAM

BISEWSKI 02/04/2010 20:37:33
#338447
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.
SAMUKA 02/04/2010 23:32:59
#338454
Resposta escolhida
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 ....
BISEWSKI 02/04/2010 23:43:11
#338456
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?
BISEWSKI 03/04/2010 00:28:18
#338459
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.
SAMUKA 03/04/2010 00:40:17
#338460
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
BISEWSKI 03/04/2010 00:56:26
#338461
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.
SAMUKA 03/04/2010 10:00:37
#338470
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