// IconGroup control by Ram贸n Avenda帽o
// 15-08-98
#include "FiveWin.ch"
#include "Constant.ch"
#define GWL_STYLE 聽 聽 聽 聽 聽 聽 聽 -16
#define COLOR_ACTIVECAPTION 聽 聽 聽 2
#define COLOR_WINDOW 聽 聽 聽 聽 聽 聽 聽5
#define COLOR_WINDOWTEXT 聽 聽 聽 聽 聽8
#define COLOR_CAPTIONTEXT 聽 聽 聽 聽 9
#define SOURCE_VCOORS 聽 聽 聽 聽 聽 聽 5
#define SOURCE_HCOORS 聽 聽 聽 聽 聽 聽35
#define STEP_VCOORS 聽 聽 聽 聽 聽 聽 聽85
#define STEP_HCOORS 聽 聽 聽 聽 聽 聽 聽75
#define LAPSTEP_HCOORS 聽 聽 聽 聽 聽 STEP_HCOORS - 32
#define STEP_VSCROLL 聽 聽 聽 聽 聽 聽 16
#define STEP_HSCROLL 聽 聽 聽 聽 聽 聽 16
#define MK_MBUTTON 聽 聽 聽 聽 聽0x0010
#ifdef __XPP__
聽 聽#define Super ::TControl
聽 聽#define New 聽 _New
#endif
STATIC 聽nFirst:= 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 01/Sep/2013
STATIC 聽nLast := 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 01/Sep/2013
STATIC nScrPos:= 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 02/Sep/2013
STATIC 聽 nDown:= 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 03/Sep/2013
STATIC 聽 nView:= 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 03/Sep/2013
STATIC 聽 nPage:= 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 05/Sep/2013
//----------------------------------------------------------------------------//
CLASS TIconGroup FROM TControl
聽 聽CLASSDATA lRegistered AS LOGICAL
聽 聽DATA 聽 aIcons, aPrompts, aActions
聽 聽DATA 聽 aCoors, aOrder
聽 聽DATA 聽 nVScroll AS NUMERIC INIT 0
聽 聽DATA 聽 nHScroll AS NUMERIC INIT 0
聽 聽DATA 聽 nIcoCol 聽AS NUMERIC INIT 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 01/Sep/2013
聽 聽DATA 聽 nIcoRow 聽AS NUMERIC INIT 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 01/Sep/2013
聽 聽
聽 聽DATA 聽 nFocused
聽 聽DATA 聽 lStatic
聽 聽DATA 聽 lEdit, lAutoEdit
聽 聽DATA 聽 oGet
聽 聽METHOD New( nRow, nCol, aIcons, aPrompts, aActions, ;
聽 聽 聽 聽 聽 聽 聽 聽oWnd, nHelpId, lNoBorder, bChange, nWidth, nHeight, cMsg, ;
聽 聽 聽 聽 聽 聽 聽 聽lPixel, lVScroll, lHScroll, nClrFore, nClrBack, ;
聽 聽 聽 聽 聽 聽 聽 聽oFont, oCursor, lDesign, LUPDATE ) CONSTRUCTOR
聽 聽METHOD REDEFINE( nId, aIcons, aPrompts, aActions, oWnd, nHelpId, bChange, cMsg, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 nClrFore, nClrBack, oFont, oCursor, LUPDATE ) CONSTRUCTOR
聽 聽METHOD Initiate( hDlg ) INLINE Super:Initiate( hDlg ), ::DEFAULT()
聽 聽METHOD DISPLAY() INLINE ::BeginPaint(), ::PAINT(), ::EndPaint()
聽 聽METHOD SetVScroll()
聽 聽METHOD SetHScroll()
聽 聽METHOD SetScrollRange()
聽 聽METHOD DEFAULT()
聽 聽METHOD GetDlgCode( nLastKey )
聽 聽METHOD CoorsUpdate()
聽 聽METHOD PAINT()
聽 聽METHOD END() INLINE AEVAL( ::aIcons, {| hIcon | IF( hIcon != 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 DestroyIcon( hIcon ), Nil ) } ),Super:END()
聽
聽 聽METHOD _VScroll( nMove )
聽 聽METHOD _HScroll( nMove )
聽 聽METHOD ShowFocus( lFocused )
聽 聽METHOD ChangeFocus( nFocused )
聽 聽METHOD GotFocus( hCtlLost ) INLINE ::ShowFocus( .t. ), Super:GotFocus( hCtlLost )
聽 聽METHOD LostFocus( hWndGetFocus ) INLINE ::ShowFocus( .f. ), Super:LostFocus( hWndGetFocus )
聽 聽METHOD ReSize( nType, nWidth, nHeight ) INLINE Super:ReSize( nType, nWidth, nHeight ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ::SetScrollRange()
聽 聽METHOD nGetDown( nRow, nCol )
聽 聽METHOD LButtonDown( nRow, nCol, nFlags )
聽 聽METHOD LButtonUp( nRow, nCol, nFlags )
聽 聽METHOD MouseMove( nRow, nCol, nKeyFlags )
聽 聽METHOD LDblClick( nRow, nCol, nKeyFlags )
聽 聽METHOD EditPrompt( nAt, uVar, bValid, nClrFore, nClrBack )
聽 聽METHOD aGetAway()
聽 聽METHOD nGetTail()
聽 聽METHOD DrawIcon( nAt )
聽 聽METHOD Add( hIcon, cPrompt, bAction )
聽 聽METHOD Modify( hIcon, cPrompt, bAction, nAt )
聽 聽METHOD Del( nAt )
聽 聽METHOD Arrange() INLINE ::Adjust(), ::Refresh(), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::nVScroll := 0, ::nHScroll := 0, ::SetScrollRange()
聽 聽METHOD Invert( nRow, nCol, nRowInit, nColInit )
聽 聽METHOD Adjust()
聽 聽
聽 聽
聽 聽METHOD KeyDown( nKey, nFlags ) 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 12/Ago/2013
聽 聽METHOD MouseWheel( nKeys, nDelta ) 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 12/Ago/2013
聽 聽METHOD Reset() INLINE nPage:= 0,nView:= 0,::nIcoCol:= 0,::nIcoRow:= 0 // Victor Daniel Cuatecatl Le贸n 12/Ago/2013
ENDCLASS
//----------------------------------------------------------------------------//
METHOD New( nRow, nCol, aIcons, aPrompts, aActions, ;
聽 聽 聽 聽 聽 聽 oWnd, nHelpId, lNoBorder, bChange, nWidth, nHeight, cMsg, ;
聽 聽 聽 聽 聽 聽 lPixel, lVScroll, lHScroll, nClrFore, nClrBack, ;
聽 聽 聽 聽 聽 聽 oFont, oCursor, lDesign, LUPDATE ) CLASS TIconGroup
聽 聽#ifdef __XPP__
聽 聽 聽 #undef New
聽 聽#endif
聽 聽DEFAULT aIcons := {}, aPrompts := {}, aActions := {}
聽 聽DEFAULT nHelpId:= 0
聽 聽DEFAULT nRow := 0, nCol := 0, oWnd := GetWndDefault()
聽 聽DEFAULT lNoBorder := .f., lVScroll := .f., lHScroll := .f.
聽 聽DEFAULT nClrFore := GetSysColor( COLOR_WINDOWTEXT ),;
聽 聽 聽 聽 聽 聽nClrBack := GetSysColor( COLOR_WINDOW )
聽 聽DEFAULT nWidth 聽:= 100, nHeight := 100,;
聽 聽 聽 聽 聽 聽LUPDATE := .f., lDesign := .f.
聽 聽::aIcons 聽 聽= aIcons
聽 聽::aPrompts 聽= aPrompts
聽 聽::aActions 聽= aActions
聽 聽::nTop 聽 聽 聽= IF( lPixel, nRow, nRow * WIN_CHARPIX_H ) //16
聽 聽::nLeft 聽 聽 = IF( lPixel, nCol, nCol * WIN_CHARPIX_W ) //8
聽 聽::nBottom 聽 = ::nTop 聽+ nHeight
聽 聽::nRight 聽 聽= ::nLeft + nWidth
聽 聽::bChange 聽 = bChange
聽 聽::oWnd 聽 聽 聽= oWnd
聽 聽::nStyle 聽 聽= nOR( IF( lNoBorder, 0, WS_BORDER ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 IF( lVScroll, WS_VSCROLL, 0 ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 IF( lHScroll, WS_HSCROLL, 0 ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 WS_CHILD, WS_VISIBLE, WS_GROUP, WS_TABSTOP,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 IF( lDesign, WS_CLIPSIBLINGS, 0 ) )
聽 聽::nId 聽 聽 聽 = ::GetNewId()
聽 聽::lStatic 聽 = .f.
聽 聽::lDrag 聽 聽 = lDesign
聽 聽::lCaptured = .f.
聽 聽::lEdit 聽 聽 = .f.
聽 聽::oFont 聽 聽 = oFont
聽 聽::oCursor 聽 = oCursor
聽 聽::cMsg 聽 聽 聽= cMsg
聽 聽::LUPDATE 聽 = LUPDATE
聽 聽::lAutoEdit := .f.
聽 聽#ifdef __XPP__
聽 聽 聽 ::nVScroll = 0
聽 聽 聽 ::nHScroll = 0
聽 聽#endif
聽 聽::SETCOLOR( nClrFore, nClrBack )
聽 聽::Register( nOR( CS_VREDRAW, CS_HREDRAW ) )
聽 聽IF ! EMPTY( oWnd:hWnd )
聽 聽 聽 ::CREATE()
聽 聽 聽 ::DEFAULT()
聽 聽 聽 聽oWnd:AddControl( Self )
聽 聽ELSE
聽 聽 聽 oWnd:DefControl( Self )
聽 聽ENDIF
聽 聽IF lDesign
聽 聽 聽 ::CheckDots()
聽 聽ENDIF
RETURN Self
//----------------------------------------------------------------------------//
METHOD REDEFINE( nId, aIcons, aPrompts, aActions, oWnd, nHelpId, bChange, cMsg, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽nClrFore, nClrBack, oFont, oCursor, LUPDATE ) CLASS TIconGroup
聽 聽DEFAULT aIcons := {}, aPrompts := {}, aActions := {}
聽 聽DEFAULT nClrFore := GetSysColor( COLOR_WINDOWTEXT ),;
聽 聽 聽 聽 聽 聽nClrBack := GetSysColor( COLOR_WINDOW )
聽 聽DEFAULT LUPDATE := .f., oWnd := GetWndDefault()
聽 聽DEFAULT nHelpId := 0
聽 聽
聽 聽::aIcons 聽 聽= aIcons
聽 聽::aPrompts 聽= aPrompts
聽 聽::aActions 聽= aActions
聽 聽::nId 聽 聽 聽 = nId
聽 聽::bChange 聽 = bChange
聽 聽::oWnd 聽 聽 聽= oWnd
聽 聽::lStatic 聽 = .f.
聽 聽::lDrag 聽 聽 = .f.
聽 聽::lCaptured = .f.
聽 聽::lEdit 聽 聽 = .f.
聽 聽::oFont 聽 聽 = oFont
聽 聽::oCursor 聽 = oCursor
聽 聽::cMsg 聽 聽 聽= cMsg
聽 聽::LUPDATE 聽 = LUPDATE
聽 聽::lAutoEdit := .f.
聽 聽#ifdef __XPP__
聽 聽 聽 ::nVScroll = 0
聽 聽 聽 ::nHScroll = 0
聽 聽#endif
聽 聽::SETCOLOR( nClrFore, nClrBack )
聽 聽::Register( nOR( CS_VREDRAW, CS_HREDRAW ) )
聽 聽IF oWnd != Nil
聽 聽 聽 oWnd:DefControl( Self )
聽 聽ENDIF
RETURN Self
//----------------------------------------------------------------------------//
METHOD SetVScroll() CLASS TIconGroup
聽 DEFINE SCROLLBAR ::oVScroll OF Self ;
聽 聽 聽 聽VERTICAL ;
聽 聽 聽 聽RANGE 0, 1 ;
聽 聽 聽 聽PAGESTEP 1 ;
聽 聽 聽 聽ON UP ::_VScroll( -STEP_VSCROLL ) ;
聽 聽 聽 聽ON DOWN ::_VScroll( STEP_VSCROLL ) /*;
聽 聽 聽 聽ON PAGEUP ::_VScroll( 1 * -STEP_VSCROLL) ;
聽 聽 聽 聽ON PAGEDOWN ::_VScroll( 1 * STEP_VSCROLL )*/
聽 ::oVSCroll:bPos := {| nPos | ::_VScroll( ( nPos - ::oVScroll:GetPos() ) * STEP_VSCROLL ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::oVScroll:SETPOS(nPos) }
聽 ::oVSCroll:bTrack := ::oVSCroll:bPos
RETURN Nil
//----------------------------------------------------------------------------//
METHOD SetHScroll() CLASS TIconGroup
聽 聽DEFINE SCROLLBAR ::oHScroll OF Self ;
聽 聽 聽 聽HORIZONTAL ;
聽 聽 聽 聽RANGE 0, 0 ;
聽 聽 聽 聽PAGESTEP 1 ;
聽 聽 聽 聽ON UP ::_HScroll( -STEP_HSCROLL ) ;
聽 聽 聽 聽ON DOWN ::_HScroll( STEP_HSCROLL ) ;
聽 聽 聽 聽ON PAGEUP ::_HScroll( 1 * -STEP_HSCROLL) ;
聽 聽 聽 聽ON PAGEDOWN ::_HScroll( 1 * STEP_HSCROLL )
聽 ::oHSCroll:bPos := {| nPos | ::_HSCroll( ( nPos - ::oHSCroll:GetPos() ) * STEP_HSCROLL ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::oHSCroll:SETPOS(nPos) }
聽 ::oHSCroll:bTrack := ::oHSCroll:bPos
RETURN Nil
//----------------------------------------------------------------------------//
METHOD SetScrollRange() CLASS TIconGroup
LOCAL nVMax, nHMax
LOCAL aAway := ::aGetAway()
LOCAL nAlto := ::nBottom - ::nTop
聽
聽 IF LEN( ::aIcons ) = 0
聽 聽 聽nVMax := 0
聽 聽 聽nHMax := 0
聽 ELSE
聽 聽 聽nVMax := aAway[ 1 ]
聽 聽 聽nHMax := aAway[ 2 ]
IF nVMax <> nFirst .AND. nFirst > 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 01/Sep/2013
聽 聽 ::nIcoRow:= ::nIcoRow + 1
ENDIF
IF nHMax <> nLast 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 01/Sep/2013
聽 聽 ::nIcoCol:= ::nIcoCol + 1
ENDIF
nFirst:= nVMax 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 01/Sep/2013
聽nLast:= nHMax 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 01/Sep/2013
聽
IF LEN(::aIcons) > (::nIcoRow * ::nIcoCol) 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 01/Sep/2013
聽 聽 ::nIcoRow:= ::nIcoRow + 1
ENDIF
聽 nVMax := IF( nVMax < nAlto .AND. ::nVScroll = 0, ; 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 02/Sep/2013
聽 聽 聽 聽 聽 聽 聽 (0), (nView:= nView + 1,(((nVMax - nAlto) + STEP_VCOORS) / STEP_VSCROLL)))
聽 聽
聽 聽
聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 nHMax := IF( nHMax < ( (::nRight - ::nLeft) - STEP_HCOORS ) .AND. ::nHScroll = 0, ;
聽 聽 聽 聽 聽 聽 聽 (0), ( nHMax - SOURCE_HCOORS ) / STEP_HSCROLL )
聽 ENDIF
聽 IF ::oVScroll != Nil
聽 聽 聽::oVScroll:SetRange( 0, nVMax)
聽 聽 聽::oVScroll:SETPOS( ::nVScroll )
聽 ENDIF
聽 IF ::oHScroll != Nil
聽 聽 聽::oHScroll:SetRange( 0, nHMax )
聽 聽 聽::oHScroll:SETPOS( ::nHScroll )
聽 ENDIF
nScrPos:= (nVMax / ::nIcoRow)
聽 nDown:= nScrPos
RETURN Nil
//----------------------------------------------------------------------------//
METHOD DEFAULT() CLASS TIconGroup
聽 聽LOCAL nLen
聽 聽LOCAL aRect := GetCoors( ::hWnd )
聽 聽LOCAL nIcons 聽 := LEN( ::aIcons )
聽 聽LOCAL nPrompts := LEN( ::aPrompts )
聽 聽LOCAL nActions := LEN( ::aActions )
聽 聽IF ::oFont != Nil
聽 聽 聽 ::SetFont( ::oFont )
聽 聽ELSE
聽 聽 聽 ::SetFont( ::oWnd:oFont )
聽 聽ENDIF
聽 聽IF lAnd( GetWindowLong( ::hWnd, GWL_STYLE ), WS_VSCROLL )
聽 聽 聽 ::SetVScroll()
聽 聽ENDIF
聽 聽IF lAnd( GetWindowLong( ::hWnd, GWL_STYLE ), WS_HSCROLL )
聽 聽 聽 ::SetHScroll()
聽 聽ENDIF
聽 聽::nTop 聽 聽= aRect[1]
聽 聽::nLeft 聽 = aRect[2]
聽 聽::nBottom = aRect[3]
聽 聽::nRight 聽= aRect[4]
聽 聽nLen = MAX( nIcons, nPrompts )
聽 聽IF nLen == 0
聽 聽 聽 ::aIcons := {}
聽 聽 聽 ::aPrompts := {}
聽 聽 聽 ::aActions := {}
聽 聽 聽 ::aCoors := {}
聽 聽 聽 ::aOrder := {}
聽 聽 聽 ::nFocused 聽= 0
聽 聽ELSE
聽 聽 聽 ASIZE( ::aIcons, nLen ); 聽 AFILL( ::aIcons, "", nIcons + 1 )
聽 聽 聽 AEVAL( ::aIcons, {| cIcon, nAt | ::aIcons[ nAt ] := IF( FILE( cIcon ), ;
聽 聽 聽 聽 聽 聽 聽ExtractIcon( cIcon ), LoadIcon( GetResources(), cIcon ) ) } )
聽 聽 聽 // AEval( ::aPrompts, {| cPrompt, nPrompt | ::aPrompts[ nPrompt ] += Chr(0) } )
聽 聽 聽 ASIZE( ::aPrompts, nLen ); AFILL( ::aPrompts, "", nPrompts + 1 )
聽 聽 聽 ASIZE( ::aActions, nLen ); AFILL( ::aActions, {|| Nil }, nActions + 1 )
聽 聽 聽 ::aCoors = ARRAY( nLen, 8 )
聽 聽 聽 ::aOrder = ARRAY( nLen )
聽 聽 聽 ::nFocused 聽= 1
聽 聽ENDIF
聽 聽::Adjust(); ::DISPLAY(); ::SetScrollRange()
RETURN Nil
//----------------------------------------------------------------------------//
METHOD GetDlgCode( nLastKey ) CLASS TIconGroup
聽 聽IF .not. ::oWnd:lValidating
聽 聽 聽 IF nLastKey == VK_RETURN .OR. nLastKey == VK_TAB
聽 聽 聽 聽 聽::oWnd:nLastKey = nLastKey
聽 聽 聽 ENDIF
聽 聽ENDIF
RETURN DLGC_WANTALLKEYS
//----------------------------------------------------------------------------//
METHOD PAINT() CLASS TIconGroup
聽 聽LOCAL n, nAt
聽 聽LOCAL hDC, hFont
聽 聽hDC 聽 := GetDC( ::hWnd )
聽 聽hFont := IF( ::oFont != Nil, ::oFont:hFont, 0 )
聽 聽FOR n := 1 TO LEN( ::aOrder )
聽 聽 聽 nAt := ::aOrder[ n ]
聽 聽 聽 ::aCoors[ nAt ] = ExtDrawIcon( hDC, ::aCoors[ nAt, 1 ], ::aCoors[ nAt, 2 ], ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ::aIcons[ nAt ], ::aPrompts[ nAt ], hFont, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ::nClrText, ::nClrPane, .f., .f., ::lEdit )
聽 聽NEXT
聽 聽ReleaseDC( ::hWnd, hDC )
聽 聽::ShowFocus( ::lFocused )
RETURN Super:PAINT()
//----------------------------------------------------------------------------//
METHOD _VScroll( nMove ) CLASS TIconGroup
聽 LOCAL aRect := GetClientRect( ::hWnd )
聽 IF ( ::nVScroll + nMove ) < 0
聽 聽 聽nMove := -::nVScroll
聽 ENDIF
聽 IF ( ::nVScroll + nMove ) > ( ::oVScroll:nMax * STEP_VSCROLL )
聽 聽 聽nMove := ( ::oVScroll:nMax * STEP_VSCROLL ) - ::nVScroll
聽 ENDIF
聽 AEVAL( ::aCoors, {| aCoor | aCoor[ 1 ] -= nMove } )
聽 ScrollWindow( ::hWnd, 0, -nMove, aRect, aRect )
聽 ::nVScroll += nMove
RETURN Nil
//----------------------------------------------------------------------------//
METHOD _HScroll( nMove ) CLASS TIconGroup
聽 LOCAL aRect := GetClientRect( ::hWnd )
聽 IF ( ::nHScroll + nMove ) < 0
聽 聽 聽nMove := -::nHScroll
聽 ENDIF
聽 IF ( ::nHScroll + nMove ) > ( ::oHScroll:nMax * STEP_HSCROLL )
聽 聽 聽nMove := ( ::oHScroll:nMax * STEP_HSCROLL ) - ::nHScroll
聽 ENDIF
聽 AEVAL( ::aCoors, {| aCoor | aCoor[ 2 ] -= nMove } )
聽 ScrollWindow( ::hWnd, -nMove, 0, aRect, aRect )
聽 ::nHScroll += nMove
RETURN Nil
//----------------------------------------------------------------------------//
METHOD ShowFocus( lFocused ) CLASS TIconGroup
聽 聽LOCAL nAt := ::nFocused
聽 聽LOCAL hDC, hFont
聽 聽IF nAt == 0
聽 聽 聽 RETURN Nil
聽 聽ENDIF
聽 聽hDC 聽 := GetDC( ::hWnd )
聽 聽hFont := IF( ::oFont != Nil, ::oFont:hFont, 0 )
聽 聽::aCoors[ nAt ] = ExtDrawIcon( hDC, ::aCoors[ nAt, 1 ], ::aCoors[ nAt, 2 ], ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ::aIcons[ nAt ], ::aPrompts[ nAt ], hFont, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ::nClrText, ::nClrPane, lFocused, .t., ::lEdit )
聽 聽ReleaseDC( ::hWnd, hDC )
RETURN Nil
//----------------------------------------------------------------------------//
METHOD ChangeFocus( nFocused ) CLASS TIconGroup
聽 聽LOCAL nAt := ::nFocused
聽 聽LOCAL hDC, hFont
聽 聽IF nAt == 0 .OR. nAt == nFocused
聽 聽 聽 RETURN Nil
聽 聽ENDIF
聽 聽hDC 聽 := GetDC( ::hWnd )
聽 聽hFont := IF( ::oFont != Nil, ::oFont:hFont, 0 )
聽 聽ExtDrawIcon( hDC, ::aCoors[ nAt, 1 ], ::aCoors[ nAt, 2 ], ;
聽 聽 聽 聽 聽 聽 聽 聽 ::aIcons[ nAt ], ::aPrompts[ nAt ], hFont, ;
聽 聽 聽 聽 聽 聽 聽 聽 ::nClrText, ::nClrPane, .f., .f., .f. )
聽 聽ExtDrawIcon( hDC, ::aCoors[ nFocused, 1 ], ::aCoors[ nFocused, 2 ], ;
聽 聽 聽 聽 聽 聽 聽 聽 ::aIcons[ nFocused ], ::aPrompts[ nFocused ], hFont,;
聽 聽 聽 聽 聽 聽 聽 聽 ::nClrText, ::nClrPane, ::lFocused, .t., .f. )
聽 聽ReleaseDC( ::hWnd, hDC )
聽 聽::nFocused = nFocused
聽 聽ADEL( ::aOrder, ASCAN( ::aOrder, ::nFocused ) )
聽 聽::aOrder[ LEN( ::aIcons ) ] := ::nFocused
聽 聽::lEdit := .f.
聽 聽IF ::bChange != Nil
聽 聽 聽 EVAL( ::bChange )
聽 聽ENDIF
RETURN Nil
//----------------------------------------------------------------------------//
METHOD nGetDown( nRow, nCol ) CLASS TIconGroup
聽 LOCAL n, nAt, nDown := 0
聽 聽 聽FOR n := LEN( ::aOrder ) TO 1 step -1
聽 聽 聽 nAt := ::aOrder[ n ]
聽 聽 聽 IF nRow >= ::aCoors[ nAt, 1 ] .AND. nRow <= ::aCoors[ nAt, 3 ] .AND. ;
聽 聽 聽 聽 聽nCol >= ::aCoors[ nAt, 2 ] .AND. nCol <= ::aCoors[ nAt, 4 ]
聽 聽 聽 聽 聽nDown := nAt
聽 聽 聽 聽 聽EXIT
聽 聽 聽 ENDIF
聽 聽 聽 IF nRow >= ::aCoors[ nAt, 5 ] .AND. nRow <= ::aCoors[ nAt, 7 ] .AND. ;
聽 聽 聽 聽 聽nCol >= ::aCoors[ nAt, 6 ] .AND. nCol <= ::aCoors[ nAt, 8 ]
聽 聽 聽 聽 聽::lEdit := .t.
聽 聽 聽 聽 聽nDown := nAt
聽 聽 聽 聽 聽EXIT
聽 聽 聽 ENDIF
聽 NEXT
RETURN nDown
//----------------------------------------------------------------------------//
METHOD LButtonDown( nRow, nCol, nFlags ) CLASS TIconGroup
聽 聽LOCAL nAt := ::nGetDown( nRow, nCol )
聽 聽IF !::lFocused
聽 聽 聽 ::SetFocus()
聽 聽ENDIF
聽 聽IF nAt = 0
聽 聽 聽 ::lEdit := .f.
聽 聽ELSE
聽 聽 聽 ::ChangeFocus( nAt )
聽 聽ENDIF
聽 聽IF nAt = 0 .OR. ::lStatic .OR. ::lDrag
聽 聽 聽 RETURN Super:LButtonDown( nRow, nCol, nFlags )
聽 聽ENDIF
聽 聽IF ! ::lCaptured
聽 聽 聽 ::lCaptured = .t.
聽 聽 聽 ::Capture()
聽 聽 聽 ::Invert( , , nRow, nCol )
聽 聽ENDIF
聽 聽Super:LButtonDown( nRow, nCol, nFlags )
RETURN Nil
//----------------------------------------------------------------------------//
METHOD LButtonUp( nRow, nCol, nFlags ) CLASS TIconGroup
聽 聽LOCAL nAt
聽 聽IF ( ::lStatic .AND. !::lEdit ) .OR. ::lDrag
聽 聽 聽 RETURN Super:LButtonUp( nRow, nCol, nFlags )
聽 聽ENDIF
聽 聽IF ::lCaptured
聽 聽 聽 ::lCaptured = .f.
聽 聽 聽 ReleaseCapture()
聽 聽 聽 ::Invert()
聽 聽 聽 ::PAINT(); ::SetScrollRange()
聽 聽ENDIF
聽 聽IF ::lEdit
聽 聽 聽 IF ::lAutoEdit
聽 聽 聽 聽 聽nAt := ::nFocused
聽 聽 聽 聽 聽::EditPrompt( nAt, ::aPrompts[ nAt ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{|uVar| IF( uVar != Nil, ::aPrompts[ nAt ] := uVar, ), ::DrawIcon( nAt ) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽GetSysColor( COLOR_WINDOWTEXT ), GetSysColor( COLOR_CAPTIONTEXT ) ) // ::nClrText, ::nClrPane
聽 聽 聽 ELSE
聽 聽 聽 聽 聽::lEdit := .f.
聽 聽 聽 聽 聽::PAINT(); ::SetScrollRange()
聽 聽 聽 ENDIF
聽 聽ELSE
聽 聽 聽 ::lEdit := .f.
聽 聽ENDIF
聽 聽Super:LButtonUp( nRow, nCol, nFlags )
RETURN Nil
//----------------------------------------------------------------------------//
METHOD MouseMove( nRow, nCol, nKeyFlags ) CLASS TIconGroup
聽 聽IF ::lStatic .OR. ::lDrag
聽 聽 聽 RETURN Super:MouseMove( nRow, nCol, nKeyFlags )
聽 聽ENDIF
聽 聽IF ::lCaptured
聽 聽 聽 ::Invert( nRow, nCol )
聽 聽 聽 ::lEdit := .f.
聽 聽 聽 RETURN 0
聽 聽ELSE
聽 聽 聽 ::oWnd:SetMsg( ::cMsg )
聽 聽ENDIF
聽 聽IF ::oCursor != Nil
聽 聽 聽 SETCURSOR( ::oCursor:hCursor )
聽 聽ELSE
聽 聽 聽 CursorArrow()
聽 聽ENDIF
RETURN 0
//----------------------------------------------------------------------------//
METHOD LDblClick( nRow, nCol, nKeyFlags ) CLASS TIconGroup
聽 聽LOCAL nAt := ::nGetDown( nRow, nCol )
聽 聽IF nAt == 0
聽 聽 聽 RETURN Super:LDblClick( nRow, nCol, nKeyFlags )
聽 聽ENDIF
聽 聽::lEdit:= .f.
聽 聽EVAL( ::aActions[ nAt ], Self )
RETURN Nil
//----------------------------------------------------------------------------//
METHOD EditPrompt( nAt, uVar, bValid, nClrFore, nClrBack ) CLASS TIconGroup
聽 聽LOCAL oFont
聽 聽LOCAL nWidth, nHeight
聽 聽LOCAL aDim, aPos
聽 聽uVar := STRTRAN( uVar, CHR(10), CRLF )
聽 聽aDim 聽 := ::aCoors[ nAt ]
聽 聽aPos := { aDim[5] - 1, aDim[6] - 1 }
聽 聽nWidth 聽:= MAX( aDim[8] - aDim[6] + 1, 26 )
聽 聽nHeight := aDim[7] - aDim[5] + 2
聽 聽// ScreenToClient( Self:hWnd, aPos )
聽 聽DEFAULT nClrFore := ::nClrText ,;
聽 聽 聽 聽 聽 聽nClrBack := ::nClrPane ,;
聽 聽 聽 聽 聽 聽bValid 聽 := {|| Nil }
聽 聽IF ::oGet != Nil .AND. ! EMPTY( ::oGet:hWnd )
聽 聽 聽 ::oGet:END()
聽 聽ENDIF
聽 聽IF ::oFont != Nil
聽 聽 聽 oFont = TFont():New( ::oFont:cFaceName, ::oFont:nWidth,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::oFont:nHeight, .f., ::oFont:lBold )
聽 聽ENDIF
聽 聽::oGet:=TIconGet():New( aPos[ 1 ], aPos[ 2 ], bSETGET( uVar ), Self,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽nWidth, nHeight, oFont,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽nClrFore, nClrBack )
聽 聽::nLastKey := 0
聽 聽// ::Set3dLook()
聽 聽::oGet:SetFocus()
聽 聽::oGet:SelectAll()
聽 聽::oGet:bLostFocus := {|| uVar := STRTRAN( ::oGet:cText(), CRLF, " " ),;
聽 聽 聽 IF( Self:nLastKey != VK_ESCAPE,;
聽 聽 聽 EVAL( bValid, uVar, Self:nLastKey ),;
聽 聽 聽 EVAL( bValid, Nil, Self:nLastKey ) ),;
聽 聽 聽 ::oGet:END(), ::lEdit:= .f. }
聽 聽::oGet:bKeyDown := { | nKey | IF( nKey == VK_RETURN .OR. ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽nKey == VK_ESCAPE, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 (Self:nLastKey := nKey, ::oGet:END(), ::lEdit := .f. ),) }
RETURN .f.
//----------------------------------------------------------------------------//
METHOD aGetAway() CLASS TIconGroup
聽 LOCAL nRow := 0, nCol := 0
聽 IF !EMPTY( ::aCoors )
聽 聽 聽AEVAL( ::aCoors, { | aCoor | nRow := MAX( nRow, aCoor[ 1 ] ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 nCol := MAX( nCol, aCoor[ 2 ] ) } )
聽 ENDIF 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
RETURN({ nRow + ::nVScroll, nCol + ::nHScroll })
聽 聽
聽 聽
//----------------------------------------------------------------------------//
METHOD nGetTail() CLASS TIconGroup
聽
聽 LOCAL nRow, nCol
聽 LOCAL nTail := LEN( ::aIcons )
聽 IF nTail > 0
聽
聽 聽 聽nRow := ::aCoors[ nTail, 1 ]
聽 聽 聽AEVAL( ::aCoors, { | aCoor, nCoor | IF( aCoor[ 1 ] > nRow, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ( nRow := aCoor[ 1 ], nTail := nCoor ), Nil ) } )
聽 聽 聽nCol := ::aCoors[ nTail, 1 ]
聽 聽 聽AEVAL( ::aCoors, { | aCoor, nCoor | IF( aCoor[ 1 ] = nRow .AND. aCoor[ 2 ] > nCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ( nCol := aCoor[ 2 ], nTail := nCoor ), Nil ) } )
聽 ENDIF 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
RETURN( nTail )
聽 聽 聽
//----------------------------------------------------------------------------//
METHOD DrawIcon( nAt ) CLASS TIconGroup
聽 LOCAL hDC, hFont
聽
聽 hDC 聽 := GetDC( ::hWnd )
聽 hFont := IF( ::oFont != Nil, ::oFont:hFont, 0 )
聽 ::aCoors[ nAt ] = ExtDrawIcon( hDC, ::aCoors[ nAt, 1 ], ::aCoors[ nAt, 2 ], ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aIcons[ nAt ], ::aPrompts[ nAt ], hFont, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::nClrText, ::nClrPane, .f., .f., ::lEdit )
聽 ReleaseDC( ::hWnd, hDC )
聽 聽
RETURN Nil
聽 聽 聽
//----------------------------------------------------------------------------//
METHOD Add( hIcon, cPrompt, bAction ) CLASS TIconGroup
聽 LOCAL nAt := LEN( ::aIcons ) + 1
聽
聽 LOCAL nTail := ::nGetTail()
聽 LOCAL nX := SOURCE_HCOORS, nY := SOURCE_VCOORS
聽
聽 LOCAL aRect := GetClientRect( ::hWnd )
聽 DEFAULT hIcon := 0, cPrompt := "", bAction := {|| Nil }
聽
聽 IF hIcon == 0 .AND. cPrompt == ""
聽 聽 聽RETURN Nil
聽 ENDIF
聽 IF nAt > 1
聽 聽 聽nY := ::aCoors[ nTail, 1 ] 聽
聽 聽 聽nX := ::aCoors[ nTail, 2 ]
聽 聽 聽
聽 聽 聽nX += STEP_HCOORS
聽 聽 聽IF nX + LAPSTEP_HCOORS > aRect[4]
聽 聽 聽 聽 nX := SOURCE_HCOORS
聽 聽 聽 聽 nY += STEP_VCOORS
聽 聽 聽END
聽 ELSE 聽
聽 聽 聽::nFocused := 1
聽 ENDIF 聽
聽 AADD( ::aIcons, hIcon )
聽 AADD( ::aPrompts, cPrompt )
聽 AADD( ::aActions, bAction )
聽
聽 AADD( ::aCoors, { nY, nX, 0, 0, 0, 0, 0, 0 } ) 聽
聽 AADD( ::aOrder, nAt )
聽 ::DrawIcon( nAt ); ::SetScrollRange()
聽
聽 ::Refresh( .f. )
RETURN Nil
//----------------------------------------------------------------------------//
METHOD Modify( hIcon, cPrompt, bAction, nAt ) CLASS TIconGroup
聽 DEFAULT hIcon := 0, cPrompt := "", bAction := {|| Nil }
聽
聽 IF ( hIcon == 0 .AND. cPrompt == "" ) .OR. ;
聽 聽 聽nAt > LEN( ::aIcons)
聽 聽 聽RETURN Nil
聽 ENDIF
聽 IF ::aIcons[ nAt ] != 0
聽 聽 聽DestroyIcon( ::aIcons[ nAt ] )
聽 ENDIF 聽
聽
聽 ::aIcons[ nAt ] := hIcon
聽 ::aPrompts[ nAt ] := cPrompt
聽 ::aActions[ nAt ] := bAction
聽 ::DrawIcon( nAt ); ::SetScrollRange()
聽
聽 ::Refresh( .t. )
RETURN Nil
//----------------------------------------------------------------------------//
METHOD Del( nAt ) CLASS TIconGroup
聽 LOCAL nLen := LEN( ::aIcons ) - 1
聽 IF nAt > nLen + 1 .OR. nAt = 0 .OR. nLen < 0
聽 聽 聽RETURN Nil
聽 ENDIF
聽
聽 ADEL( ::aIcons, nAt ); 聽 ASIZE( ::aIcons, nLen )
聽 ADEL( ::aPrompts, nAt ); ASIZE( ::aPrompts, nLen )
聽 ADEL( ::aActions, nAt ); ASIZE( ::aActions, nLen )
聽 ADEL( ::aCoors, nAt ); 聽 ASIZE( ::aCoors, nLen )
聽 ADEL( ::aOrder, ASCAN( ::aOrder, nAt ) ); ASIZE( ::aOrder, nLen )
聽 AEVAL( ::aOrder, {|u,n| IF( u > nAt, ::aOrder[ n ] := u - 1, ) } )
聽 IF nAt < ::nFocused
聽 聽 聽::nFocused--
聽 ELSEIF nAt == ::nFocused
聽 聽 聽::nFocused := IF( nLen == 0, 0, 1 )
聽 ENDIF 聽
聽
聽 ::SetScrollRange()
聽
聽 ::Refresh()
聽
聽 IF nLen == 0
聽 ::Reset() 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 01/Sep/2013
聽 ENDIF
聽
RETURN Nil
//----------------------------------------------------------------------------//
METHOD KeyDown( nKey, nFlags ) CLASS TIconGroup 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 12/Ago/2013
LOCAL cPrompt, nNewPos
LOCAL 聽 聽 nAt:= ::nFocused
LOCAL 聽nSteep:= ::nIcoCol
LOCAL 聽 聽nLen:= LEN(::aIcons)
LOCAL nVisibl:= nLen - nView
LOCAL 聽 聽XPos:= STEP_VCOORS * (nVisibl / ::nIcoCol)
LOCAL 聽nRango:= (::oVScroll:GetRange()[2] / ::nIcoRow) * (nVisibl / ::nIcoCol)
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽DO CASE
聽 聽 聽 CASE nKey == VK_UP
聽 聽 聽 聽 聽 聽 IF nAT <= nLen .AND. nAt - nSteep >= 1
聽 聽 聽 聽 聽 聽 nDown:= nDown - nScrPos
聽 聽 聽 聽 聽 聽 聽 聽 nAt:= nAt - nSteep
聽 聽 聽 聽 聽 聽ENDIF 聽
聽 聽 聽 聽 聽 聽::oVScroll:SETPOS(nDown)
聽 聽 聽 聽 聽 聽::_VScroll((-STEP_VSCROLL * 4.5))
聽 聽 聽 聽 聽 聽::ChangeFocus(nAt) 聽 聽 聽 聽 聽
聽 聽 聽 聽 聽 聽RETURN 0
聽 聽 聽 聽 聽 聽 聽 聽
聽 聽 聽 CASE nKey == VK_DOWN
聽 聽 聽 聽 聽 聽IF nAT >= 1 .AND. nAt + nSteep <= nLen
聽 聽 聽 聽 聽 聽nDown:= nDown + nScrPos
聽 聽 聽 聽 聽 聽 聽 聽nAt:= nAt + nSteep
聽 聽 聽 聽 聽 聽ELSEIF nAT > nLen
聽 聽 聽 聽 聽 聽 聽 聽nAt:= nLen
聽 聽 聽 聽 聽 聽ENDIF
聽
聽 聽 聽 聽 聽 聽::oVScroll:SETPOS(nDown)
聽 聽 聽 聽 聽 聽::_VScroll((STEP_VSCROLL * 4.5))
聽 聽 聽 聽 聽 聽::ChangeFocus(nAt) 聽 聽 聽 聽
聽 聽 聽 聽 聽 聽RETURN 0
聽 聽 聽 CASE nKey == VK_LEFT
聽 聽 聽 聽 聽 聽IF nAT > 1
聽 聽 聽 聽 聽 聽 聽 nAt:= nAt - 1
聽 聽 聽 聽 聽 聽ENDIF 聽
聽 聽 聽 聽 聽 聽::ChangeFocus( nAt )
聽 聽 聽 聽 聽 聽::oVScroll:SETPOS(nAt)
聽 聽 聽 聽 聽 聽RETURN 0
聽 聽 聽 聽 聽 聽
聽 聽 聽 CASE nKey == VK_RIGHT
聽 聽 聽 聽 聽 聽IF nAT < nLen
聽 聽 聽 聽 聽 聽 聽 nAt:= nAt + 1
聽 聽 聽 聽 聽 聽ENDIF 聽
聽 聽 聽 聽 聽 聽::ChangeFocus(nAt)
聽 聽 聽 聽 聽 聽::oVScroll:SETPOS(nAt)
聽 聽 聽 聽 聽 聽RETURN 0
聽 聽 聽
聽 聽 聽 CASE nKey == VK_HOME
聽 聽 聽 聽 聽 聽::oVScroll:SETPOS(1)
聽 聽 聽 聽 聽 聽::_VScroll((-STEP_VSCROLL * (nLen+::nIcoRow)))
聽 聽 聽 聽 聽 聽::ChangeFocus(1)
聽 聽 聽 聽 聽 聽
聽 聽 聽 聽 聽 聽RETURN 0
聽 聽 聽 CASE nKey == VK_END
聽 聽 聽 聽 聽 聽::oVScroll:SETPOS(nLen)
聽 聽 聽 聽 聽 聽::_VScroll((STEP_VSCROLL * (nLen +::nIcoRow)))
聽 聽 聽 聽 聽 聽::ChangeFocus(nLen)
聽 聽 聽 聽 聽 聽::Refresh() 聽 聽 聽 聽 聽
聽 聽 聽 聽 聽 聽RETURN 0
聽 聽 聽 CASE nKey == VK_PRIOR
聽 聽 聽 聽 聽 聽 nAt:= nAt - nVisibl
聽 聽 聽 聽 聽 聽 IF nAt < 1
聽 聽 聽 聽 聽 聽 聽 ::ChangeFocus(1)
聽 聽 聽 聽 聽 聽 ELSE
聽 聽 聽 聽 聽 聽 聽 ::ChangeFocus(nAt)
聽 聽 聽 聽 聽 聽 聽 nPage:= nPage - nRango
聽 聽 聽 聽 聽 聽 ENDIF
聽 聽 聽 聽 聽 聽
聽 聽 聽 聽 聽 聽 nNewPos:= ::oVScroll:GetPos()
聽 聽 聽 聽 聽 聽 IF nNewPos >= 0
聽 聽 聽 聽 聽 聽 聽 聽::_VScroll(-XPos)
聽 聽 聽 聽 聽 聽 聽 聽::oVScroll:SETPOS(nPage)
聽 聽 聽 聽 聽 聽 ENDIF
聽 聽 聽 聽 聽 聽
聽 聽 聽 聽 聽 聽RETURN 0
聽 聽 聽 聽 聽 聽 聽 聽
聽 聽 聽 CASE nKey == VK_NEXT
聽 聽 聽 聽 聽 聽 nAt:= nAt + nVisibl
聽 聽 聽 聽 聽 聽 IF nAt > nLen
聽 聽 聽 聽 聽 聽 聽 ::ChangeFocus(nLen)
聽 聽 聽 聽 聽 聽 聽 //nPage:= nPage + nRango
聽 聽 聽 聽 聽 聽 ELSE
聽 聽 聽 聽 聽 聽 聽 聽::ChangeFocus(nAt)
聽 聽 聽 聽 聽 聽 聽 聽nPage:= nPage + nRango
聽 聽 聽 聽 聽 聽 ENDIF
聽 聽 聽 聽 聽 聽
聽 聽 聽 聽 聽 聽 nNewPos:= ::oVScroll:GetPos()
聽 聽 聽 聽 聽 聽
聽 聽 聽 聽 聽 聽 IF nNewPos < ::oVScroll:GetRange()[2] 聽 聽 聽 聽
聽 聽 聽 聽 聽 聽 聽 聽::_VScroll(XPos)
聽 聽 聽 聽 聽 聽 聽 聽::oVScroll:SETPOS(nPage)
聽 聽 聽 聽 聽 聽 ENDIF
聽 聽 聽 聽 聽 聽 聽 聽
聽 聽 聽 聽 聽 聽RETURN 0
聽 聽 聽 CASE nKey == VK_F2
聽 聽 聽 聽 聽 聽IF ::lAutoEdit
聽 聽 聽 聽 聽 聽 聽 ::lEdit := .t.
聽 聽 聽 聽 聽 聽 聽 MSGInfo(cPrompt)
聽 聽 聽 聽 聽 聽 聽 cPrompt := ::aPrompts[nAt]
聽 聽 聽 聽 聽 聽 聽 ::EditPrompt( nAt, cPrompt,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{|uVar| IF( uVar != Nil, ::aPrompts[ nAt ] := uVar, ), ::DrawIcon( nAt ) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽GetSysColor( COLOR_WINDOWTEXT ), GetSysColor( COLOR_CAPTIONTEXT ) ) // ::nClrText, ::nClrPane
聽 聽 聽 聽 聽 聽 聽 RETURN 0
聽 聽 聽 聽 聽 聽ENDIF
聽 聽 聽 聽
聽 聽ENDCASE
RETURN Super:KeyDown( nKey, nFlags )
//----------------------------------------------------------------------------//
METHOD Invert( nRow, nCol, nRowInit, nColInit ) CLASS TIconGroup
聽 聽STATIC nInitRow, nInitCol, nOldRow, nOldCol
聽 聽
聽 聽LOCAL nAt := ::nFocused
聽 聽LOCAL lErase := .f.
聽 聽::GetDC()
聽 聽
聽 聽IF nRow = Nil .AND. nCol = Nil
聽 聽
聽 聽 聽 IF nRowInit = Nil .AND. nColInit = Nil
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽 聽 聽 聽lErase = .t. 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽 聽 聽 聽::aCoors[ nAt ] = { ::aCoors[ nAt, 1 ] + nOldRow, ::aCoors[ nAt, 2 ] + nOldCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 3 ] + nOldRow, ::aCoors[ nAt, 4 ] + nOldCol, ; 聽
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 5 ] + nOldRow, ::aCoors[ nAt, 6 ] + nOldCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 7 ] + nOldRow, ::aCoors[ nAt, 8 ] + nOldCol }
聽 聽 聽 ELSE
聽 聽 聽 聽 聽nInitRow = nRowInit
聽 聽 聽 聽 聽nInitCol = nColInit
聽 聽 聽 ENDIF
聽 聽 聽
聽 聽 聽 nRow = 0
聽 聽 聽 nCol = 0
聽 聽
聽 聽ELSE
聽 聽 聽IF nRow < 0 .OR. ( nRow + ::nTop > ::nBottom ) .OR. ;
聽 聽 聽 聽 nCol < 0 .OR. ( nCol + ::nLeft > ::nRight )
聽 聽 聽 聽 ::ReleaseDC()
聽 聽 聽 聽 RETURN Nil
聽 聽 聽ENDIF 聽
聽
聽 聽 聽nRow = nRow - nInitRow
聽 聽 聽nCol = nCol - nInitCol
聽 聽 聽DrawFocusRect( ::hDC, ::aCoors[ nAt, 1 ] + nOldRow, ::aCoors[ nAt, 2 ] + nOldCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 3 ] + nOldRow, ::aCoors[ nAt, 4 ] + nOldCol )
聽 聽 聽DrawFocusRect( ::hDC, ::aCoors[ nAt, 5 ] + nOldRow, ::aCoors[ nAt, 6 ] + nOldCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 7 ] + nOldRow, ::aCoors[ nAt, 8 ] + nOldCol )
聽 聽
聽 聽ENDIF
聽 聽DrawFocusRect( ::hDC, ::aCoors[ nAt, 1 ] + nRow, ::aCoors[ nAt, 2 ] + nCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 3 ] + nRow, ::aCoors[ nAt, 4 ] + nCol )
聽 聽DrawFocusRect( ::hDC, ::aCoors[ nAt, 5 ] + nRow, ::aCoors[ nAt, 6 ] + nCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 7 ] + nRow, ::aCoors[ nAt, 8 ] + nCol )
聽 聽
聽 聽IF lErase
聽 聽 聽 FillRect( ::hDC, { ::aCoors[ nAt, 1 ] - nOldRow, ::aCoors[ nAt, 2 ] - nOldCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 3 ] - nOldRow, ::aCoors[ nAt, 4 ] - nOldCol }, ::oBrush:hBrush )
聽 聽 聽 FillRect( ::hDC, { ::aCoors[ nAt, 5 ] - nOldRow, ::aCoors[ nAt, 6 ] - nOldCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 7 ] - nOldRow, ::aCoors[ nAt, 8 ] - nOldCol }, ::oBrush:hBrush ) 聽 聽
聽 聽ENDIF 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽nOldRow = nRow
聽 聽nOldCol = nCol
聽 聽 聽 聽
聽 聽::ReleaseDC()
RETURN Nil
//----------------------------------------------------------------------------//
METHOD Adjust() CLASS TIconGroup
聽 LOCAL nAt
聽 LOCAL nX := SOURCE_HCOORS, nY := SOURCE_VCOORS
聽 聽
聽 LOCAL aRect := GetClientRect( ::hWnd )
聽 FOR nAt:= 1 TO LEN( ::aIcons )
聽 聽 聽 ::aCoors[ nAt, 1 ] := nY
聽 聽 聽 ::aCoors[ nAt, 2 ] := nX
聽 聽 聽 ::aOrder[ nAt ] := nAt
聽 聽 聽 聽 聽 聽
聽 聽 聽 nX += STEP_HCOORS
聽 聽 聽 IF nX + LAPSTEP_HCOORS > aRect[4]
聽 聽 聽 聽 聽nX := SOURCE_HCOORS
聽 聽 聽 聽 聽nY += STEP_VCOORS
聽 聽 聽 END 聽
聽
聽 NEXT
RETURN Nil
//----------------------------------------------------------------------------//
METHOD CoorsUpdate() CLASS TIconGroup
聽 聽LOCAL aRect := GetCoors( ::hWnd )
聽 聽::nTop 聽 聽= aRect[ 1 ]
聽 聽::nLeft 聽 = aRect[ 2 ]
聽 聽::nBottom = aRect[ 3 ]
聽 聽::nRight 聽= aRect[ 4 ]
RETURN Nil
//----------------------------------------------------------------------------//
// R.Avenda帽o. 1998
//----------------------------------------------------------------------------//
METHOD MouseWheel( nKeys, nDelta ) CLASS TIconGroup 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 12/Ago/2013
LOCAL 聽 nAt := ::nFocused
LOCAL 聽nLen := LEN( ::aIcons )
聽 聽 聽 IF lAnd( nKeys, MK_MBUTTON )
聽 聽 聽 聽 聽IF nDelta > 0
聽 聽 聽 聽 聽 聽IF ++nAT > nLen
聽 聽 聽 聽 聽 聽 聽 nAt = 1
聽 聽 聽 聽 聽 聽ENDIF 聽 聽 聽 聽 聽 聽 聽
聽 聽 聽 聽 聽ELSE
聽 聽 聽 聽 聽 聽IF --nAT < 1
聽 聽 聽 聽 聽 聽 聽 nAt = nLen
聽 聽 聽 聽 聽 聽ENDIF
聽 聽 聽 聽 聽ENDIF
聽 聽 聽 聽 聽::ChangeFocus( nAt )
聽 聽 聽 聽 聽::oVScroll:SETPOS(nAt)
聽 聽 聽 ELSE
聽 聽 聽 聽
聽 聽 聽 聽 聽 聽IF nDelta > 0
聽 聽 聽 聽 聽 聽::_VScroll( -STEP_VSCROLL)
聽 聽 聽 聽 聽 聽::oVScroll:PageUp()
聽 聽 聽 聽 聽ELSE
聽 聽 聽 聽 聽 聽::_VScroll( STEP_VSCROLL)
聽 聽 聽 聽 聽 聽::oVScroll:PageDown()
聽 聽 聽 聽 聽ENDIF
聽 聽 聽 聽 聽 聽
聽 聽 ENDIF
RETURN Nil
Attempts to compile in your project file IGroup.prg before the libraries of fivewin:
The Method TICONGROUP:KEYDOWN( 879 ) does not correspond to the file IGroup.prg that modify.
In my File exist: ADEL( ::aPrompts, nAt ); ASIZE( ::aPrompts, nLen ) of METHOD Del( nAt ) CLASS TIconGroup.
Regards.