Изменение цвета фона для строки состояния Excel - PullRequest
0 голосов
/ 09 мая 2020

Я использую Excel 2016 (тема Office: красочный), и, к сожалению, когда я пишу код с определенным пользователем текстом для отображения в строке состояния, строка состояния меняет цвет фона на темно-зеленый вместо того, чтобы оставаться в vbButtonFace (& H8000000F ). Результатом является нечитаемое текстовое сообщение в строке состояния, учитывая, что цвет шрифта остается темно-серым, как и ожидалось.

Я знаю, что это напрямую не может быть выполнено с помощью VBA (пожалуйста, не предлагайте мне менять Office тема ... это не вариант!)

Погуглил я нашел код, который использует функции API SendMessage и GetSysColor вызовы, которые я переставил следующим образом:

#If VBA7 Then
    Public Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr
    Public Declare PtrSafe Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long
#Else
    Public 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
    Public Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long
#End If

Private Const CCM_FIRST As Long = &H2000                    'Common Control Messages
Private Const CCM_SETBKCOLOR As Long = (CCM_FIRST + 1)
Private Const PBM_SETBKCOLOR As Long = CCM_SETBKCOLOR       'Progress Bar Messages

Private Const COLOR_BTNFACE = &H8000000F

#If VBA7 Then
    Public Sub SetStatusBackColour(hwndStatBar As LongPtr, ByVal clrref As Long)
        Call SendMessage(hwndStatBar, PBM_SETBKCOLOR, 0&, ByVal clrref)
    End Sub
#Else
    Public Sub SetStatusBackColour(hwndStatBar As Long, ByVal clrref As Long)
        Call SendMessage(hwndStatBar, PBM_SETBKCOLOR, 0&, ByVal clrref)
    End Sub
#End If

Public Function EvalCol(ByVal inCol As Long) As Long        ' Returns the RGB of a long colour value (System colour aware)
    If ((inCol And &HFFFFFF00) = &H80000000) Then EvalCol = GetSysColor(inCol And &HFF) Else EvalCol = inCol
End Function

Private Sub Test()
    Call SetStatusBackColour(StatusBar1.hwnd, EvalCol(vbButtonFace))
    'Call SetStatusBackColour(StatusBar1.hwnd, COLOR_BTNFACE)       'without GetSysColor API function call
End Sub

Теперь проблема в том ... Как мне найти hwnd строки состояния Excel?

Очевидно, если этот подход больше не применяется или вместо него можно использовать другой подход, пожалуйста, сообщите мне без проблем! !!

Любая помощь приветствуется

...