Hi,
eigentlich dachte ich, dass Thema hätte ich erledigt:
Es geht darum die Hintergrundfarbe eines Schiebereglers einzufärben, damit er besser lesbar ist. So habe ich das mit eurer Hilfe gelöst:
Das funktioniert auch wunderbar ... es sei denn der Schieberegler ist in einem Panel eines SplitContainers enthalten. Im angehängten Screenshot sieht man das Problem: der linke Schieberegler wird wie gewünscht eingefärbt, der rechte Schieberegler aber bleibt wie er ist, weil er im Panel2 eines SplitContainers liegt.
Ich hab das versucht zu tracen: Die WndProc feuert schlicht und ergreifend nicht für den zweiten Schieberegler. Und deshalb wird er auch nicht eingefärbt.
Hat jemand eine Idee, wie ich erreichen kann, dass für den zweiten Schieberegeler die Messsage WM_CTLCOLORSCROLLBAR gefeuert wird ?
Ich hoffe, ich habe mein Problem verständlich machen können.
LG
Peter
eigentlich dachte ich, dass Thema hätte ich erledigt:
Es geht darum die Hintergrundfarbe eines Schiebereglers einzufärben, damit er besser lesbar ist. So habe ich das mit eurer Hilfe gelöst:
VB.NET-Quellcode
- Imports System.Drawing.Imaging
- Imports System.Runtime.InteropServices
- Public Class Form1
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- ' GDI Brush von einer Farbe erstellen
- hBrush = CreateSolidBrush(&H4010&)
- Bmp = New Bitmap(4, 4, PixelFormat.Format24bppRgb)
- Using G As Graphics = Graphics.FromImage(Bmp)
- G.FillRectangle(Brushes.Yellow, 0, 0, 2, 2)
- G.FillRectangle(Brushes.Red, 2, 2, 2, 2)
- End Using
- hBmp = Bmp.GetHbitmap
- hBmpBrush = CreatePatternBrush(hBmp)
- End Sub
- 'Background color SCROLLBAR
- Protected Overrides Sub WndProc(ByRef m As Message)
- If m.Msg = WM_CTLCOLORSCROLLBAR Then
- If hBrush = IntPtr.Zero Then
- Return
- End If
- Dim t As Type = Control.FromHandle(m.LParam).GetType()
- Select Case t
- Case GetType(HScrollBar)
- m.Result = hBrush
- Case GetType(VScrollBar)
- m.Result = hBrush
- End Select
- Else
- MyBase.WndProc(m)
- End If
- End Sub
- Public Const WM_CTLCOLORSCROLLBAR = &H137
- Public hBmp As IntPtr = IntPtr.Zero
- Public hBrush As IntPtr = IntPtr.Zero
- Public hBmpBrush As IntPtr = IntPtr.Zero
- Public Bmp As Bitmap = Nothing
- <DllImport("gdi32.dll", EntryPoint:="CreatePatternBrush")>
- Public Shared Function CreatePatternBrush(
- ByVal hBitmap As IntPtr) As IntPtr
- End Function
- <DllImport("gdi32.dll", EntryPoint:="CreateSolidBrush")>
- Public Shared Function CreateSolidBrush(ByVal crColor As Integer) As IntPtr
- End Function
- <DllImport("gdi32.dll", EntryPoint:="DeleteObject")>
- Public Shared Function DeleteObject(ByVal hObject As IntPtr) As Integer
- End Function
- End Class
Das funktioniert auch wunderbar ... es sei denn der Schieberegler ist in einem Panel eines SplitContainers enthalten. Im angehängten Screenshot sieht man das Problem: der linke Schieberegler wird wie gewünscht eingefärbt, der rechte Schieberegler aber bleibt wie er ist, weil er im Panel2 eines SplitContainers liegt.
Ich hab das versucht zu tracen: Die WndProc feuert schlicht und ergreifend nicht für den zweiten Schieberegler. Und deshalb wird er auch nicht eingefärbt.
Hat jemand eine Idee, wie ich erreichen kann, dass für den zweiten Schieberegeler die Messsage WM_CTLCOLORSCROLLBAR gefeuert wird ?
Ich hoffe, ich habe mein Problem verständlich machen können.
LG
Peter