Not all OCX controls support a .BackColor property to change the background color, although the control itself allows changing it. Here GB32 conforms to VB too much. Rather than adding a property to the implementation – which would require another patch in executable code – we can use a different approach.
All OCX controls share a user-defined structure to store the current settings of the wrapped control. Setting and getting property values is sometimes nothing more than changing and setting a member of the structure. Setting and obtaining the background value is one of them. The BackColor property stores its value in the member at offset $B8 of the start of object’s data block. The following code changes the background of a StatusBar Ocx.
Form frm1 Ocx StatusBar sb1 Trace SetBkColorControl(sb1, RGB(23, 56, 229)) Do Sleep Until Me Is Nothing Function SetBkColorControl(Ctrl As Control, Color As Long) As Long Const OffBackColor = $B8 Local Long ObjPtr = Long{*Ctrl} SetBkColorControl = Long{ObjPtr + OffBackColor} {ObjPtr + OffBackColor} = Color ~InvalidateRect(Ctrl.hwnd, 0, 1) ' Notes ' 1 Using the IDispatch interface does not work ' when the GetTypeInfo doesn't support the ' the .BackColor property. ' BackColor is not a property of StatusBar If 0 Then Ctrl.BackColor = Color ' 2 When using XP Visual Themes the Visual Style ' theme takes over and gets precedence over ' GB OCX propery settings. EndFunc
Note – Not all controls let their background set this way. Just experiment.
No comments:
Post a Comment