I don't know why you would need to subclass to support additional icons. Look at this sample program from XDEMO.EXE (Sample Group 3).
Code: Select all
FUNCTION XSample_93()
/*
This example shows how to use the DCTREEROOT and DCTREEITEM
commands to build a tree menu system.
*/
LOCAL GetList := {}, oMenu, oFileMenu, oPrintMenu, oEditMenu, ;
cDocument := Space(60), cMemo := '', oMemo, oStatic1, ;
oStatic2, oMsgBox, cSaveDir := DC_CurPath(), ;
lDocLoaded := .f., lDocSaved := .f.
@ 1,4 DCSAY '--- MAIN MENU --- ' FONT '12.Arial Bold'
@ 2,1 DCSTATIC TYPE XBPSTATIC_TYPE_TEXT SIZE 25,11 OBJECT oStatic1 ;
FONT '10.Arial Bold'
@ 0,0 DCTREEROOT SIZE 25,11 OBJECT oMenu ;
HASLINES HASBUTTONS PARENT oStatic1 ;
ALWAYSSHOWSELECTION ;
TOOLTIP 'Double-Click a main-menu item to expand/collapse sub-menu;' + ;
'Double-Click a sub-menu item to select' ;
EVAL {|o|o:keyboard := {|a,b,o|_TreeKeyboard(a,b,o,GetList)} }
DCTREEITEM CAPTION 'File' PARENT oMenu OBJECT oFileMenu ;
MESSAGE 'These are File Options' INTO oMsgBox ;
IMAGENORMAL ICON_CLOSEDFOLDER ;
IMAGEMARKED ICON_CLOSEDFOLDER ;
IMAGEEXPANDED ICON_OPENFOLDER
DCTREEITEM CAPTION 'Load a Document' PARENT oFileMenu ;
ACTION {||lDocLoaded := .t., lDocSaved := .f., ;
_XSample_93(1,oMemo,@cDocument,@cMemo,GetList)} ;
MESSAGE 'This will load a text file into the document Window' ;
INTO oMsgBox ;
IMAGENORMAL ICON_PUSHBUTTON ;
IMAGEMARKED ICON_PUSHBUTTON ;
IMAGEEXPANDED ICON_PUSHBUTTON ;
IMAGECHECKED ICON_CHECKED ;
CHECKWHEN {||lDocLoaded} ;
DCTREEITEM CAPTION 'Save Document' PARENT oFileMenu ;
ACTION {||lDocSaved := .t., lDocLoaded := .f., ;
_XSample_93(2,oMemo,@cDocument,@cMemo,GetList)} ;
MESSAGE 'This will save the document in the Window to the text file' ;
INTO oMsgBox ;
IMAGENORMAL ICON_PUSHBUTTON ;
IMAGEMARKED ICON_PUSHBUTTON ;
IMAGEEXPANDED ICON_PUSHBUTTON ;
IMAGECHECKED ICON_CHECKED ;
CHECKWHEN {||lDocSaved} ;
DCTREEITEM CAPTION 'Print' PARENT oMenu OBJECT oPrintMenu ;
MESSAGE 'These are Printing Options' INTO oMsgBox
DCTREEITEM CAPTION 'Preview File' PARENT oPrintMenu ;
ACTION {||_XSample_93(3,oMemo,@cDocument,@cMemo,GetList)} ;
MESSAGE 'This will display a text file in a Preview Window' ;
INTO oMsgBox ;
IMAGENORMAL ICON_PUSHBUTTON ;
IMAGEMARKED ICON_PUSHBUTTON ;
IMAGEEXPANDED ICON_PUSHBUTTON ;
IMAGECHECKED ICON_QUESTION ;
DCTREEITEM CAPTION 'Print File' PARENT oPrintMenu ;
ACTION {||_XSample_93(4,oMemo,@cDocument,@cMemo,GetList)} ;
MESSAGE 'This will Print a text file' INTO oMsgBox ;
IMAGENORMAL ICON_PUSHBUTTON ;
IMAGEMARKED ICON_PUSHBUTTON ;
IMAGEEXPANDED ICON_PUSHBUTTON ;
IMAGECHECKED ICON_QUESTION
DCTREEITEM CAPTION 'Edit' PARENT oMenu OBJECT oEditMenu ;
MESSAGE 'These are Editing Options' INTO oMsgBox
DCTREEITEM CAPTION 'Edit Document' PARENT oEditMenu ;
ACTION {||_XSample_93(5,oMemo,@cDocument,@cMemo,GetList)} ;
MESSAGE 'This will allow a loaded document to be edited' ;
INTO oMsgBox ;
IMAGENORMAL ICON_PUSHBUTTON ;
IMAGEMARKED ICON_PUSHBUTTON ;
IMAGEEXPANDED ICON_PUSHBUTTON
DCTREEITEM CAPTION 'Check Spelling' PARENT oEditMenu ;
ACTION {||_XSample_93(6,oMemo,@cDocument,@cMemo,GetList)} ;
MESSAGE 'This will check spelling (only if you have sufficient funds)' ;
INTO oMsgBox ;
IMAGENORMAL ICON_PUSHBUTTON ;
IMAGEMARKED ICON_PUSHBUTTON ;
IMAGEEXPANDED ICON_PUSHBUTTON
DCTREEITEM CAPTION 'Clean Slate' PARENT oEditMenu ;
ACTION {||_XSample_93(7,oMemo,@cDocument,@cMemo,GetList)} ;
MESSAGE 'This will clear the document editor window' ;
INTO oMsgBox ;
IMAGENORMAL ICON_PUSHBUTTON ;
IMAGEMARKED ICON_PUSHBUTTON ;
IMAGEEXPANDED ICON_PUSHBUTTON
DCTREEITEM CAPTION 'Exit Program' PARENT oMenu ;
ACTION {||DC_ReadGuiEvent(DCGUI_EXIT_OK,GetList)} ;
MESSAGE 'This will exit the program' INTO oMsgBox ;
IMAGENORMAL ICON_PUSHBUTTON ;
IMAGEMARKED ICON_PUSHBUTTON ;
IMAGEEXPANDED ICON_PUSHBUTTON
@ 1,32 DCMULTILINE cMemo SIZE 60,12 OBJECT oMemo READONLY ;
MESSAGE 'Edit your text in this Window' INTO oMsgBox
@ 14,1 DCSTATIC TYPE XBPSTATIC_TYPE_RECESSEDBOX SIZE 90,1.2 ;
OBJECT oStatic2
@ .1,2 DCSTATIC TYPE XBPSTATIC_TYPE_TEXT SIZE 87,1 PARENT oStatic2 ;
OBJECT oMsgBox FONT '12.Courier New Bold'
DCREAD GUI FIT ADDBUTTONS MODAL ;
TITLE 'Tree View Menu Sample' ;
SETAPPWINDOW ;
EVAL {|o|SetAppFocus(oMenu)}
DC_ChDir(cSaveDir)
RETURN nil
* ----------------------
STATIC FUNCTION _XSample_93( nMode, oMemo, cDocument, cMemo, aGetList )
LOCAL oDirs, oFiles, cDirectory, lOk, GetList := {}, oFileName
IF nMode = 1 // Open file
@ 5,2 DCSAY 'Enter name of file to Edit'
@ 6,2 DCGET cDocument GETSIZE 53 GETOBJECT oFileName
@ 7.5,2 DCDIRTREE ;
DIRS oDirs VAR cDirectory ;
FILES oFiles VAR cDocument ;
DATALINK {||oFileName:SetData(), DC_GetRefresh(GetList)} ;
SIZE 50,6 ;
EXT '*.*','*.TXT','*.DOC'
DCREAD GUI FIT ADDBUTTONS TO lOk MODAL
IF lOk
cMemo := MemoRead(cDocument)
oMemo:setData()
ENDIF
ELSEIF nMode = 2 // Save file
cMemo := oMemo:GetData()
MemoWrit(cDocument,cMemo)
ELSEIF nMode = 3 // Preview file
DC_PrintFile(cDocument,.t.)
ELSEIF nMode = 4 // Print file
DC_PrintFile(cDocument,.f.)
ELSEIF nMode = 5 // edit
oMemo:setEditable(.t.)
SetAppFocus(oMemo)
ELSEIF nMode = 6 // check spelling
DC_Winalert('Please deposit $1,000,000 to start spell check')
ELSEIF nMode = 7
cMemo := ''
oMemo:setData()
ENDIF
DC_GetRefresh(aGetList)
RETURN nil
*** END OF EXAMPLE ***