Wolfram hat geschrieben:
Und wie finde ich eine Liste mit möglichen Methoden wie z.B. das drücken einer Bestimmten Taste? Sind das alles NSResponder oder gibt es noch mehr?
Die Methoden der gewünschten Klasse und die Klassen aller Elternklassen ("superclass"), von denen eine Klasse abgeleitet ist, können verwendet werden. Wilbert hat im englischen Forum gezeigt, wie man die Elternklassen ermittelt. Für das ButtonGadget erhält man die Elternklassen folgendermaßen:
Code:
Procedure.S GetInheritedObjects(Object)
Protected Result.I
Protected MutableArray.I = CocoaMessage(0, 0, "NSMutableArray arrayWithCapacity:", 10)
Repeat
CocoaMessage(0, MutableArray, "addObject:", CocoaMessage(0, Object, "className"))
CocoaMessage(@Object, Object, "superclass")
Until Object = 0
CocoaMessage(@Result, MutableArray, "componentsJoinedByString:$", @" --> ")
CocoaMessage(@Result, Result, "UTF8String")
ProcedureReturn PeekS(Result, -1, #PB_UTF8)
EndProcedure
OpenWindow(0, 270, 100, 150, 80, "Test")
ButtonGadget(0, 10, 30, 130, 25, "Click me!")
MessageRequester("Elternklassen:",
"ButtonGadget --> " + GetInheritedObjects(GadgetID(0)))
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Wolfram hat geschrieben:
Wenn ich das nun auf das Youtube Beispiel anwenden möchte passiert nichts.
Was habe ich da missverstanden?
Folgende Schritte sind nötig:
1. Einen Layer für das ButtonGadget anfordern:
Code:
CocoaMessage(0, GadgetID(0), "setWantsLayer:", #YES)
2. Das Subclassing des ButtonGadget durchführen:
Code:
SubclassedButtonGadget = SubclassGadget(0, "SubclassedButtonGadget")
3. Abschließend muss der Callback definiert werden, der das Bild des Button im normalen und gedrückten Zustand zeichnet:
Code:
class_addMethod_(SubclassedButtonGadget, sel_registerName_("updateLayer"),
@UpdateLayer(), "v@")
4. Als Images habe ich die Original-Images aus dem YouTube-Video von
GitHub heruntergeladen. Ich habe aus
button.imageset die Datei
button.png und aus
button_pressed.imageset die Datei
button_pressed.png heruntergeladen und im gleichen Verzeichnis wie den untenstehenden Sourcecode gespeichert.
5. Ich habe in meiner IDE unter "Werkzeuge..." das
plist-Tool (von Joe Baker und Wilbert) installiert und als Auslöser "Nach dem Kompilieren/Starten" eingestellt. Außerdem habe ich die beiden Grafiken aus GitHub im Sourcecode dann so eingebunden:
Code:
;@@ DisableDebugWindow
;@R button.png
;@R button_pressed.png
Beim Kompilieren des untenstehenden Sourcecodes erhalte ich dann das gleiche Ergebnis wie im YouTube-Video: die blaue Farbe des Button verdunkelt sich beim Klicken darauf.

Ich habe den Beispiel-Code erfolgreich mit MacOS 10.9.5 'Mavericks' mit PB 5.46 x86 und x64 im ASCII- und Unicode-Modus getestet.
Code:
EnableExplicit
;@@ DisableDebugWindow
;@R button.png
;@R button_pressed.png
Define SubclassedButtonGadget.I
Procedure SubclassGadget(GadgetID.I, NewClassName.S)
Protected GadgetClass.I = CocoaMessage(0, GadgetID(GadgetID), "class")
Protected NewGadgetClass.I
NewGadgetClass = objc_allocateClassPair_(GadgetClass, NewClassName, 0)
objc_registerClassPair_(NewGadgetClass)
object_setClass_(GadgetID(GadgetID), NewGadgetClass)
ProcedureReturn NewGadgetClass
EndProcedure
ProcedureC UpdateLayer(SubclassedButton.I, Selector.I)
Protected ButtonImage.S = "button.png"
Protected ButtonPressedImage.S = "button_pressed.png"
Protected Cell.I
Cell = CocoaMessage(0, SubclassedButton, "cell")
If CocoaMessage(0, Cell, "isHighlighted")
CocoaMessage(0, CocoaMessage(0, SubclassedButton, "layer"), "setContents:",
CocoaMessage(0, 0, "NSImage imageNamed:$", @ButtonPressedImage))
Else
CocoaMessage(0, CocoaMessage(0, SubclassedButton, "layer"), "setContents:",
CocoaMessage(0, 0, "NSImage imageNamed:$", @ButtonImage))
EndIf
EndProcedure
OpenWindow(0, 270, 100, 240, 90, "Subclassed ButtonGadget")
ButtonGadget(0, 50, 30, 140, 30, "Click me!")
SetGadgetFont(0, LoadFont(0, "Apple Chancery", 18))
CocoaMessage(0, GadgetID(0), "setWantsLayer:", #YES)
SubclassedButtonGadget = SubclassGadget(0, "SubclassedButtonGadget")
class_addMethod_(SubclassedButtonGadget, sel_registerName_("updateLayer"),
@UpdateLayer(), "v@")
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow