diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 7ec9821957..13fbf5430c 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,18 @@ 2009-12-31 13:59 UTC+0100 Foo Bar (foo.bar foobar.org) */ +2009-02-19 12:42 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) + * harbour/contrib/gtwvg/wvgwin.c + + More functions. + + * harbour/contrib/gtwvg/wvgdatar.prg + * harbour/contrib/gtwvg/wvgscrlb.prg + * harbour/contrib/gtwvg/wvgwnd.prg + ! WvgScrollBar() class now works in toto as per + Xbase++ documentation. + + ; TODO: Implementation of WvgScrollBar() in demowvg.prg. + 2009-02-19 20:44 UTC+0100 Viktor Szakats (harbour.01 syenar hu) * utils/Makefile ! Fixed broken GNU Make after recent directory rename. diff --git a/harbour/contrib/gtwvg/wvgdatar.prg b/harbour/contrib/gtwvg/wvgdatar.prg index a13163ddf9..66b7f45ab2 100644 --- a/harbour/contrib/gtwvg/wvgdatar.prg +++ b/harbour/contrib/gtwvg/wvgdatar.prg @@ -164,6 +164,9 @@ METHOD setData( xValue, mp2 ) CLASS DataRef ENDIF CASE ::className == "SCROLLBAR" + IF ::sl_editBuffer <> NIL + WAPI_SetScrollPos( ::hWnd, SB_CTL, ::sl_editBuffer, .t. ) + ENDIF ENDCASE diff --git a/harbour/contrib/gtwvg/wvgscrlb.prg b/harbour/contrib/gtwvg/wvgscrlb.prg index 39070b2625..8fb3f45c12 100644 --- a/harbour/contrib/gtwvg/wvgscrlb.prg +++ b/harbour/contrib/gtwvg/wvgscrlb.prg @@ -73,14 +73,14 @@ #include 'hbgtwvg.ch' #include 'wvtwin.ch' #include 'wvgparts.ch' + +/*----------------------------------------------------------------------*/ #if 0 + #include 'xhb.ch' #include 'cstruct.ch' #include 'wintypes.ch' -//----------------------------------------------------------------------// -#if 1 - typedef struct tagPOINT {; LONG x; LONG y; @@ -103,7 +103,16 @@ typedef struct tagSCROLLBARINFO {; DWORD x; //rgstate[CCHILDREN_SCROLLBAR+1]; } SCROLLBARINFO -#endif +typedef struct tagSCROLLINFO {; + UINT cbSize; + UINT fMask; + int nMin; + int nMax; + UINT nPage; + int nPos; + int nTrackPos; +} SCROLLINFO + #endif //----------------------------------------------------------------------// @@ -123,6 +132,8 @@ CLASS WvgScrollBar INHERIT WvgWindow, DataRef DATA sl_xbeSB_Scroll + DATA lTracking INIT .f. + METHOD new() METHOD create() METHOD configure() VIRTUAL @@ -176,97 +187,168 @@ METHOD create( oParent, oOwner, aPos, aSize, aPresParams, lVisible ) CLASS WvgSc ::show() ENDIF +#if 0 + si IS SCROLLINFO + si:cbSize := si:sizeof + cSI := si:value + IF WAPI_GetScrollInfo( ::hWnd, SB_CTL, @cSI ) + si:buffer( cSI ) +hb_ToOutDebug( "scrollinfo nMin=%i nMax=%i", si:nMin, si:nMax ) + ENDIF +#endif RETURN Self //----------------------------------------------------------------------// METHOD handleEvent( nMessage, aNM ) CLASS WvgScrollBar - LOCAL nScrollMsg, nScrPos, nCommand + LOCAL nScrMsg, nScrPos, nCommand -// hb_ToOutDebug( " %s:handleEvent( %i ) %i %i %i %i", __ObjGetClsName( self ), nMessage ) + hb_ToOutDebug( " %s:handleEvent( %i ) %i %i %i %i", __ObjGetClsName( self ), nMessage ) DO CASE - CASE nMessage == HB_GTE_HSCROLL - IF !hb_isBlock( ::sl_xbeSB_Scroll ) - RETURN( EVENT_UNHANDELLED ) - ENDIF - - nScrollMsg := aNM[ 1 ] - nScrPos := aNM[ 2 ] // To be calculated - - DO CASE - - CASE nScrollMsg == SB_LEFT - nCommand := WVGSB_PREVPOS - CASE nScrollMsg == SB_RIGHT - nCommand := WVGSB_NEXTPOS - CASE nScrollMsg == SB_LINELEFT - nCommand := WVGSB_PREVPAGE - CASE nScrollMsg == SB_LINERIGHT - nCommand := WVGSB_NEXTPAGE - CASE nScrollMsg == SB_PAGELEFT - nCommand := WVGSB_PREVPAGE - CASE nScrollMsg == SB_PAGERIGHT - nCommand := WVGSB_NEXTPAGE - CASE nScrollMsg == SB_THUMBPOSITION - nCommand := WVGSB_SLIDERTRACK - CASE nScrollMsg == SB_THUMBTRACK - nCommand := WVGSB_ENDTRACK - CASE nScrollMsg == SB_ENDSCROLL - nCommand := WVGSB_ENDSCROLL - ENDCASE - - eval( ::sl_xbeSB_Scroll, { nScrPos, nCommand }, NIL, self ) - RETURN( EVENT_HANDELLED ) - - CASE nMessage == HB_GTE_VSCROLL - IF !hb_isBlock( ::sl_xbeSB_Scroll ) - RETURN( EVENT_UNHANDELLED ) - ENDIF - - nScrollMsg := aNM[ 1 ] - nScrPos := WAPI_GetScrollPos( ::hWnd, SB_CTL ) - - DO CASE - CASE nScrollMsg == SB_LINEUP - nCommand := WVGSB_PREVPOS - CASE nScrollMsg == SB_LINEDOWN - nCommand := WVGSB_NEXTPOS - IF nScrPos < ::range[ 2 ] - WAPI_SetScrollPos( ::hWnd, SB_CTL, nScrPos+1, .t. ) - ENDIF - - CASE nScrollMsg == SB_PAGEUP - nCommand := WVGSB_PREVPAGE - CASE nScrollMsg == SB_PAGEDOWN - nCommand := WVGSB_NEXTPAGE - CASE nScrollMsg == SB_TOP - nCommand := WVGSB_TOP - CASE nScrollMsg == SB_BOTTOM - nCommand := WVGSB_BOTTOM - CASE nScrollMsg == SB_THUMBPOSITION - nCommand := WVGSB_SLIDERTRACK - CASE nScrollMsg == SB_THUMBTRACK - nCommand := WVGSB_ENDTRACK -hb_ToOutDebug( "Parent %s", ::oParent:CLASSName ) - CASE nScrollMsg == SB_ENDSCROLL - nCommand := WVGSB_ENDSCROLL -hb_ToOutDebug( "Parent %s", ::oParent:CLASSName ) - OTHERWISE - nCommand := -99 - ENDCASE - - eval( ::sl_xbeSB_Scroll, { nScrPos, nCommand }, NIL, self ) - - RETURN( EVENT_HANDELLED ) - CASE nMessage == HB_GTE_CTLCOLOR IF hb_isNumeric( ::hBrushBG ) Win_SetBkMode( aNM[ 1 ], 1 ) RETURN ( ::hBrushBG ) ENDIF + CASE nMessage == HB_GTE_HSCROLL + IF !hb_isBlock( ::sl_xbeSB_Scroll ) + RETURN( EVENT_UNHANDELLED ) + ENDIF + + nScrMsg := aNM[ 1 ] + IF nScrMsg == SB_THUMBPOSITION .or. nScrMsg == SB_THUMBTRACK + nScrPos := aNM[ 2 ] + ELSE + nScrPos := WAPI_GetScrollPos( ::hWnd, SB_CTL ) + ENDIF + + DO CASE + CASE nScrMsg == SB_LEFT + nCommand := WVGSB_PREVPOS + IF nScrPos > ::range[ 1 ] + WAPI_SetScrollPos( ::hWnd, SB_CTL, --nScrPos, .t. ) + ENDIF + + CASE nScrMsg == SB_RIGHT + nCommand := WVGSB_NEXTPOS + IF nScrPos < ::range[ 2 ] + WAPI_SetScrollPos( ::hWnd, SB_CTL, ++nScrPos, .t. ) + ENDIF + + CASE nScrMsg == SB_LINELEFT + nCommand := WVGSB_PREVPAGE + IF nScrPos > ::range[ 1 ] + WAPI_SetScrollPos( ::hWnd, SB_CTL, --nScrPos, .t. ) + ENDIF + + CASE nScrMsg == SB_LINERIGHT + nCommand := WVGSB_NEXTPAGE + IF nScrPos < ::range[ 2 ] + WAPI_SetScrollPos( ::hWnd, SB_CTL, ++nScrPos, .t. ) + ENDIF + + CASE nScrMsg == SB_PAGELEFT + nCommand := WVGSB_PREVPAGE + IF nScrPos > ::range[ 1 ] + WAPI_SetScrollPos( ::hWnd, SB_CTL, --nScrPos, .t. ) + ENDIF + + CASE nScrMsg == SB_PAGERIGHT + nCommand := WVGSB_NEXTPAGE + IF nScrPos < ::range[ 2 ] + WAPI_SetScrollPos( ::hWnd, SB_CTL, ++nScrPos, .t. ) + ENDIF + + CASE nScrMsg == SB_THUMBPOSITION + nCommand := WVGSB_SLIDERTRACK + WAPI_SetScrollPos( ::hWnd, SB_CTL, nScrPos, .t. ) + + CASE nScrMsg == SB_THUMBTRACK + nCommand := WVGSB_ENDTRACK + WAPI_SetScrollPos( ::hWnd, SB_CTL, nScrPos, .t. ) + + CASE nScrMsg == SB_ENDSCROLL + nCommand := WVGSB_ENDSCROLL + WAPI_SetScrollPos( ::hWnd, SB_CTL, nScrPos, .t. ) + + ENDCASE + + ::sl_editBuffer := nScrPos + eval( ::sl_xbeSB_Scroll, { nScrPos, nCommand }, NIL, self ) + RETURN( EVENT_HANDELLED ) + + + CASE nMessage == HB_GTE_VSCROLL + + nScrMsg := aNM[ 1 ] + IF nScrMsg == SB_THUMBPOSITION .or. nScrMsg == SB_THUMBTRACK + nScrPos := aNM[ 2 ] + ELSE + nScrPos := WAPI_GetScrollPos( ::hWnd, SB_CTL ) + ENDIF + + IF !hb_isBlock( ::sl_xbeSB_Scroll ) + RETURN( EVENT_UNHANDELLED ) + ENDIF + + DO CASE + CASE nScrMsg == SB_TOP + nCommand := WVGSB_TOP + IF nScrPos > ::range[ 1 ] + WAPI_SetScrollPos( ::hWnd, SB_CTL, --nScrPos, .t. ) + ENDIF + + CASE nScrMsg == SB_BOTTOM + nCommand := WVGSB_BOTTOM + IF nScrPos < ::range[ 2 ] + WAPI_SetScrollPos( ::hWnd, SB_CTL, ++nScrPos, .t. ) + ENDIF + + CASE nScrMsg == SB_LINEUP + nCommand := WVGSB_PREVPOS + IF nScrPos > ::range[ 1 ] + WAPI_SetScrollPos( ::hWnd, SB_CTL, --nScrPos, .t. ) + ENDIF + + CASE nScrMsg == SB_LINEDOWN + nCommand := WVGSB_NEXTPOS + IF nScrPos < ::range[ 2 ] + WAPI_SetScrollPos( ::hWnd, SB_CTL, ++nScrPos, .t. ) + ENDIF + + CASE nScrMsg == SB_PAGEUP + nCommand := WVGSB_PREVPAGE + IF nScrPos > ::range[ 1 ] + WAPI_SetScrollPos( ::hWnd, SB_CTL, --nScrPos, .t. ) + ENDIF + + CASE nScrMsg == SB_PAGEDOWN + nCommand := WVGSB_NEXTPAGE + IF nScrPos < ::range[ 2 ] + WAPI_SetScrollPos( ::hWnd, SB_CTL, ++nScrPos, .t. ) + ENDIF + + CASE nScrMsg == SB_THUMBPOSITION + nCommand := WVGSB_SLIDERTRACK + WAPI_SetScrollPos( ::hWnd, SB_CTL, nScrPos, .t. ) + + CASE nScrMsg == SB_THUMBTRACK + nCommand := WVGSB_ENDTRACK + WAPI_SetScrollPos( ::hWnd, SB_CTL, nScrPos, .t. ) + + CASE nScrMsg == SB_ENDSCROLL + nCommand := WVGSB_ENDSCROLL + WAPI_SetScrollPos( ::hWnd, SB_CTL, nScrPos, .t. ) + + ENDCASE + + ::sl_editBuffer := nScrPos + eval( ::sl_xbeSB_Scroll, { nScrPos, nCommand }, NIL, self ) + RETURN( EVENT_HANDELLED ) + ENDCASE RETURN EVENT_UNHANDELLED diff --git a/harbour/contrib/gtwvg/wvgwin.c b/harbour/contrib/gtwvg/wvgwin.c index 9a28f3496d..7a4f8abf6c 100644 --- a/harbour/contrib/gtwvg/wvgwin.c +++ b/harbour/contrib/gtwvg/wvgwin.c @@ -2616,3 +2616,183 @@ HB_FUNC( WIN_FILLRECT ) } //----------------------------------------------------------------------// + +HB_FUNC( WVG_BEGINMOUSETRACKING ) +{ + TRACKMOUSEEVENT tmi; + + tmi.cbSize = sizeof( TRACKMOUSEEVENT ); + tmi.dwFlags = TME_LEAVE | TME_HOVER ; + tmi.hwndTrack = wapi_par_HWND( 1 ); + tmi.dwHoverTime = 1; + wapi_ret_L( _TrackMouseEvent( &tmi ) ); +} + +/*----------------------------------------------------------------------*/ + +#include "hbapi.h" +#include "hbapiitm.h" +#include "hbapierr.h" +#include "hbstack.h" + + +#define HB_MEMSTRU_OSVERSIONINFO 1000001 +#define HB_MEMSTRU_LOGFONT 1000002 + +#define HB_ERR_MEMSTRU_NOT_MEM_BLOCK 4001 +#define HB_ERR_MEMSTRU_WRONG_MEMSTRU_BLOCK 4002 +#define HB_ERR_MEMSTRU_DESTROYED 4003 + +HB_EXTERN_BEGIN + +extern PHB_ITEM hb_memstru_itemPut( PHB_ITEM pItem, void * pMemAddr, int iType ); +extern void * hb_memstru_itemGet( PHB_ITEM pItem, int iType, BOOL fError ); +extern void hb_memstru_ret( void * pMemAddr, int iType ); +extern void * hb_memstru_param( int iParam, int iType, BOOL fError ); + +HB_EXTERN_END + +/* end of header file */ + + + +typedef struct +{ + int type; + void * mem; +} +HB_MEMSTRU_HOLDER, * PHB_MEMSTRU_HOLDER; + +static HB_GARBAGE_FUNC( hb_memstru_destructor ) +{ + PHB_MEMSTRU_HOLDER pStructHolder = ( PHB_MEMSTRU_HOLDER ) Cargo; + + if( pStructHolder->mem ) + { + hb_xfree( pStructHolder->mem ); + pStructHolder->mem = NULL; + } +} + +PHB_ITEM hb_memstru_itemPut( PHB_ITEM pItem, void * pMemAddr, int iType ) +{ + PHB_MEMSTRU_HOLDER pStructHolder; + + if( pItem ) + { + if( HB_IS_COMPLEX( pItem ) ) + hb_itemClear( pItem ); + } + else + pItem = hb_itemNew( pItem ); + + pStructHolder = ( PHB_MEMSTRU_HOLDER ) + hb_gcAlloc( sizeof( HB_MEMSTRU_HOLDER ), hb_memstru_destructor ); + pStructHolder->mem = pMemAddr; + pStructHolder->type = iType; + + return hb_itemPutPtrGC( pItem, pStructHolder ); +} + +void * hb_memstru_itemGet( PHB_ITEM pItem, int iType, BOOL fError ) +{ + PHB_MEMSTRU_HOLDER pStructHolder = ( PHB_MEMSTRU_HOLDER ) + hb_itemGetPtrGC( pItem, hb_memstru_destructor ); + int iError; + + if( !pStructHolder ) + iError = HB_ERR_MEMSTRU_NOT_MEM_BLOCK; + else if( pStructHolder->type != iType ) + iError = HB_ERR_MEMSTRU_WRONG_MEMSTRU_BLOCK; + else if( !pStructHolder->mem ) + iError = HB_ERR_MEMSTRU_DESTROYED; + else + return pStructHolder->mem; + + if( fError ) + hb_errRT_BASE_SubstR( EG_ARG, iError, NULL, + HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); + + return NULL; +} + +void hb_memstru_ret( void * pMemAddr, int iType ) +{ + hb_memstru_itemPut( hb_stackReturnItem(), pMemAddr, iType ); +} + +void * hb_memstru_param( int iParam, int iType, BOOL fError ) +{ + return hb_memstru_itemGet( hb_param( iParam, HB_IT_POINTER ), iType, fError ); +} + +BOOL hb_memstru_store( void * pMemAddr, int iType, int iParam ) +{ + PHB_ITEM pItem = hb_param( iParam, HB_IT_BYREF ); + if( !pItem ) + return FALSE; + + hb_memstru_itemPut( pItem, pMemAddr, iType ); + return TRUE; +} + + +/* +hb_memstru_*() functions can be used to pass structures between +C and .prg code. +*/ + +HB_FUNC( WAPI_STRUCT_OSVERSIONINFO ) +{ + OSVERSIONINFO * osvi; + + osvi = ( OSVERSIONINFO * ) memset( hb_xgrab( sizeof( OSVERSIONINFO ) ), + 0, sizeof( OSVERSIONINFO ) ); + osvi->dwOSVersionInfoSize = sizeof( OSVERSIONINFO ); + + hb_memstru_ret( osvi, HB_MEMSTRU_OSVERSIONINFO ); +} + +HB_FUNC( WAPI_GETVERSIONEX ) +{ + OSVERSIONINFO * osvi; + + osvi = ( OSVERSIONINFO * ) + hb_memstru_param( 1, HB_MEMSTRU_OSVERSIONINFO, TRUE ); + + if( osvi ) + hb_retl( GetVersionEx( osvi ) ); +} + + +/* +You can also define some general functions to access given structure +members if you will find it useful in some cases. +*/ +HB_FUNC( WAPI_MEMBER_OSVERSIONINFO ) +{ + OSVERSIONINFO * osvi; + const char * szMember; + + osvi = ( OSVERSIONINFO * ) + hb_memstru_param( 1, HB_MEMSTRU_OSVERSIONINFO, TRUE ); + szMember = hb_parc( 2 ); + if( osvi && szMember ) + { + if( !strcmp( szMember, "dwMajorVersion" ) ) + hb_retnint( osvi->dwMajorVersion ); + else if( !strcmp( szMember, "dwMinorVersion" ) ) + hb_retnint( osvi->dwMinorVersion ); + else if( !strcmp( szMember, "dwBuildNumber" ) ) + hb_retnint( osvi->dwBuildNumber ); + else if( !strcmp( szMember, "dwPlatformId" ) ) + hb_retnint( osvi->dwPlatformId ); + else if( !strcmp( szMember, "szCSDVersion" ) ) + ;//wapi_rettstr( osvi->dwPlatformId ); + else + { + /* NIL for unknown members or RT error */ + } + } +} +/*----------------------------------------------------------------------*/ diff --git a/harbour/contrib/gtwvg/wvgwnd.prg b/harbour/contrib/gtwvg/wvgwnd.prg index 96ca7d9dc1..6116911d1b 100644 --- a/harbour/contrib/gtwvg/wvgwnd.prg +++ b/harbour/contrib/gtwvg/wvgwnd.prg @@ -1238,7 +1238,7 @@ METHOD createControl() CLASS WvgWindow METHOD ControlWndProc( hWnd, nMessage, nwParam, nlParam ) CLASS WvgWindow LOCAL nCtrlID, nNotifctn, hWndCtrl, nObj, aMenuItem, oObj, nReturn - #if 1 + #if 0 hb_ToOutDebug( "%s:wndProc( %i %i %i %i )", __ObjGetClsName( self ), hWnd, nMessage, nwParam, nlParam ) #endif @@ -1316,6 +1316,40 @@ METHOD ControlWndProc( hWnd, nMessage, nwParam, nlParam ) CLASS WvgWindow IF nReturn == EVENT_HANDELLED RETURN 0 ENDIF + EXIT + + CASE WM_CAPTURECHANGED +//hb_ToOutDebug( 'wm_CAPTURECHANGED' ) + EXIT + + CASE WM_MOUSEMOVE + IF ::objType == objTypeScrollBar + IF !( ::lTracking ) + ::lTracking := Wvg_BeginMouseTracking( ::hWnd ) + ENDIF +//hb_ToOutDebug( 'wm_mouseMOVE' ) + ENDIF + EXIT + + CASE WM_MOUSEHOVER + IF ::objType == objTypeScrollBar +//hb_ToOutDebug( 'wm_mousehover' ) + IF ::oParent:objType == objTypeCrt + WAPI_SetFocus( ::oParent:hWnd ) + ENDIF + RETURN 0 + ENDIF + EXIT + + CASE WM_MOUSELEAVE + IF ::objType == objTypeScrollBar + ::lTracking := .f. + IF ::oParent:objType == objTypeCrt +//hb_ToOutDebug( 'wm_mouseleave' ) + WAPI_SetFocus( ::oParent:hWnd ) + ENDIF + ENDIF + EXIT END RETURN Win_CallWindowProc( ::nOldProc, hWnd, nMessage, nwParam, nlParam )