Anyway, I solved the problem using DIALOG's ON PAINT clause.
If Marco doesn't mind I can put the sample here. Marco?
#include "Fivewin.ch"
#define MO_NONE 0
#define MO_ASC 1
#define MO_DESC 2
FUNCTION MAIN()
LOCAL oDlg, oBrw, oFnt
LOCAL hBmp1 := READBITMAP( 0, "\fwharbour\bitmaps\checkon.bmp" )
LOCAL hBmp2 := READBITMAP( 0, "\fwharbour\bitmaps\checkoff.bmp" )
LOCAL aOrd := { MO_ASC, MO_DESC, MO_NONE, MO_NONE }
OVERRIDE METHOD SetPos CLASS TScrollbar WITH MySetPos
USE TEST
DEFINE DIALOG oDlg SIZE 400, 300
DEFINE FONT oFnt NAME "Arial" SIZE 0, -12
@ 0, 0 LISTBOX oBrw FIELDS TEST -> last,;
TEST -> first,;
IF( TEST -> last = "S", hBmp1, hBmp2 ),;
"";
HEADER "LAST", "FIRST", " S", hBmp1;
SIZES 100, 100, 16, 0;
FONT oFnt
oBrw:lCellStyle = .T.
oBrw:bLClicked = { | nRow, nCol | If( oBrw:nAtCol( nCol ) = 3, Cambia( oDlg, oBrw, nRow ), ) }
oBrw:bLButtonUp = { || oDlg:Refresh( .F. ) }
oDlg:bStart = { || oBrw:oHScroll:bGoUp := { || oDlg:Refresh( .F. ) },;
oBrw:oHScroll:bGoDown := { || oDlg:Refresh( .F. ) },;
oBrw:bChange := { || oDlg:Refresh( .F. ) } }
ACTIVATE DIALOG oDlg;
ON INIT oDlg:SetControl( oBrw );
ON PAINT MARCAORDINE( oDlg, hDC, oBrw, aOrd );
CENTER
CLOSE
DELETEOBJECT( hBmp1 )
DELETEOBJECT( hBmp2 )
RELEASE FONT oFnt
RETURN NIL
STATIC FUNCTION CAMBIA( oDlg, oBrw, nRow )
IF NWROW( oBrw:hWnd, oBrw:hDC, nRow, IF( oBrw:oFont != nil, oBrw:oFont:hFont, 0 ) ) = 0
RETURN NIL
ENDIF
? "Qui cambi il valore che determina la spunta"
oBrw:Refresh( .F. )
oDlg:Refresh( .F. )
RETURN NIL
#define SM_CYHSCROLL 3
STATIC FUNCTION MARCAORDINE( oDlg, hDC, oBrw, aOrd )
LOCAL aValues := oBrw:aHeaders
LOCAL aColSizes := oBrw:GetColSizes()
LOCAL nWidth := WNDWIDTH( oBrw:hWnd ) - IF( oBrw:oVScroll != nil .AND. EVAL( oBrw:bLogicLen ) > 1, GETSYSMETRICS( SM_CYHSCROLL ) + 3, 0 )
LOCAL nColStart := -1
LOCAL nTop, nLeft, nRight
LOCAL hGPen, hWPen
LOCAL i
SYSREFRESH()
hGPen = CREATEPEN( 0, 1, CLR_GRAY )
hWPen = CREATEPEN( 0, 1, CLR_WHITE )
nTop = oBrw:nTop + 6
FOR i = oBrw:nColPos TO LEN( aValues )
nLeft = nColStart + 1
nRight = MIN( nColStart := ( nLeft + aColSizes[ i ] - 1 ), nWidth )
IF nLeft > nWidth
EXIT
ENDIF
IF i == LEN( aValues )
nRight = nWidth
ENDIF
nRight -= 12
IF aOrd[ i ] = MO_ASC
MOVETO( hDC, nRight, nTop )
LINETO( hDC, nRight + 6, nTop, hGPen )
LINETO( hDC, nRight + 3, nTop + 6, hWPen )
LINETO( hDC, nRight, nTop, hGPen )
ENDIF
IF aOrd[ i ] = MO_DESC
MOVETO( hDC, nRight, nTop + 6 )
LINETO( hDC, nRight + 6, nTop + 6, hGPen )
LINETO( hDC, nRight + 3, nTop, hWPen )
LINETO( hDC, nRight, nTop + 6, hGPen )
ENDIF
NEXT
DELETEOBJECT( hWPen )
DELETEOBJECT( hGPen )
RETURN NIL
#define SB_HORZ 0
#define SB_VERT 1
#define SB_CTL 2
STATIC FUNCTION MYSETPOS( nPos )
LOCAL Self := HB_QSELF()
::oWnd:oWnd:Refresh( .F. )
RETURN SETSCROLLPOS( IF( ::lIsChild, ::oWnd:hWnd, ::hWnd ), IF( ::lIsChild, IF( ::lVertical, SB_VERT, SB_HORZ ), SB_CTL ), nPos, ::lReDraw )
#include "Fivewin.ch"
#define MO_NONE 0
#define MO_ASC 1
#define MO_DESC 2
FUNCTION MAIN()
LOCAL oDlg, oBrw
USE TEST
DEFINE DIALOG oDlg SIZE 400, 300
oBrw = TMyWBrowse():New( 0, 0, , ,;
{ || { TEST -> last, TEST -> first, "" } },;
{ "LAST", "FIRST", "" },;
{ 150, 150, 0 } )
oBrw:lCellStyle = .T.
oBrw:aOrd = { { || MO_ASC }, { || MO_DESC }, { || MO_NONE }, { || MO_NONE } }
ACTIVATE DIALOG oDlg;
ON INIT oDlg:SetControl( oBrw );
CENTER
CLOSE
RETURN NIL
CLASS TMyWBrowse FROM TWBrowse
DATA aOrd
METHOD Paint()
ENDCLASS
METHOD Paint() CLASS TMyWBrowse
Super:Paint()
MARCAORDINE( ::oWnd, ::hDC, Self, ::aOrd )
RETURN 0
#define SM_CYHSCROLL 3
STATIC FUNCTION MARCAORDINE( oDlg, hDC, oBrw, abOrd )
LOCAL aValues := oBrw:aHeaders
LOCAL aColSizes := oBrw:GetColSizes()
LOCAL nWidth := WNDWIDTH( oBrw:hWnd ) - IF( oBrw:oVScroll != nil .AND. EVAL( oBrw:bLogicLen ) > 1, GETSYSMETRICS( SM_CYHSCROLL ) + 3, 0 )
LOCAL nColStart := -1
LOCAL nTop, nLeft, nRight
LOCAL hGPen, hWPen
LOCAL i
hGPen = CREATEPEN( 0, 1, CLR_GRAY )
hWPen = CREATEPEN( 0, 1, CLR_WHITE )
nTop = oBrw:nTop + 5
FOR i = oBrw:nColPos TO LEN( aValues )
nLeft = nColStart + 1
nRight = MIN( nColStart := ( nLeft + aColSizes[ i ] - 1 ), nWidth )
IF nLeft > nWidth
EXIT
ENDIF
IF i == LEN( aValues )
nRight = nWidth
ENDIF
nRight -= 10
IF EVAL( abOrd[ i ] ) = MO_ASC
MOVETO( hDC, nRight, nTop )
LINETO( hDC, nRight + 6, nTop, hGPen )
LINETO( hDC, nRight + 3, nTop + 6, hWPen )
LINETO( hDC, nRight, nTop, hGPen )
ENDIF
IF EVAL( abOrd[ i ] ) = MO_DESC
MOVETO( hDC, nRight, nTop + 6 )
LINETO( hDC, nRight + 6, nTop + 6, hGPen )
LINETO( hDC, nRight + 3, nTop, hWPen )
LINETO( hDC, nRight, nTop + 6, hGPen )
ENDIF
NEXT
DELETEOBJECT( hWPen )
DELETEOBJECT( hGPen )
RETURN NIL
Return to FiveWin for Harbour/xHarbour
Users browsing this forum: Google [Bot] and 81 guests