12 April 2012

Ocx background color

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

[フレーム]

Subscribe to: Post Comments (Atom)

AltStyle によって変換されたページ (->オリジナル) /