Application-drawn button widgets (CwDrawnButton) enable the
application to draw arbitrary graphics on a button. Drawn buttons
behave like push buttons except that they can be drawn on like drawing area
widgets. See the example below.
As with the push-button widget, the application can add an activate callback to be run when the button is pressed. As with the drawing area widget, expose and resize callbacks can be added to notify the application when the button requires redrawing and when it has changed size. Consult "Drawing operations" chapter for more information on drawing graphics.
In the code below, a drawn button is created and drawn.
Object subclass: #DrawnButtonExample instanceVariableNames: 'gc ' classVariableNames: '' poolDictionaries: 'CwConstants CgConstants '
open | shell button | shell := CwTopLevelShell createApplicationShell: 'shell' argBlock: [:w | w title: 'Drawn Button Example'].
button := shell createDrawnButton: 'button' argBlock: nil.
button addCallback: XmNactivateCallback receiver: self selector: #button:clientData:callData: clientData: nil; addCallback: XmNexposeCallback receiver: self selector: #expose:clientData:callData: clientData: nil;
addCallback: XmNdestroyCallback receiver: self selector: #destroy:clientData:callData: clientData: nil. button manageChild. shell realizeWidget. gc := button window createGC: None values: nil.
activate: widget clientData: clientData callData: callData "The drawn button has been pressed." Transcript cr; show: 'The pixmap button has been pressed.'.
expose: widget clientData: clientData callData: callData "The drawn button has been exposed. Redraw the button." | x |
callData event count = 0 ifTrue: [ 0 to: 10 do: [:i | x := widget width * i // 10.
widget window drawLine: gc x1: x y1: 0 x2: widget width - x y2: widget height - 1]].
destroy: widget clientData: clientData callData: callData gc freeGC.