Visual Basic 6 agrega color de fondo al panel de la barra de estado

8

Estoy arreglando una aplicación antigua que se basa en el código de Visual Basic 6. Existe el requisito de agregar una barra de estado en la parte inferior del formulario. Mi barra de estado es la siguiente:

ingrese la descripción de la imagen aquí

Puedo mostrar el texto correctamente pero también quiero agregar un color de fondo rojo. Descubrí que no existe tal opción para el Panel StatusBar. Cuando abro la propiedad de StatusBar, se muestra a continuación:

ingrese la descripción de la imagen aquí

Descubrí que puedo agregar una imagen. Pero cuando agregué la imagen en color rojo, el texto estará cubierto por la imagen. Estoy atascado. Cualquier consejo será útil. ¡¡Gracias!!

ACTUALIZAR

Simplemente utilicé el código del enlace @ Étienne Laneville provisto en el comentario . El color de fondo agregado y también el texto agregado.

Aquí está mi código para llamar a la función:

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

Pero la posición del texto es la siguiente:

ingrese la descripción de la imagen aquí

Tengo que hacer el texto a continuación para posicionarlo, porque esta tarea era urgente por ahora y no tengo tiempo para investigar más.

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

A continuación se muestra mi salida:

ingrese la descripción de la imagen aquí

ACTUALIZACIÓN 2

Probé el código proporcionado por Brian M Stafford. Pero obtuve los mismos resultados. El texto todavía no está en el centro (ni a la izquierda). A continuación están mi código y captura de pantalla de la barra de estado:

ingrese la descripción de la imagen aquí

La función:

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

La 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

Llamando a la función:

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

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

No se por que. Es posible que me haya perdido algo o que haya establecido algunos valores de propiedad en StatusBar1 o picPanel (PictureBox).

SOLUCIÓN

Configuré pictureBox, propiedad AutoRedraw = True, y StatusBar, Panel, Alignment = sbrLeft. Y todo funciona.

wadefanyaoxia
fuente
1
No creo que sea posible de forma nativa. Eche un vistazo a este enlace: Personalice los colores y las fuentes para los paneles de la barra de estado , utilizan un control PictureBox y una llamada a la API.
Étienne Laneville el
2
He usado el código del enlace proporcionado por @ ÉtienneLaneville. Funciona muy bien.
Brian M Stafford

Respuestas:

3

Aquí está el código al que se hace referencia en un comentario con algunas mejoras. Una mejora es un parámetro para especificar la alineación del 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

Aquí está el código API de 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)

El código se usa así:

    Picture2.AutoRedraw = True
    Picture2.Visible = False

    StatusBarPanelText sbConfig, Picture2, 4, & _
       Format(Value / 1024, "#,###") & " KB", vbRed, vbWhite, 0
Brian M Stafford
fuente
Hola Brian, muchas gracias por la ayuda. Pero probé este código y todavía no funciona. No estoy seguro de por qué, pero la propiedad currentX no afecta la posición del texto. Y también descubrí ese evento si elimino pic.Print aText, el texto aún se puede mostrar.
wadefanyaoxia
@wadefanyaoxia No tengo ningún problema con el código. Noté que mi picturebox tiene 2 propiedades que tuve que cambiar: AutoRedraw = True y Visible = False.
Brian M Stafford
WOW ... cambié AutoRedraw = True. Y funciona. Y también tengo que cambiar la propiedad del panel statusbar1 Alineación a 0-sbrLeft. ¡Muchas gracias!.
wadefanyaoxia