Hallo liebe Leserin, lieber Leser,
immer wieder liest man in den Foren zu Fragen, ob denn die Hintergrundfarbe oder die Textfarbe einer Messagebox nicht geändert werden könne, dass das nicht möglich sei.
Nur einer hat es m.E. bei Mr. Excel mit viel Aufwand geschafft, hier eine entsprechende Lösung zu präsentieren.
Und ja, es ist (natürlich) möglich, die Hintergrundfarbe einer MsgBox oder weiterer Dialogboxen individuell zu verändern.
Eine Möglichkeit wäre, für die gesamte Klasse die Hintergrundfarbe mittels SetClasslong zu setzen. Aber dann hätten ja alle Dialogboxen diesen Hintergrund. Eher nicht so gut.
Das Setzen der Hintergrundfarbe einer Dialogbox oder eines Controls ist mit vertretbarem Aufwand nicht so einfach.
Aber, warum zeichnen wir die Dialogbox oder das Control nicht einfach neu.
Im hier gezeigten Code machen wir genau das. Leider mit ein paar Einschränkungen, aber für den Hausgebrauch könnte es reichen.
Als Font holen wir uns den Originalfont des Static der Messagebox. Natürlich könnte man auch einen eigenen Font kreieren, mit abweichender Schriftart, fett oder unterstrichen usw.
Hierzu findest Du hier eine entsprechende Anregung....
https://www.clever-excel-forum.de/Thread...se-aendern
Eine Möglichkeit, die Button individuell zu beschriften, findest Du hier.
https://www.clever-excel-forum.de/Thread...genem-Icon
Leider sind die Icons, die die Msgbox hier verwendet, keine guten Icons. Die Hintergrundfarbe ist nicht transparent, so dass diese nicht so gut aussehen.
Ggf. kann man bei Bedarf auch eigene Icons verwenden.
PS: Hier wird eine einfache Hintergrundfarbe verwendet. Als Brush könnte man natürlich auch ein Muster hier verwenden....
Und nun viel Spaß beim Ausprobieren...
immer wieder liest man in den Foren zu Fragen, ob denn die Hintergrundfarbe oder die Textfarbe einer Messagebox nicht geändert werden könne, dass das nicht möglich sei.
Nur einer hat es m.E. bei Mr. Excel mit viel Aufwand geschafft, hier eine entsprechende Lösung zu präsentieren.
Und ja, es ist (natürlich) möglich, die Hintergrundfarbe einer MsgBox oder weiterer Dialogboxen individuell zu verändern.
Eine Möglichkeit wäre, für die gesamte Klasse die Hintergrundfarbe mittels SetClasslong zu setzen. Aber dann hätten ja alle Dialogboxen diesen Hintergrund. Eher nicht so gut.
Das Setzen der Hintergrundfarbe einer Dialogbox oder eines Controls ist mit vertretbarem Aufwand nicht so einfach.
Aber, warum zeichnen wir die Dialogbox oder das Control nicht einfach neu.
Im hier gezeigten Code machen wir genau das. Leider mit ein paar Einschränkungen, aber für den Hausgebrauch könnte es reichen.
Als Font holen wir uns den Originalfont des Static der Messagebox. Natürlich könnte man auch einen eigenen Font kreieren, mit abweichender Schriftart, fett oder unterstrichen usw.
Hierzu findest Du hier eine entsprechende Anregung....
https://www.clever-excel-forum.de/Thread...se-aendern
Eine Möglichkeit, die Button individuell zu beschriften, findest Du hier.
https://www.clever-excel-forum.de/Thread...genem-Icon
Leider sind die Icons, die die Msgbox hier verwendet, keine guten Icons. Die Hintergrundfarbe ist nicht transparent, so dass diese nicht so gut aussehen.
Ggf. kann man bei Bedarf auch eigene Icons verwenden.
PS: Hier wird eine einfache Hintergrundfarbe verwendet. Als Brush könnte man natürlich auch ein Muster hier verwenden....
Und nun viel Spaß beim Ausprobieren...
Code:
Option Explicit
' Timerfunktionen
Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hwnd As LongPtr, _
ByVal nIDEvent As LongPtr, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal hwnd As LongPtr, _
ByVal nIDEvent As LongPtr) As Long
' Windowsfunktionen
Private Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
Private Declare PtrSafe Function CallWindowProcA Lib "user32" ( _
ByVal lpPrevWndFunc As LongPtr, _
ByVal hwnd As LongPtr, ByVal Msg As Long, _
ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
#If Win64 Then
Private Declare PtrSafe Function SetWindowLongA Lib "user32" Alias "SetWindowLongPtrA" ( _
ByVal hwnd As LongPtr, ByVal nIndex As Long, _
ByVal dwNewLong As LongPtr) As LongPtr
#Else
Private Declare PtrSafe Function SetWindowLongA Lib "user32" (ByVal hwnd As LongPtr, _
ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
#End If
Private Const GWL_WNDPROC = -4
Private Declare PtrSafe Function GetClientRect Lib "user32" (ByVal hwnd As LongPtr, _
lpRect As RECT) As Long
' GDI-Funktionen
Private Declare PtrSafe Function SetTextColor Lib "gdi32" (ByVal hdc As LongPtr, _
ByVal crColor As Long) As Long
Private Declare PtrSafe Function SetBkMode Lib "gdi32" (ByVal hdc As LongPtr, _
ByVal nBkMode As Long) As Long
Private Declare PtrSafe Function FillRect Lib "user32" (ByVal hdc As LongPtr, _
lpRect As RECT, ByVal hBrush As LongPtr) As Long
Private Declare PtrSafe Function BeginPaint Lib "user32" (ByVal hwnd As LongPtr, _
lpPaint As PAINTSTRUCT) As LongPtr
Private Declare PtrSafe Function EndPaint Lib "user32" (ByVal hwnd As LongPtr, _
lpPaint As PAINTSTRUCT) As Long
Private Declare PtrSafe Function CreateSolidBrush Lib "gdi32" ( _
ByVal crColor As Long) As LongPtr
Private Declare PtrSafe Function DeleteObject Lib "gdi32" (ByVal hObject As LongPtr) As Long
Private Declare PtrSafe Function SelectObject Lib "gdi32" (ByVal hdc As LongPtr, _
ByVal hObject As LongPtr) As LongPtr
Private Declare PtrSafe Function GetDlgItem Lib "user32" ( _
ByVal hDlg As LongPtr, ByVal nIDDlgItem As Long) As LongPtr
Private Declare PtrSafe Function GetDC Lib "user32" (ByVal hwnd As LongPtr) As LongPtr
Private Declare PtrSafe Function ReleaseDC Lib "user32" ( _
ByVal hwnd As LongPtr, ByVal hdc As LongPtr) As Long
Private Declare PtrSafe Function TextOutA Lib "gdi32" (ByVal hdc As LongPtr, _
ByVal x As Long, ByVal y As Long, ByVal lpString As String, _
ByVal nCount As Long) As Long
Private Declare PtrSafe Function SendMessageA Lib "user32" (ByVal hwnd As LongPtr, _
ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type PAINTSTRUCT
hdc As LongPtr
fErase As Long
rcPaint As RECT
fRestore As Long
fIncUpdate As Long
rgbReserved(0& To 31&) As Byte
End Type
Private Type MSGBOXPARAM
Textfarbe As Long
HGFarbe As Long
End Type
Dim mMP As MSGBOXPARAM
Dim mhTimer As LongPtr, mlpOldProc As LongPtr, msText As String
Private Function MsgboxEx(sText As String, _
Optional ByVal iDlgStyle As Long, Optional sCaption As String) As Long
msText = sText
mhTimer = SetTimer(0&, 0&, 25, AddressOf MsgBoxHookProc) ' Timer setzen
MsgboxEx = MsgBox(sText, iDlgStyle, sCaption) ' (Excel)-Msgbox starten
End Function
Sub MsgBoxHookProc()
' Setzt die Hooking-Prozedur für die MsgBox
Dim hwnd As LongPtr
KillTimer 0&, mhTimer: mhTimer = 0 ' Timer löschen
hwnd = GetActiveWindow() ' (Excel)-Msgbox suchen
If hwnd <> 0 Then _
mlpOldProc = SetWindowLongA(hwnd, GWL_WNDPROC, AddressOf WindowProc) ' (Excel)-Msgbox hooken
End Sub
Private Function WindowProc(ByVal hwnd As LongPtr, ByVal uMsg As Long, _
ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
Dim tPS As PAINTSTRUCT
Dim tR As RECT
Dim hdc As LongPtr, hBrush As LongPtr, hStatic As LongPtr, hFont As LongPtr
Dim i As Integer, z As Integer, sArr() As String
Select Case uMsg
Case &HF ' &HF = WM_PAINT
hBrush = CreateSolidBrush(mMP.HGFarbe) ' Einen neuen Brush erstellen
hStatic = GetDlgItem(hwnd, 65535) ' Handle des Textfeldes
hFont = SendMessageA(hStatic, &H31, 0, 0) ' Schriftart des Textfeldes
For i = 1 To 2
BeginPaint IIf(i = 1, hwnd, hStatic), tPS
If i = 1 Then
FillRect tPS.hdc, tPS.rcPaint, hBrush ' Dlgbox mit Farbe füllen
Else
SetBkMode tPS.hdc, 1 ' 1 = Transparent ' Hintergrundmodus setzen
SelectObject tPS.hdc, hFont ' Font aktivieren
SetTextColor tPS.hdc, mMP.Textfarbe ' Schriftfarbe setzen
sArr = Split(msText, vbLf)
For z = 0 To UBound(sArr)
TextOutA tPS.hdc, 1, z * 18 + 1, sArr(z), Len(sArr(z)) ' Text ausgeben
Next z
End If
EndPaint hwnd, tPS
Next i
DeleteObject hBrush ' Brush löschen
End Select
WindowProc = CallWindowProcA(mlpOldProc, hwnd, uMsg, wParam, lParam)
End Function
Private Sub Aufruftest()
Dim sText As String
sText = "Dieses hier ist ein Beispieltext," & vbLf & "der auch umgebrochen ist" _
& vbLf & "und zwar mehrfach!" & vbLf & "Findest Du das gut?"
With mMP
.Textfarbe = RGB(0, 0, 60)
.HGFarbe = RGB(255, 210, 255)
End With
MsgBox (MsgboxEx(sText, vbYesNo, "Mein Hintergundtest"))
End Sub
' Timerfunktionen
Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hwnd As LongPtr, _
ByVal nIDEvent As LongPtr, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal hwnd As LongPtr, _
ByVal nIDEvent As LongPtr) As Long
' Windowsfunktionen
Private Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
Private Declare PtrSafe Function CallWindowProcA Lib "user32" ( _
ByVal lpPrevWndFunc As LongPtr, _
ByVal hwnd As LongPtr, ByVal Msg As Long, _
ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
#If Win64 Then
Private Declare PtrSafe Function SetWindowLongA Lib "user32" Alias "SetWindowLongPtrA" ( _
ByVal hwnd As LongPtr, ByVal nIndex As Long, _
ByVal dwNewLong As LongPtr) As LongPtr
#Else
Private Declare PtrSafe Function SetWindowLongA Lib "user32" (ByVal hwnd As LongPtr, _
ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
#End If
Private Const GWL_WNDPROC = -4
Private Declare PtrSafe Function GetClientRect Lib "user32" (ByVal hwnd As LongPtr, _
lpRect As RECT) As Long
' GDI-Funktionen
Private Declare PtrSafe Function SetTextColor Lib "gdi32" (ByVal hdc As LongPtr, _
ByVal crColor As Long) As Long
Private Declare PtrSafe Function SetBkMode Lib "gdi32" (ByVal hdc As LongPtr, _
ByVal nBkMode As Long) As Long
Private Declare PtrSafe Function FillRect Lib "user32" (ByVal hdc As LongPtr, _
lpRect As RECT, ByVal hBrush As LongPtr) As Long
Private Declare PtrSafe Function BeginPaint Lib "user32" (ByVal hwnd As LongPtr, _
lpPaint As PAINTSTRUCT) As LongPtr
Private Declare PtrSafe Function EndPaint Lib "user32" (ByVal hwnd As LongPtr, _
lpPaint As PAINTSTRUCT) As Long
Private Declare PtrSafe Function CreateSolidBrush Lib "gdi32" ( _
ByVal crColor As Long) As LongPtr
Private Declare PtrSafe Function DeleteObject Lib "gdi32" (ByVal hObject As LongPtr) As Long
Private Declare PtrSafe Function SelectObject Lib "gdi32" (ByVal hdc As LongPtr, _
ByVal hObject As LongPtr) As LongPtr
Private Declare PtrSafe Function GetDlgItem Lib "user32" ( _
ByVal hDlg As LongPtr, ByVal nIDDlgItem As Long) As LongPtr
Private Declare PtrSafe Function GetDC Lib "user32" (ByVal hwnd As LongPtr) As LongPtr
Private Declare PtrSafe Function ReleaseDC Lib "user32" ( _
ByVal hwnd As LongPtr, ByVal hdc As LongPtr) As Long
Private Declare PtrSafe Function TextOutA Lib "gdi32" (ByVal hdc As LongPtr, _
ByVal x As Long, ByVal y As Long, ByVal lpString As String, _
ByVal nCount As Long) As Long
Private Declare PtrSafe Function SendMessageA Lib "user32" (ByVal hwnd As LongPtr, _
ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type PAINTSTRUCT
hdc As LongPtr
fErase As Long
rcPaint As RECT
fRestore As Long
fIncUpdate As Long
rgbReserved(0& To 31&) As Byte
End Type
Private Type MSGBOXPARAM
Textfarbe As Long
HGFarbe As Long
End Type
Dim mMP As MSGBOXPARAM
Dim mhTimer As LongPtr, mlpOldProc As LongPtr, msText As String
Private Function MsgboxEx(sText As String, _
Optional ByVal iDlgStyle As Long, Optional sCaption As String) As Long
msText = sText
mhTimer = SetTimer(0&, 0&, 25, AddressOf MsgBoxHookProc) ' Timer setzen
MsgboxEx = MsgBox(sText, iDlgStyle, sCaption) ' (Excel)-Msgbox starten
End Function
Sub MsgBoxHookProc()
' Setzt die Hooking-Prozedur für die MsgBox
Dim hwnd As LongPtr
KillTimer 0&, mhTimer: mhTimer = 0 ' Timer löschen
hwnd = GetActiveWindow() ' (Excel)-Msgbox suchen
If hwnd <> 0 Then _
mlpOldProc = SetWindowLongA(hwnd, GWL_WNDPROC, AddressOf WindowProc) ' (Excel)-Msgbox hooken
End Sub
Private Function WindowProc(ByVal hwnd As LongPtr, ByVal uMsg As Long, _
ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
Dim tPS As PAINTSTRUCT
Dim tR As RECT
Dim hdc As LongPtr, hBrush As LongPtr, hStatic As LongPtr, hFont As LongPtr
Dim i As Integer, z As Integer, sArr() As String
Select Case uMsg
Case &HF ' &HF = WM_PAINT
hBrush = CreateSolidBrush(mMP.HGFarbe) ' Einen neuen Brush erstellen
hStatic = GetDlgItem(hwnd, 65535) ' Handle des Textfeldes
hFont = SendMessageA(hStatic, &H31, 0, 0) ' Schriftart des Textfeldes
For i = 1 To 2
BeginPaint IIf(i = 1, hwnd, hStatic), tPS
If i = 1 Then
FillRect tPS.hdc, tPS.rcPaint, hBrush ' Dlgbox mit Farbe füllen
Else
SetBkMode tPS.hdc, 1 ' 1 = Transparent ' Hintergrundmodus setzen
SelectObject tPS.hdc, hFont ' Font aktivieren
SetTextColor tPS.hdc, mMP.Textfarbe ' Schriftfarbe setzen
sArr = Split(msText, vbLf)
For z = 0 To UBound(sArr)
TextOutA tPS.hdc, 1, z * 18 + 1, sArr(z), Len(sArr(z)) ' Text ausgeben
Next z
End If
EndPaint hwnd, tPS
Next i
DeleteObject hBrush ' Brush löschen
End Select
WindowProc = CallWindowProcA(mlpOldProc, hwnd, uMsg, wParam, lParam)
End Function
Private Sub Aufruftest()
Dim sText As String
sText = "Dieses hier ist ein Beispieltext," & vbLf & "der auch umgebrochen ist" _
& vbLf & "und zwar mehrfach!" & vbLf & "Findest Du das gut?"
With mMP
.Textfarbe = RGB(0, 0, 60)
.HGFarbe = RGB(255, 210, 255)
End With
MsgBox (MsgboxEx(sText, vbYesNo, "Mein Hintergundtest"))
End Sub
_________
viele Grüße
Karl-Heinz
viele Grüße
Karl-Heinz