It's probably something like this (x64)
Code: Select all
EnableExplicit
#KnobWidth = 20
ImportC ""
class_addMethod(Class.I, Selector.I, *Callback, Types.P-ASCII)
objc_allocateClassPair(ModelClass.I, NewClassName.P-ASCII, ExtraBytes.I)
objc_registerClassPair(NewClass.I)
object_setClass(ObjectToModify.I, NewClass.I)
sel_registerName(MethodName.P-ASCII)
EndImport
Define CustomScrollBar.I
Define CustomScrollBarClass.I
Define View.I
ProcedureC DrawKnobCallback(Object.I, Selector.I)
Protected Delta.CGFloat = 0.7
Protected Point.NSPoint
Protected Rect.NSRect
If OSVersion() <= #PB_OS_MacOSX_10_6
Point\x = GetGadgetState(0) * (GadgetWidth(0) - #KnobWidth) / GetGadgetAttribute(0,
#PB_ScrollBar_Maximum) + #KnobWidth
Else
Point\x = GetGadgetState(0) * (GadgetWidth(0) + #KnobWidth + 6) / GetGadgetAttribute(0,
#PB_ScrollBar_Maximum) + 2
EndIf
Point\y = 1
Rect\origin\x = 0
Rect\size\width = #KnobWidth
Rect\size\height = 13
CocoaMessage(0, ImageID(0),
"drawAtPoint:@", @Point,
"fromRect:@", @Rect,
"operation:", #NSCompositeSourceOver,
"fraction:@", @Delta)
EndProcedure
ProcedureC DrawTrackCallback(Object.I, Selector.I, Highlight, d1.d,d2.d,d3.d,d4.d,d5.d,d6.d,d7.d,d8.d, x.d, y.d, w.d, h.d)
Protected Delta.CGFloat = 1.0
Protected Point.NSPoint
Protected.NSRect src, dst
Src\size\width = ImageWidth(1)
Src\size\height = ImageHeight(1)
Dst\origin\x = x
Dst\origin\y = y
Dst\size\width = w
Dst\size\height = h
CocoaMessage(0, ImageID(1),
"drawInRect:@", @Dst,
"fromRect:@", @Src,
"operation:", #NSCompositeSourceOver,
"fraction:@", @Delta)
EndProcedure
; ----- Create image for knob
CreateImage(0, #KnobWidth, 13, 32, $9370DB)
; ----- Create image for track
CreateImage(1, 8, 8, 32, $00e0e0)
; ----- Create window
OpenWindow(0, 270, 100, 260, 70, "ScrollBar with custom knob")
SetWindowColor(0, $C4E4FF)
ScrollBarGadget(0, 10, 25, WindowWidth(0) - 20, 15, 0, 100, #KnobWidth)
; ----- Subclass ScrollBar
CustomScrollBarClass = objc_allocateClassPair(CocoaMessage(0,
GadgetID(0), "class"), "CustomScrollBar", 0)
objc_registerClassPair(CustomScrollBarClass)
object_setClass(GadgetID(0), CustomScrollBarClass)
; ----- Set callback for drawing the knob
class_addMethod(CustomScrollBarClass, sel_registerName("drawKnob"),
@DrawKnobCallback(), "v@:")
; ----- Set callback for drawing the track
class_addMethod(CustomScrollBarClass, sel_registerName("drawKnobSlotInRect:highlight:"),
@DrawTrackCallback(), "v@:{CGRect={CGPoint=dd}{CGSize=dd}}c")
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
For x86, the callback should be like this
Code: Select all
ProcedureC DrawTrackCallback(Object.I, Selector.I, x.f, y.f, w.f, h.f, Highlight)
If you want to combine x86 and x64 in one source, it could be done like this I believe
Code: Select all
EnableExplicit
#KnobWidth = 20
ImportC ""
class_addMethod(Class.I, Selector.I, *Callback, Types.P-ASCII)
objc_allocateClassPair(ModelClass.I, NewClassName.P-ASCII, ExtraBytes.I)
objc_registerClassPair(NewClass.I)
object_setClass(ObjectToModify.I, NewClass.I)
sel_registerName(MethodName.P-ASCII)
EndImport
Define CustomScrollBar.I
Define CustomScrollBarClass.I
Define View.I
ProcedureC DrawKnobCallback(Object.I, Selector.I)
Protected Delta.CGFloat = 0.7
Protected Point.NSPoint
Protected Rect.NSRect
If OSVersion() <= #PB_OS_MacOSX_10_6
Point\x = GetGadgetState(0) * (GadgetWidth(0) - #KnobWidth) / GetGadgetAttribute(0,
#PB_ScrollBar_Maximum) + #KnobWidth
Else
Point\x = GetGadgetState(0) * (GadgetWidth(0) + #KnobWidth + 6) / GetGadgetAttribute(0,
#PB_ScrollBar_Maximum) + 2
EndIf
Point\y = 1
Rect\origin\x = 0
Rect\size\width = #KnobWidth
Rect\size\height = 13
CocoaMessage(0, ImageID(0),
"drawAtPoint:@", @Point,
"fromRect:@", @Rect,
"operation:", #NSCompositeSourceOver,
"fraction:@", @Delta)
EndProcedure
ProcedureC DrawTrackCallback(Object.I, Selector.I, x.f, y.f, w.f, h.f, Highlight, d1.d,d2.d,d3.d,d4.d, x_.d, y_.d, w_.d, h_.d)
Protected Delta.CGFloat = 1.0
Protected Point.NSPoint
Protected.NSRect src, dst
Src\size\width = ImageWidth(1)
Src\size\height = ImageHeight(1)
CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
Dst\origin\x = x_
Dst\origin\y = y_
Dst\size\width = w_
Dst\size\height = h_
CompilerElse
Dst\origin\x = x
Dst\origin\y = y
Dst\size\width = w
Dst\size\height = h
CompilerEndIf
CocoaMessage(0, ImageID(1),
"drawInRect:@", @Dst,
"fromRect:@", @Src,
"operation:", #NSCompositeSourceOver,
"fraction:@", @Delta)
EndProcedure
; ----- Create image for knob
CreateImage(0, #KnobWidth, 13, 32, $9370DB)
; ----- Create image for track
CreateImage(1, 8, 8, 32, $00e0e0)
; ----- Create window
OpenWindow(0, 270, 100, 260, 70, "ScrollBar with custom knob")
SetWindowColor(0, $C4E4FF)
ScrollBarGadget(0, 10, 25, WindowWidth(0) - 20, 15, 0, 100, #KnobWidth)
; ----- Subclass ScrollBar
CustomScrollBarClass = objc_allocateClassPair(CocoaMessage(0,
GadgetID(0), "class"), "CustomScrollBar", 0)
objc_registerClassPair(CustomScrollBarClass)
object_setClass(GadgetID(0), CustomScrollBarClass)
; ----- Set callback for drawing the knob
class_addMethod(CustomScrollBarClass, sel_registerName("drawKnob"),
@DrawKnobCallback(), "v@:")
; ----- Set callback for drawing the track
class_addMethod(CustomScrollBarClass, sel_registerName("drawKnobSlotInRect:highlight:"),
@DrawTrackCallback(), "v@:{CGRect={CGPoint=dd}{CGSize=dd}}c")
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow