Visual Basic 6 adicionar backcolor ao painel da barra de status

8

Estou corrigindo um aplicativo antigo, construído com base no código do Visual Basic 6. Há um requisito para adicionar uma barra de status na parte inferior do formulário. Minha barra de status é a seguinte:

insira a descrição da imagem aqui

Posso mostrar o texto corretamente, mas também quero adicionar uma cor de fundo vermelha. Descobri que não existe essa opção para o Painel StatusBar. Quando abro a propriedade StatusBar, ela é mostrada abaixo:

insira a descrição da imagem aqui

Eu descobri que posso adicionar uma foto. Mas quando adicionei a figura em vermelho, o texto será coberto pela figura. Estou preso. Qualquer conselho será útil. Obrigado!!

ATUALIZAR

Simplesmente usei o código no link @ Étienne Laneville fornecido no comentário . A cor de fundo adicionada e também o texto adicionado.

Aqui está o meu código para chamar a função:

    PanelText StatusBar1, 9, "ATM (" & cntATM & ")", QBColor(12), QBColor(0)

Mas a posição do texto é como abaixo:

insira a descrição da imagem aqui

Eu tenho que fazer o texto como abaixo para posicioná-lo, porque esta tarefa era urgente por enquanto e não tenho tempo para investigar mais.

    PanelText StatusBar1, 9, "ATM (" & cntATM & ")                           ", QBColor(12), QBColor(0)

Abaixo está a minha saída:

insira a descrição da imagem aqui

ATUALIZAÇÃO 2

Eu tentei o código fornecido por Brian M Stafford. Mas obtive os mesmos resultados. O texto ainda não está no centro (ou à esquerda). Abaixo estão o meu código e a captura de tela da barra de status:

insira a descrição da imagem aqui

A função:

Private Sub PanelText(sb As StatusBar, pic As PictureBox, Index As Long, aText As String, bkColor As Long, _
    fgColor As Long, lAlign As Integer)

    Dim R As RECT

    SendMessage sb.hWnd, SB_GETRECT, Index - 1, R
    With pic
        Set .Font = sb.Font
        .Move 0, 0, (R.Right - R.Left + 2) * Screen.TwipsPerPixelX, (R.Bottom - R.Top) * Screen.TwipsPerPixelY
        .BackColor = bkColor
        .Cls
        .ForeColor = fgColor
        .CurrentY = (.Height - .TextHeight(aText)) \ 2

        Select Case lAlign
            Case 0      ' Left Justified
                .CurrentX = 0
            Case 1      ' Right Justified
                .CurrentX = .Width - .TextWidth(aText) - Screen.TwipsPerPixelX * 2
            Case 2      ' Centered
                .CurrentX = (.Width - .TextWidth(aText)) \ 2
        End Select

        pic.Print aText
        sb.Panels(Index).Text = aText
        sb.Panels(Index).Picture = .Image
    End With
End Sub

A API:

Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

Private Const WM_USER = &H400
Private Const SB_GETRECT = (WM_USER + 10)

Private Declare Function SendMessage Lib _
    "user32" Alias "SendMessageA" (ByVal hWnd As _
    Long, ByVal wMsg As Long, ByVal wParam As _
    Long, lParam As Any) As Long

Chamando a função:

PanelText StatusBar1, picPanel, 9, "Test1", vbRed, vbBlack, 2

PanelText StatusBar1, picPanel, 10, "DFM (" & cntDFM & ")", vbRed, vbBlack, 2

Eu não sei porque. Pode ser que eu tenha perdido algo ou posso definir alguns valores de propriedade para StatusBar1 ou picPanel (PictureBox).

SOLUÇÃO

Defino pictureBox, propriedade AutoRedraw = True e StatusBar, Panel, Alignment = sbrLeft. E tudo funciona.

wadefanyaoxia
fonte
1
Eu não acho que seja possível nativamente. Dê uma olhada neste link: Personalize cores e fontes dos painéis da barra de status , eles usam um controle PictureBox e uma chamada de API.
Étienne Laneville
2
Eu usei o código no link fornecido por @ ÉtienneLaneville. Funciona muito bem.
Brian M Stafford

Respostas:

3

Aqui está o código mencionado em um comentário com alguns aprimoramentos. Um aprimoramento é um parâmetro para especificar o alinhamento do texto:

Private Sub StatusBarPanelText(sb As StatusBar, pic As PictureBox, index As Long, aText As String, bkColor As Long, fgColor As Long, lAlign As Integer)
    Dim r As RECT

    SendMessage sb.hWnd, SB_GETRECT, index - 1, r

    With pic
        Set .Font = sb.Font
        .Move 0, 0, (r.Right - r.Left + 2) * Screen.TwipsPerPixelX, (r.Bottom - r.Top) * Screen.TwipsPerPixelY
        .BackColor = bkColor
        .Cls
        .ForeColor = fgColor
        .CurrentY = (.Height - .TextHeight(aText)) \ 2

        Select Case lAlign
            Case 0      ' Left Justified
                .CurrentX = 0
            Case 1      ' Right Justified
                .CurrentX = .Width - .TextWidth(aText) - Screen.TwipsPerPixelX * 2
            Case 2      ' Centered
                .CurrentX = (.Width - .TextWidth(aText)) \ 2
        End Select

        pic.Print aText
        sb.Panels(index).Text = aText
        sb.Panels(index).Picture = .Image
    End With
End Sub

Aqui está o código da API do Windows:

    Private Type RECT
       Left As Long
       Top As Long
       Right As Long
       Bottom As Long
    End Type

    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA"
       (ByVal hWnd As Long, ByVal wMsg As Long,
        ByVal wParam As Long, lParam As Any) As Long

    Private Const WM_USER = &H400
    Private Const SB_GETRECT = (WM_USER + 10)

O código é então usado assim:

    Picture2.AutoRedraw = True
    Picture2.Visible = False

    StatusBarPanelText sbConfig, Picture2, 4, & _
       Format(Value / 1024, "#,###") & " KB", vbRed, vbWhite, 0
Brian M Stafford
fonte
Olá Brian, muito obrigado pela ajuda. Mas eu tentei esse código e ele ainda não está funcionando. Não sei por que, mas a propriedade currentX não está afetando a posição do texto. E também descobri esse evento se eu remover pic.Print aText, o texto ainda pode aparecer.
Wadefanyaoxia 18/11/19
@wadefanyaoxia Não tenho nenhum problema com o código. Percebo que minha imagem tem duas propriedades que precisei alterar: AutoRedraw = True e Visible = False.
Brian M Stafford
WOW ... eu mudei AutoRedraw = True. E isso funciona. E também tenho que alterar a propriedade do painel statusbar1 Alignment para 0-sbrLeft. Muito obrigado!.
wadefanyaoxia