Programmer's Reference

Wrapping OCXs with extended widgets

The Common Widgets Extended Widgets framework can be used to wrapper an OleControl so it can be used in a more familiar way. That is, Smalltalk accesssors are used to wrap the OleControl property messages (propertyAt: and propertyAt:put:) and invoke message (invoke:withArguments:), and the Common Widgets callback style is used for all the OLE events of interest.

For a reference on building Extended Widgets, see the Extended Widgets. The main approach is to:

  1. Make a subclass CwExtentedPrimitive.
  2. Create an instance of OleControl in the Extended Widgets createPrimaryWidget:parent:argBlock: method and register an ambient-property handler. For example:
    createPrimaryWidget: theName parent: parent argBlock: argBlock
       "Private - Create and answer the basic widget that is the root
        of the widget hierarchy for the receiver's widget system."
       ^self parent
          createOleControl: 'the control'
          argBlock: [:w | w
             clientName: 'TRACKBAR.TrackbarCtrl.1';
             ambientPropertyReceiver: self;
             ambientPropertySelector: #dispidAmbientPropertyAt:].
    
  3. Register OLE event handlers and associate them with Common Widgets callbacks in the initializeAfterCreate method. For example:
    initializeAfterCreate
       "Private - Perform any widget-specific post-create initialization."
       super initializeAfterCreate.
       self primaryWidget
          addOleEventHandler: 'Change'
          receiver: self
          selector: #callValueChangedCallback
    
  4. Implement widget-specific methods, such as:
    clearSelection
       "Clears the slider's selection range."
       ^self primaryWidget
          invoke: 'ClearSelection'
          withArguments: #()
    
  5. Implement accessors for resources, such as:
    lineSize: resourceValue
       "Set the value of the XmNlineSize resource.
        Resource type: Integer
        Default setting: 10
        Resource access: CSG
        Description: 	Specifies the line size. This is the amount
           that the slider moves when receiving a key press."
       self primaryWidget propertyAt: 'LineSize' put: resourceValue 
    lineSize
       "Answer the value of the XmNlineSize resource.
        Resource type: Integer
        Default setting: 10
        Resource access: CSG
        Description: Specifies the line size. This is the amount
           that the slider moves when receiving a key press."
       	self primaryWidget propertyAt: 'LineSize'
    


[ Top of Page | Previous Page | Next Page | Table of Contents | Index ]