Visual Basic 6 fügt dem Statusleistenfenster eine Hintergrundfarbe hinzu

8

Ich behebe eine alte Anwendung, die auf Visual Basic 6-Code aufbaut. Es ist erforderlich, dass am unteren Rand des Formulars eine Statusleiste hinzugefügt wird. Meine Statusleiste lautet wie folgt:

Geben Sie hier die Bildbeschreibung ein

Ich kann den Text korrekt anzeigen, möchte aber auch eine rote Hintergrundfarbe hinzufügen. Ich habe herausgefunden, dass es für das StatusBar-Panel keine solche Option gibt. Wenn ich die Eigenschaft von StatusBar öffne, wird Folgendes angezeigt:

Geben Sie hier die Bildbeschreibung ein

Ich habe herausgefunden, dass ich ein Bild hinzufügen kann. Aber wenn ich das rote Farbbild hinzugefügt habe, wird der Text vom Bild verdeckt. Ich stecke fest. Jeder Rat wird hilfreich sein. Vielen Dank!!

AKTUALISIEREN

Ich habe einfach den Code aus dem Link @ Étienne Laneville verwendet, der im Kommentar angegeben ist . Die Hintergrundfarbe hinzugefügt und auch der Text hinzugefügt.

Hier ist mein Code zum Aufrufen der Funktion:

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

Die Textposition ist jedoch wie folgt:

Geben Sie hier die Bildbeschreibung ein

Ich muss den Text wie folgt gestalten, um ihn zu positionieren, da diese Aufgabe vorerst dringend war und ich keine Zeit habe, weitere Nachforschungen anzustellen.

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

Unten ist meine Ausgabe:

Geben Sie hier die Bildbeschreibung ein

UPDATE 2

Ich habe den Code von Brian M Stafford ausprobiert. Aber ich habe die gleichen Ergebnisse erzielt. Der Text befindet sich immer noch nicht in der Mitte (oder links). Unten sind mein Code und ein Screenshot der Statusleiste:

Geben Sie hier die Bildbeschreibung ein

Die Funktion:

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

Die 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

Aufruf der Funktion:

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

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

Keine Ahnung warum. Möglicherweise habe ich etwas verpasst oder einige Eigenschaftswerte für StatusBar1 oder picPanel (PictureBox) festgelegt.

LÖSUNG

Ich setze pictureBox, Eigenschaft AutoRedraw = True und StatusBar, Panel, Alignment = sbrLeft. Und alles funktioniert.

Wadefanyaoxie
quelle
1
Ich denke nicht, dass es nativ möglich ist. Schauen Sie sich diesen Link an: Passen Sie Farben und Schriftarten für Statusleistenfenster an . Sie verwenden ein PictureBox-Steuerelement und einen API-Aufruf.
Étienne Laneville
2
Ich habe den Code aus dem von @ ÉtienneLaneville bereitgestellten Link verwendet. Es funktioniert sehr gut.
Brian M Stafford

Antworten:

3

Hier ist der Code, auf den in einem Kommentar mit einigen Verbesserungen verwiesen wird . Eine Verbesserung ist ein Parameter zum Festlegen der Textausrichtung:

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

Hier ist der Windows-API-Code:

    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)

Der Code wird dann folgendermaßen verwendet:

    Picture2.AutoRedraw = True
    Picture2.Visible = False

    StatusBarPanelText sbConfig, Picture2, 4, & _
       Format(Value / 1024, "#,###") & " KB", vbRed, vbWhite, 0
Brian M Stafford
quelle
Hallo Brian, vielen Dank für die Hilfe. Aber ich habe diesen Code ausprobiert und er funktioniert immer noch nicht. Ich weiß nicht warum, aber die Eigenschaft currentX wirkt sich nicht auf die Textposition aus. Und auch ich habe dieses Ereignis herausgefunden, wenn ich pic.Print aText entferne, kann der Text immer noch angezeigt werden.
Wadefanyaoxia
@ Wadefanyaoxia Ich habe keine Probleme mit dem Code. Ich stelle fest, dass meine Bilderbox zwei Eigenschaften hat, die ich ändern musste: AutoRedraw = True und Visible = False.
Brian M Stafford
WOW ... Ich habe AutoRedraw = True geändert. Und es funktioniert. Außerdem muss ich die Panel-Eigenschaft statusbar1 Alignment in 0-sbrLeft ändern. Ich danke dir sehr!.
Wadefanyaoxia