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.
This commit is contained in:
Pritpal Bedi
2009-02-19 20:48:17 +00:00
parent 4e73d2bdba
commit 78984eea99
5 changed files with 392 additions and 81 deletions

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -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 */
}
}
}
/*----------------------------------------------------------------------*/

View File

@@ -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 )