From 22e96b642ce2be6f4e05299960ff7ed051d7fdb1 Mon Sep 17 00:00:00 2001 From: Pritpal Bedi Date: Wed, 14 Dec 2011 01:22:25 +0000 Subject: [PATCH] 2011-12-13 17:13 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com) * contrib/gtwvg/wvgax.prg * contrib/gtwvg/wvgcheck.prg * contrib/gtwvg/wvgdarea.prg * contrib/gtwvg/wvglistb.prg * contrib/gtwvg/wvgpushb.prg * contrib/gtwvg/wvgscrlb.prg * contrib/gtwvg/wvgsle.prg * contrib/gtwvg/wvgwin.c * contrib/gtwvg/wvtwin.ch + Implemented: ::pointerFocus for WvgPushButton() and WvgCheckBox(). This facilitates not to keep focus on push buttons after click. ! Fixed: focussing issues for WvgScrollBar() objects. + Implemented: WvgActiveXControl() for CUI hosting. * contrib/gtwvg/tests/demowvg.prg * contrib/gtwvg/tests/wvgtbrowser.prg + Reworked: The browser demonstration now holds Shell.Explorer.2 active-x control to navigate the web. Just click on "Active-X" check box. ! Fixed: navigation glitch when another control was activated while the current focus has been on another GUI control. NOTE: this implementation is now production ready, take use of it. --- harbour/ChangeLog | 25 + harbour/contrib/gtwvg/tests/demowvg.prg | 7 + harbour/contrib/gtwvg/tests/wvgtbrowser.prg | 479 ++++++++++++-------- harbour/contrib/gtwvg/wvgax.prg | 57 ++- harbour/contrib/gtwvg/wvgcheck.prg | 3 +- harbour/contrib/gtwvg/wvgdarea.prg | 19 +- harbour/contrib/gtwvg/wvglistb.prg | 1 - harbour/contrib/gtwvg/wvgpushb.prg | 3 +- harbour/contrib/gtwvg/wvgscrlb.prg | 24 +- harbour/contrib/gtwvg/wvgsle.prg | 3 +- harbour/contrib/gtwvg/wvgwin.c | 20 + harbour/contrib/gtwvg/wvtwin.ch | 15 + 12 files changed, 422 insertions(+), 234 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 459e5dd13e..03d80f9648 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,31 @@ The license applies to all entries newer than 2009-04-28. */ +2011-12-13 17:13 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com) + * contrib/gtwvg/wvgax.prg + * contrib/gtwvg/wvgcheck.prg + * contrib/gtwvg/wvgdarea.prg + * contrib/gtwvg/wvglistb.prg + * contrib/gtwvg/wvgpushb.prg + * contrib/gtwvg/wvgscrlb.prg + * contrib/gtwvg/wvgsle.prg + * contrib/gtwvg/wvgwin.c + * contrib/gtwvg/wvtwin.ch + + Implemented: ::pointerFocus for WvgPushButton() and WvgCheckBox(). + This facilitates not to keep focus on push buttons after click. + ! Fixed: focussing issues for WvgScrollBar() objects. + + Implemented: WvgActiveXControl() for CUI hosting. + + * contrib/gtwvg/tests/demowvg.prg + * contrib/gtwvg/tests/wvgtbrowser.prg + + Reworked: The browser demonstration now holds Shell.Explorer.2 + active-x control to navigate the web. Just click on "Active-X" + check box. + ! Fixed: navigation glitch when another control was activated + while the current focus has been on another GUI control. + + NOTE: this implementation is now production ready, take use of it. + 2011-12-13 10:37 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * harbour/src/rdd/dbfnsx/dbfnsx1.c ! fixed index header verification when index is loaded. diff --git a/harbour/contrib/gtwvg/tests/demowvg.prg b/harbour/contrib/gtwvg/tests/demowvg.prg index 1227d15877..07cc63b224 100644 --- a/harbour/contrib/gtwvg/tests/demowvg.prg +++ b/harbour/contrib/gtwvg/tests/demowvg.prg @@ -581,39 +581,46 @@ FUNCTION BuildButtons() LOCAL oXbp oXbp := WvgPushButton():new() + oXbp:pointerFocus := .f. oXbp:caption := "Hi" oXbp:create( , , { {|| -( maxrow()-1 ) }, -1 }, { -2, -4 } ) oXbp:activate := {|| Wvg_MessageBox( , "Harbour!" ) } oXbp:toolTipText := "Harbour CUI/GUI Console" oXbp := WvgPushButton():new() + oXbp:pointerFocus := .f. oXbp:caption := IMAGE_VOUCH oXbp:create( , , { {|| -( maxrow()-1 ) }, -6 }, { -2, -4 } ) oXbp:activate := {|| Wvt_Keyboard( K_F2 ) } oXbp:toolTipText := "Open Another GET Screen" oXbp := WvgPushButton():new() + oXbp:pointerFocus := .f. oXbp:caption := IMAGE_BROWSE oXbp:create( , , { {|| -( maxrow()-1 ) }, -11 }, { -2, -4 } ) oXbp:activate := {|| Wvt_Keyboard( K_F5 ) } oXbp:toolTipText := "TBrowse + GUI Controls" oXbp := WvgPushButton():new() + oXbp:pointerFocus := .f. oXbp:caption := IMAGE_NOTES oXbp:create( , , { {|| -( maxrow()-1 ) }, -16 }, { -2, -4 } ) oXbp:activate := {|| Wvt_Keyboard( K_F3 ) } oXbp := WvgPushButton():new() + oXbp:pointerFocus := .f. oXbp:caption := IMAGE_TOOLS oXbp:create( , , { {|| -( maxrow()-1 ) }, -21 }, { -2, -4 } ) oXbp:activate := {|| Wvt_Keyboard( K_F6 ) } oXbp := WvgPushButton():new() + oXbp:pointerFocus := .f. oXbp:caption := IMAGE_HELP oXbp:create( , , { {|| -( maxrow()-1 ) }, -26 }, { -2, -4 } ) oXbp:activate := {|| Wvt_Keyboard( K_F7 ) } oXbp := WvgPushButton():new() + oXbp:pointerFocus := .f. oXbp:caption := IMAGE_VR oXbp:border := .f. oXbp:create( , , { {|| -( maxrow()-1 ) }, -31 }, { -2, -4 } ) diff --git a/harbour/contrib/gtwvg/tests/wvgtbrowser.prg b/harbour/contrib/gtwvg/tests/wvgtbrowser.prg index c492ef3d18..ca8d383533 100644 --- a/harbour/contrib/gtwvg/tests/wvgtbrowser.prg +++ b/harbour/contrib/gtwvg/tests/wvgtbrowser.prg @@ -60,7 +60,7 @@ FUNCTION WvtMyBrowse() //----------------------------------------------------------------------// FUNCTION ExecBrowser( oCrt ) - LOCAL nKey, bBlock, oBrowse , aLastPaint, i, pGT, oVBar, oHBar + LOCAL nKey, bBlock, oBrowse , aLastPaint, i, pGT LOCAL cFileIndex, cFileDbf, cRDD, nIndex, oTBar, cScr, info_ //, oLB LOCAL lEnd := .f. LOCAL aBlocks := {} @@ -74,9 +74,11 @@ FUNCTION ExecBrowser( oCrt ) LOCAL cColor := SetColor( "N/W*,N/GR*,,,N/W*" ) LOCAL aObjects := WvtSetObjects( {} ) LOCAL hPopup := Wvt_SetPopupMenu() + LOCAL oVBar, oHBar, oCom, oTre, oChk, oSLE, oLBx, aNvg, oIdx STATIC nStyle := 0 THREAD STATIC nFactor := 200 + THREAD STATIC lActiveX := .f. IF oCrt == NIL cScr := SaveScreen( 0,0,maxrow(),maxcol() ) @@ -84,6 +86,8 @@ FUNCTION ExecBrowser( oCrt ) BrwBuildMenu( oCrt ) oTBar := BrwBuildToolBar( oCrt ) + oTBar:buttonClick := {|oBtn| Vou_ExecTBarAction( oBtn ) } + SetMode( maxrow()+1, maxCol()+1 ) /* Neccessary because adding menu has reduced the overall size of window */ pGT := SetGT( 2, hb_gtSelect() ) @@ -111,7 +115,7 @@ FUNCTION ExecBrowser( oCrt ) Popups( 2 ) - oBrowse := TBrowseWVG():New( nTop + 3, nLeft + 12, nBottom - 1, nRight - 2 ) + oBrowse := TBrowseWVG():New( nTop + 2, nLeft + 12, nBottom - 1, nRight - 1 ) oBrowse:ColSep := " " oBrowse:HeadSep := "__" @@ -141,17 +145,19 @@ FUNCTION ExecBrowser( oCrt ) aLastPaint := WvtSetBlocks( aBlocks ) - BrwBuildCheckBox( oCrt, oBrowse ) - BrwBuildSLE( oCrt, oBrowse ) - BrwBuildListBox( oCrt, oBrowse ) - BrwBuildMLE( oCrt, oBrowse ) - BrwBuildButtons( oCrt, oBrowse ) - BrwBuildTree( oCrt, oBrowse ) - DispBox( 0, 0, maxrow(), maxcol(), " ", "N/W" ) DispOutAt( oBrowse:nTop-2, oBrowse:nleft-2, padc( cFileDbf, oBrowse:nRight-oBrowse:nLeft+5 ), "W+/B*" ) - oTBar:buttonClick := {|oBtn| Vou_ExecTBarAction( oBtn ) } + oCom := BrwBuildActiveX( oCrt, oBrowse ) + oChk := BrwBuildCheckBox( oCrt, oBrowse, @lActiveX ) + oSLE := BrwBuildSLE( oCrt, oBrowse ) + aNvg := BrwBuildNvg( oCrt, oBrowse, oCom ) + oLBx := BrwBuildListBox( oCrt, oBrowse ) + oIdx := BrwBuildListBoxIdx( oCrt, oBrowse ) + BrwBuildButtons( oCrt, oBrowse ) + oTre := BrwBuildTree( oCrt, oBrowse ) + + Wvt_Keyboard( HB_K_RESIZE ) /* Refresh All GUI Controls */ WHILE ! lEnd dispbegin() @@ -200,14 +206,7 @@ FUNCTION ExecBrowser( oCrt ) CASE BrwHandleKey( oBrowse, nKey, @lEnd ) CASE nKey == HB_K_RESIZE - oBrowse:nBottom := maxrow() - 3 - oBrowse:nRight := maxcol() - 5 - - BrwReposButtons( oCrt ) /* Because we are repositioning at the center of console width */ - - DispBox( 0, 0, maxrow(), maxcol(), " ", "N/W" ) - DispOutAt( oBrowse:nTop-2, oBrowse:nleft-2, padc( cFileDbf, oBrowse:nRight - oBrowse:nLeft + 5 ), "W+/B*" ) - oBrowse:configure() + BrwHandleResize( oCrt, oBrowse, oVBar, oHBar, oCom, oSLE, oLBx, oTre, oChk, aNvg, oIdx, lActiveX, cFileDbf ) ENDCASE END @@ -231,6 +230,52 @@ FUNCTION ExecBrowser( oCrt ) //-------------------------------------------------------------------// +STATIC FUNCTION BrwHandleResize( oCrt, oBrw, oVBar, oHBar, oCom, oSLE, oLBx, oTre, oChk, aNvg, oIdx, lActiveX, cFileDbf ) + + HB_SYMBOL_UNUSED( oSle ) + HB_SYMBOL_UNUSED( oLBx ) + HB_SYMBOL_UNUSED( oChk ) + HB_SYMBOL_UNUSED( oIdx ) + + oCrt:setFocus() + + oBrw:nBottom := iif( lActiveX, 20, maxrow()-3 ) + oBrw:nRight := maxcol()-4 + oBrw:configure() + + DispBox( 0, 0, maxrow(), maxcol(), " ", "N/W" ) + DispOutAt( oBrw:nTop-2, oBrw:nleft-2, padc( cFileDbf, oBrw:nRight - oBrw:nLeft + 5 ), "W+/B*" ) + + oVBar:setPosAndSize() + oHBar:setPosAndSize() + oCom:setPosAndSize() +// oSLE:setPosAndSize() +// oLBx:setPosAndSize() +// oIdx:setPosAndSize() + + oTre:setPosAndSize() +// oChk:setPosAndSize() + + BrwReposButtons( oCrt ) /* Because we are repositioning at the center of console width */ + + IF lActiveX + aNvg[ 1 ]:show() + aNvg[ 2 ]:show() + oCom:show() + ELSE + aNvg[ 1 ]:hide() + aNvg[ 2 ]:hide() + oCom:hide() + ENDIF + + /* Why this is needed if WvgActiveXControl is hosted on the GT console */ + oCrt:hide() + oCrt:show() + + RETURN .t. + +/*----------------------------------------------------------------------*/ + STATIC FUNCTION BrwShowColumn( oBrw, cHeading ) LOCAL i, j, nCur @@ -263,7 +308,7 @@ STATIC FUNCTION BrwBuildTree( oCrt /*, oBrw*/ ) oTree:hasLines := .T. oTree:hasButtons := .T. oTree:alwaysShowSelection := .T. - oTree:create( , , { -25, -1 }, { {|| -( maxrow()-1-25 ) }, -10 } ) + oTree:create( , , { -24, -1 }, { {|| -( maxrow()-1-24 ) }, -10 } ) oTree:setColorFG( "W+" ) oTree:setColorBG( "R*" ) oTree:itemSelected := {|oItem| WVG_MessageBox( , iif( oItem <> NIL, oItem:caption, "Some Problem" ) ) } @@ -284,42 +329,22 @@ STATIC FUNCTION BrwBuildTree( oCrt /*, oBrw*/ ) oTree:tooltipText := "Treeview embedded onto CUI window" - RETURN NIL + RETURN oTree /*----------------------------------------------------------------------*/ -STATIC FUNCTION BrwBuildMLE( oCrt /*, oBrw*/ ) - LOCAL oXbp +STATIC FUNCTION BrwBuildActiveX( oCrt, oBrw ) + LOCAL oCom - oXbp := WvgMLE():new( oCrt ) - oXbp:create( , , { -16,-1 }, { -8, -10 }, , .t. ) - oXbp:setColorFG( "B" ) - oXbp:setData( "Harbour's implementation of GUI controls onto CUI console." ) - oXbp:tooltipText := "Multi-line Edit Control" + HB_SYMBOL_UNUSED( oBrw ) - RETURN NIL + oCom := WvgActiveXControl():new( oCrt, , { -24, -13 }, { {|| -( maxrow()-1-24 ) }, {|| -( maxcol()-1-13 ) } }, , .f. ) + oCom:CLSID := 'Shell.Explorer.2' + //oCom:mapEvent( 269, {|| uiDebug( ' E X P L O R E R - 2 6 9' ) } ) + oCom:create() + oCom:navigate( "http://hbide.vouch.info" ) -/*----------------------------------------------------------------------*/ - -STATIC FUNCTION BrwBuildSLE( oCrt, oBrw ) - LOCAL oXbp - - oXbp := WvgStatic():new( oCrt ) - oXbp:type := WVGSTATIC_TYPE_TEXT - oXbp:options := WVGSTATIC_TEXT_LEFT - oXbp:caption := "Field Name:" - oXbp:create( , , { -3, -13 }, { -1, -7 } ) - oXbp:setColorFG( "W+" ) - oXbp:setColorBG( "BG" ) - - oXbp := WvgSLE():new( oCrt ) - oXbp:create( , , { -3, -21 }, { -1, -20 } ) - oXbp:setColorFG( "N" ) - oXbp:setColorBG( "BG+" ) - oXbp:returnPressed := {|m1,m2,o| m1:=m1, m2:=m2, BrwShowColumn( oBrw, upper( trim( o:getData() ) ) ) } - oXbp:tooltipText := "Type in a field name and press ENTER" - - RETURN NIL + RETURN oCom /*----------------------------------------------------------------------*/ @@ -327,7 +352,7 @@ STATIC FUNCTION BrwBuildListBox( oCrt, oBrw ) LOCAL oXbp, i oXbp := WvgListBox():new( oCrt ) - oXbp:create( , , { -5,-1 }, { -10, -10 }, , .t. ) + oXbp:create( , , { -4,-1 }, { -10, -10 }, , .t. ) oXbp:setColorFG( "W+" ) oXbp:setColorBG( "B*" ) oXbp:itemMarked := {|m1,m2,o| m1 := m1, m2 := m2, BrwShowColumn( oBrw, o:getCurItem() ) } @@ -341,19 +366,105 @@ STATIC FUNCTION BrwBuildListBox( oCrt, oBrw ) /*----------------------------------------------------------------------*/ -STATIC FUNCTION BrwBuildCheckBox( oCrt, oBrw ) +STATIC FUNCTION BrwSetThisOrder( oBrw, nOrd ) + DbSetOrder( nOrd ) + oBrw:refreshAll() + oBrw:forceStable() + RETURN NIL + +/*----------------------------------------------------------------------*/ + +STATIC FUNCTION BrwBuildListBoxIdx( oCrt, oBrw ) + LOCAL oXbp, i, cKey, aIdx := {} + + + FOR i := 1 TO 10 + IF ( cKey := IndexKey( i ) ) == "" + EXIT + ENDIF + aadd( aIdx, OrdName( i ) + ": " + cKey ) + NEXT + + oXbp := WvgListBox():new( oCrt ) + oXbp:create( , , { -18,-1 }, { -5, -10 }, , .t. ) + oXbp:setColorFG( "W+" ) + oXbp:setColorBG( "B*" ) + oXbp:itemMarked := {|m1,m2,o| m1 := m2, BrwSetThisOrder( oBrw, max( 0, ascan( aIdx, o:getCurItem() )-1 ) ) } + oXbp:addItem( "Natural Order" ) + FOR i := 1 TO len( aIdx ) + oXbp:addItem( aIdx[ i ] ) + NEXT + oXbp:setData( 3 ) + oXbp:tooltipText := "Click on an index to order database!" + + RETURN oXbp + +/*----------------------------------------------------------------------*/ + +STATIC FUNCTION BrwBuildSLE( oCrt, oBrw ) LOCAL oXbp + oXbp := WvgStatic():new( oCrt ) + oXbp:type := WVGSTATIC_TYPE_TEXT + oXbp:options := WVGSTATIC_TEXT_CENTER + oXbp:caption := "Field Name" + oXbp:create( , , { -15, -1 }, { -1, -10 } ) + oXbp:setColorFG( "W+" ) + oXbp:setColorBG( "BG" ) + + oXbp := WvgSLE():new( oCrt ) + oXbp:create( , , { -16, -1 }, { -1, -10 } ) + oXbp:setColorFG( "N" ) + oXbp:setColorBG( "BG+" ) + oXbp:returnPressed := {|m1,m2,o| m1:=m1, m2:=m2, BrwShowColumn( oBrw, upper( trim( o:getData() ) ) ) } + oXbp:tooltipText := "Type in a field name and press ENTER" + + RETURN oXbp + +/*----------------------------------------------------------------------*/ + +STATIC FUNCTION BrwBuildNvg( oCrt, oBrw, oCom ) + LOCAL oLbl, oXbp + + HB_SYMBOL_UNUSED( oBrw ) + + oLbl := WvgStatic():new( oCrt ) + oLbl:type := WVGSTATIC_TYPE_TEXT + oLbl:options := WVGSTATIC_TEXT_LEFT + oLbl:caption := "Navigate" + oLbl:create( , , { -23, -13 }, { -1, -6 }, , .f. ) + oLbl:setColorFG( "W+" ) + oLbl:setColorBG( "BG" ) + + oXbp := WvgSLE():new( oCrt ) + oXbp:bufferLength := 300 + oXbp:create( , , { -23, -19 }, { -1, {|| -( maxcol()-1-19 ) } }, , .f. ) + oXbp:setColorFG( "N" ) + oXbp:setColorBG( "BG+" ) + oXbp:returnPressed := {|m1,m2,o| m1:=m2, oCom:navigate( trim( o:getData() ) ) } + oXbp:tooltipText := "Type in a http:// address and press ENTER" + oXbp:setData( "http://hbide.vouch.info/" ) + + RETURN { oLbl, oXbp } + +/*----------------------------------------------------------------------*/ + +STATIC FUNCTION BrwBuildCheckBox( oCrt, oBrw, lActiveX ) + LOCAL oXbp + + HB_SYMBOL_UNUSED( oBrw ) + oXbp := WvgCheckBox():new( oCrt ) - oXbp:caption := "Navigate" - oXbp:selected := {|x,y,o| x := x, y := y, iif( o:getData(), oBrw:goTop():forceStable(), oBrw:goBottom():forceStable() ) } - oXbp:selection := .t. - oXbp:create( , , { -3,-1 }, { -1,-7 } ) + oXbp:pointerFocus := .f. + oXbp:caption := "ActiveX" + oXbp:selected := {|x,y,o| x := y, lActiveX := o:getData(), Wvt_Keyboard( HB_K_RESIZE ) } + oXbp:selection := .f. + oXbp:create( , , { -23,-1 }, { -1,-10 } ) oXbp:setColorFG( "R+" ) oXbp:setColorBG( "W" ) - oXbp:tooltipText := "Checked: GoTop, Unchecked: GoBottom" + oXbp:tooltipText := "Naviagate: http://hbide.vouch.info" - RETURN NIL + RETURN oXbp /*----------------------------------------------------------------------*/ @@ -399,6 +510,9 @@ STATIC FUNCTION BrwBuildButtons( oCrt, oBrw ) FOR i := 1 TO len( aPmt ) oPB := WvgPushButton():new( oCrt ) + IF i == 3 /* We do not want this button to gain focus anytime */ + oPB:pointerFocus := .f. + ENDIF IF i == len( aPmt ) oPB:caption := hb_dirBase() + "\" + "v_lock.bmp" oPB:create( , , { {|| -maxrow() }, -nOff }, { -1,-aW[ i ] } ) @@ -411,16 +525,96 @@ STATIC FUNCTION BrwBuildButtons( oCrt, oBrw ) oPB:tooltipText := aPmt[ i ] nOff += aW[ i ] + nG - - IF i == len( aPmt ) - oPB:destroy() - ENDIF NEXT RETURN NIL /*----------------------------------------------------------------------*/ +FUNCTION Vou_BrwAddScrollBars( oCrt, oBrw, oVBar, oHBar ) + + oHBar := WvgScrollBar():new( oCrt, , { {|| -( oBrw:nBottom+1 ) }, {|| -( oBrw:nLeft ) } }, ; + { -1, {|| -( oBrw:nRight - oBrw:nLeft + 1 ) } } ) + oHBar:range := { 1, oBrw:colCount } + oHBar:type := WVGSCROLL_HORIZONTAL + oHBar:create() + oHBar:scroll := {|mp1| oBrw:colPos := mp1[ 1 ], oBrw:refreshAll(), oBrw:forceStable() } + + oVBar := WvgScrollBar():new( oCrt, , { {|| -( oBrw:nTop ) }, {|| -( oBrw:nRight+1 ) } }, ; + { {|| -( oBrw:nBottom-oBrw:nTop+1 ) }, {|| -( 2 ) } } ) + oVBar:range := { 1, LastRec() } + oVBar:type := WVGSCROLL_VERTICAL + oVBar:create() + oVBar:scroll := {|mp1| Vou_BrwSetVScroll( mp1, oBrw ) } + + RETURN NIL + +/*----------------------------------------------------------------------*/ + +STATIC FUNCTION BrwBuildMenu( oCrt ) + LOCAL oMenu, oSMenu + + oMenu := oCrt:menubar() + + oSMenu := WvgMenu():new( oMenu ):create() + oSMenu:addItem( { '~First' , {|| alert( 'First' ) } } ) + oSMenu:addItem( { '~Second', {|| alert( 'Second' ) } } ) + oSMenu:addItem() + oSMenu:addItem( { '~Third' , {|| alert( 'Third' ) } } ) + oMenu:addItem( { oSMenu, '~Hello' } ) + + oSMenu := WvgMenu():new( oMenu ):create() + oSMenu:addItem( { '~First' , {|| alert( 'First' ) } } ) + oSMenu:addItem( '-' ) + oSMenu:addItem( { '~Second', {|| alert( 'Second' ) } } ) + oSMenu:addItem( { '~Third' , {|| alert( 'Third' ) } } ) + oMenu:addItem( { oSMenu, '~MyFriends' } ) + + oSMenu := WvgMenu():new( oMenu ):create() + oSMenu:title := "~Procedural" + oSMenu:addItem( { "Procedure ~1", } ) + oSMenu:addItem( { "Procedure ~2", } ) + oSMenu:itemSelected := {|mp1| MyMenuProcedure( 100+mp1 ) } + oSMenu:checkItem( 2 ) + oMenu:addItem( { oSMenu, NIL } ) + + RETURN oMenu + +//----------------------------------------------------------------------// + +STATIC FUNCTION BrwBuildToolBar( oCrt ) + LOCAL oTBar, nRGB := RGB( 172,172,172 ) + + oTBar := WvgToolBar():new( oCrt, , { -0.1,-0.1 }, { -3, {|| -( maxcol()+1 ) } } ) + + oTBar:style := WVGTOOLBAR_STYLE_FLAT + oTBar:borderStyle := WVGFRAME_RECT + + oTBar:buttonWidth := 40 //28 + oTBar:buttonHeight := 26 + + oTBar:imageWidth := 26 + oTBar:imageHeight := 24 + + oTBar:showToolTips := .t. + + // After setting properties, create toolbar. + oTBar:create() + + oTBar:addItem( "New" , hb_DirBase() + 'v_new.bmp' , , , , , , nRGB ) + oTBar:addItem( "Select" , hb_DirBase() + 'v_selct1.bmp', , , , , , nRGB ) + oTBar:addItem( "Calendar" , hb_DirBase() + 'v_calend.bmp', , , , , , nRGB ) + oTBar:addItem( "Tools" , hb_DirBase() + 'v_lock.bmp' , , , , , , nRGB ) + oTBar:addItem( "Index" , hb_DirBase() + 'v_index.bmp' , , , , , , nRGB ) + oTBar:addItem( "Show" , hb_DirBase() + 'v_clclt.bmp' , , , , , , nRGB ) + oTBar:addItem( "Hide" , hb_DirBase() + 'v_notes1.bmp', , , , , , nRGB ) + + RETURN oTBar + +//----------------------------------------------------------------------// +// Key Handelling +/*----------------------------------------------------------------------*/ + STATIC FUNCTION BrwHandleKey( oBrowse, nKey, lEnd ) LOCAL lVMove := .f. LOCAL lHMove := .f. @@ -512,6 +706,50 @@ STATIC FUNCTION BrwHandleKey( oBrowse, nKey, lEnd ) /*----------------------------------------------------------------------*/ +FUNCTION Vou_NavigateToCell( oBrowse ) + LOCAL nCount + + IF LastKey() == K_LBUTTONUP + IF oBrowse:hitTest( mrow(), mcol() ) == -5121 // on a cell + oBrowse:deHilite() + oBrowse:refreshCurrent() + oBrowse:forceStable() + + nCount := oBrowse:mRowPos - oBrowse:RowPos + + DispBegin() + WHILE ( nCount < 0 ) + nCount++ + oBrowse:Up() + ENDDO + + WHILE ( nCount > 0 ) + nCount -- + oBrowse:Down() + ENDDO + + nCount := oBrowse:mColPos - oBrowse:ColPos + WHILE ( nCount < 0 ) + nCount++ + oBrowse:Left() + ENDDO + + WHILE ( nCount > 0 ) + nCount-- + oBrowse:Right() + ENDDO + oBrowse:forceStable() + DispEnd() + oBrowse:hilite() + + RETURN .t. + ENDIF + ENDIF + + RETURN .f. + +/*----------------------------------------------------------------------*/ + STATIC FUNCTION DbSkipBlock( n ) LOCAL nSkipped := 0 @@ -593,63 +831,6 @@ STATIC FUNCTION Vou_ExecTBarAction( oBtn ) /*----------------------------------------------------------------------*/ -FUNCTION Vou_NavigateToCell( oBrowse ) - LOCAL nCount - LOCAL nHitWhere := oBrowse:HitTest( mrow(), mcol() ) - - IF nHitWhere == -5121 // on a cell - nCount := oBrowse:mRowPos - oBrowse:RowPos - DispBegin() - WHILE ( nCount < 0 ) - nCount++ - oBrowse:Up() - oBrowse:ForceStable() - ENDDO - - WHILE ( nCount > 0 ) - nCount -- - oBrowse:Down() - oBrowse:ForceStable() - ENDDO - - nCount := oBrowse:mColPos - oBrowse:ColPos - WHILE ( nCount < 0 ) - nCount++ - oBrowse:Left() - ENDDO - - WHILE ( nCount > 0 ) - nCount-- - oBrowse:Right() - ENDDO - DispEnd() - RETURN .t. - ENDIF - - RETURN .f. - -/*----------------------------------------------------------------------*/ - -FUNCTION Vou_BrwAddScrollBars( oCrt, oBrowse, oVBar, oHBar ) - - oHBar := WvgScrollBar():new( oCrt, , { {|| -( maxrow()-2 ) }, {|| -( oBrowse:nLeft ) } }, ; - { -1, {|| -( maxcol() - 5 - oBrowse:nLeft + 1 ) } } ) - oHBar:range := { 1, oBrowse:colCount } - oHBar:type := WVGSCROLL_HORIZONTAL - oHBar:create() - oHBar:scroll := {|mp1| oBrowse:colPos := mp1[ 1 ], oBrowse:refreshAll(), oBrowse:forceStable() } - - oVBar := WvgScrollBar():new( oCrt, , { {|| -( oBrowse:nTop ) }, {|| -( maxcol()-4 ) } }, ; - { {|| -( maxrow()-3-oBrowse:nTop+1 ) }, {|| -( 2 ) } } ) - oVBar:range := { 1, LastRec() } - oVBar:type := WVGSCROLL_VERTICAL - oVBar:create() - oVBar:scroll := {|mp1| Vou_BrwSetVScroll( mp1, oBrowse ) } - - RETURN NIL - -/*----------------------------------------------------------------------*/ - FUNCTION Vou_BrwSetVScroll( mp1, oBrowse ) LOCAL nCmd, nPos @@ -847,65 +1028,3 @@ FUNCTION ConfigBrowser( aFields, cUseAlias, aTLBR, cDesc, oParent, cColorSpec, n //-------------------------------------------------------------------// -STATIC FUNCTION BrwBuildMenu( oCrt ) - LOCAL oMenu, oSMenu - - oMenu := oCrt:menubar() - - oSMenu := WvgMenu():new( oMenu ):create() - oSMenu:addItem( { '~First' , {|| alert( 'First' ) } } ) - oSMenu:addItem( { '~Second', {|| alert( 'Second' ) } } ) - oSMenu:addItem() - oSMenu:addItem( { '~Third' , {|| alert( 'Third' ) } } ) - oMenu:addItem( { oSMenu, '~Hello' } ) - - oSMenu := WvgMenu():new( oMenu ):create() - oSMenu:addItem( { '~First' , {|| alert( 'First' ) } } ) - oSMenu:addItem( '-' ) - oSMenu:addItem( { '~Second', {|| alert( 'Second' ) } } ) - oSMenu:addItem( { '~Third' , {|| alert( 'Third' ) } } ) - oMenu:addItem( { oSMenu, '~MyFriends' } ) - - oSMenu := WvgMenu():new( oMenu ):create() - oSMenu:title := "~Procedural" - oSMenu:addItem( { "Procedure ~1", } ) - oSMenu:addItem( { "Procedure ~2", } ) - oSMenu:itemSelected := {|mp1| MyMenuProcedure( 100+mp1 ) } - oSMenu:checkItem( 2 ) - oMenu:addItem( { oSMenu, NIL } ) - - RETURN oMenu - -//----------------------------------------------------------------------// - -STATIC FUNCTION BrwBuildToolBar( oCrt ) - LOCAL oTBar - - oTBar := WvgToolBar():new( oCrt, , { -0.1,-0.1 }, { -3, {|| -( maxcol()+1 ) } } ) - - oTBar:style := WVGTOOLBAR_STYLE_FLAT - oTBar:borderStyle := WVGFRAME_RECT - - oTBar:buttonWidth := 40 //28 - oTBar:buttonHeight := 26 - - oTBar:imageWidth := 26 - oTBar:imageHeight := 24 - - oTBar:showToolTips := .t. - - // After setting properties, create toolbar. - oTBar:create() - - oTBar:addItem( "New" , hb_DirBase() + 'v_new.bmp' ) - oTBar:addItem( "Select" , hb_DirBase() + 'v_selct1.bmp' ) - oTBar:addItem( "Calendar" , hb_DirBase() + 'v_calend.bmp' ) - oTBar:addItem( "Tools" , hb_DirBase() + 'v_lock.bmp' ) - oTBar:addItem( "Index" , hb_DirBase() + 'v_index.bmp' ) - oTBar:addItem( "Show" , hb_DirBase() + 'v_clclt.bmp' ) - oTBar:addItem( "Hide" , hb_DirBase() + 'v_notes1.bmp' ) - - RETURN oTBar - -//----------------------------------------------------------------------// - diff --git a/harbour/contrib/gtwvg/wvgax.prg b/harbour/contrib/gtwvg/wvgax.prg index a3d8110f64..4b444fdb55 100644 --- a/harbour/contrib/gtwvg/wvgax.prg +++ b/harbour/contrib/gtwvg/wvgax.prg @@ -84,7 +84,6 @@ CLASS WvgActiveXControl FROM WvgWindow DATA server INIT NIL DATA license INIT NIL DATA controlFlags INIT 0 - DATA visible INIT .T. DATA default INIT .F. DATA cancel INIT .F. @@ -102,7 +101,7 @@ CLASS WvgActiveXControl FROM WvgWindow METHOD create( oParent, oOwner, aPos, aSize, aPresParams, lVisible, cCLSID, cLicense ) METHOD Destroy() METHOD execEvent( nEvent, ... ) - METHOD handleEvent( nEvent, aInfo ) + METHOD handleEvent( nEvent, aNM ) METHOD mapEvent( nEvent, bBlock ) METHOD inheritPresParams() @@ -129,6 +128,7 @@ METHOD WvgActiveXControl:new( oParent, oOwner, aPos, aSize, aPresParams, lVisibl ::wvgWindow:new( oParent, oOwner, aPos, aSize, aPresParams, lVisible ) ::style := WS_CHILD + WS_VISIBLE + WS_CLIPCHILDREN + WS_CLIPSIBLINGS + ::exStyle := WS_EX_CLIENTEDGE ::objType := objTypeActiveX ::className := 'WIN_OLEAUTO' @@ -158,25 +158,39 @@ METHOD WvgActiveXControl:Create( oParent, oOwner, aPos, aSize, aPresParams, lVis Win_AxInit() - hWnd := WAPI_CreateWindowEX( 0, "AtlAxWin", ::CLSID, ::style, ::aPos[ 1 ], ::aPos[ 2 ], ; + hWnd := WAPI_CreateWindowEX( ::exStyle, "AtlAxWin", ::CLSID, ::style, ::aPos[ 1 ], ::aPos[ 2 ], ; ::aSize[ 1 ], ::aSize[ 2 ], Win_N2P( ::hContainer ), 0 ) IF empty( hWnd ) RETURN NIL ENDIF ::hWnd := Win_P2N( hWnd ) + ::pWnd := hWnd - hObj := __AxGetControl( Win_N2P( ::hWnd ) ) + hObj := __AxGetControl( ::pWnd ) if empty( hObj ) RETURN NIL ENDIF ::oOLE:__hObj := hObj - __AxDoVerb( Win_N2P( ::hWnd ), -4 ) + __AxDoVerb( ::pWnd, -4 ) IF !Empty( ::hEvents ) ::oOle:__hSink := __AxRegisterHandler( ::oOle:__hObj, {|nEvent,...| ::execEvent( nEvent, ... ) } ) ENDIF - ::oParent:addChild( SELF ) +#if 0 + ::SetWindowProcCallback() /* Is this needed to catch windowing events ? - NO */ +#endif + + ::oParent:addChild( Self ) + IF ::visible + ::show() + ELSE + ::hide() + ENDIF + ::setPosAndSize() + IF ::isParentCrt() + ::oParent:setFocus() + ENDIF RETURN Self @@ -199,16 +213,25 @@ PROCEDURE execEvent( nEvent, ... ) CLASS WvgActiveXControl /*----------------------------------------------------------------------*/ -METHOD WvgActiveXControl:handleEvent( nEvent, aInfo ) +METHOD WvgActiveXControl:handleEvent( nEvent, aNM ) LOCAL nHandled := 0 - HB_SYMBOL_UNUSED( aInfo ) + HB_SYMBOL_UNUSED( aNM ) SWITCH nEvent - CASE WM_SIZE + CASE HB_GTE_RESIZED + IF ::isParentCrt() + ::rePosition() + ENDIF IF hb_isBlock( ::sl_resize ) - eval( ::sl_resize, NIL, NIL, self ) + eval( ::sl_resize, NIL, NIL, Self ) + ENDIF + EXIT + + CASE HB_GTE_ANY + IF aNM[ 1 ] == WM_LBUTTONUP +uiDebug( "here the event is caught" ) ENDIF EXIT @@ -227,12 +250,10 @@ METHOD WvgActiveXControl:OnError() /*----------------------------------------------------------------------*/ METHOD WvgActiveXControl:Destroy() -#if 0 - WAPI_OutputDebugString( "WvgActiveXControl:Destroy()" ) -#endif - IF !empty( ::oOLE:__hObj ) - IF WAPI_IsWindow( Win_N2P( ::hWnd ) ) - WAPI_DestroyWindow( Win_N2P( ::hWnd ) ) + + IF ! empty( ::oOLE:__hObj ) + IF WAPI_IsWindow( ::pWnd ) + WAPI_DestroyWindow( ::pWnd ) ENDIF ::oOle := NIL ::hWnd := NIL @@ -244,9 +265,9 @@ METHOD WvgActiveXControl:Destroy() METHOD WvgActiveXControl:mapEvent( nEvent, bBlock ) - if hb_isNumeric( nEvent ) .and. hb_isBlock( bBlock ) + IF hb_isNumeric( nEvent ) .AND. hb_isBlock( bBlock ) ::hEvents[ nEvent ] := bBlock - endif + ENDIF RETURN Self diff --git a/harbour/contrib/gtwvg/wvgcheck.prg b/harbour/contrib/gtwvg/wvgcheck.prg index acd32c6e44..c513e24ac8 100644 --- a/harbour/contrib/gtwvg/wvgcheck.prg +++ b/harbour/contrib/gtwvg/wvgcheck.prg @@ -159,10 +159,9 @@ METHOD WvgCheckBox:handleEvent( nMessage, aNM ) ::oParent:setFocus() ENDIF eval( ::sl_lbClick, ::editBuffer, NIL, Self ) - IF ::isParentCrt() + IF ::pointerFocus ::setFocus() ENDIF -// RETURN EVENT_HANDELLED ENDIF ENDIF diff --git a/harbour/contrib/gtwvg/wvgdarea.prg b/harbour/contrib/gtwvg/wvgdarea.prg index de0942a2b4..3802edf371 100644 --- a/harbour/contrib/gtwvg/wvgdarea.prg +++ b/harbour/contrib/gtwvg/wvgdarea.prg @@ -76,12 +76,6 @@ /*----------------------------------------------------------------------*/ -#ifndef __DBG_PARTS__ -#xtranslate hb_traceLog( [] ) => -#endif - -/*----------------------------------------------------------------------*/ - CLASS WvgDrawingArea INHERIT WvgWindow DATA caption INIT "" @@ -130,12 +124,8 @@ METHOD WvgDrawingArea:create( oParent, oOwner, aPos, aSize, aPresParams, lVisibl /*----------------------------------------------------------------------*/ METHOD WvgDrawingArea:handleEvent( nMessage, aNM ) - LOCAL hDC - - hb_traceLog( " %s:handleEvent( %i )", __ObjGetClsName( self ), nMessage ) DO CASE - CASE nMessage == HB_GTE_RESIZED IF hb_isBlock( ::sl_resize ) eval( ::sl_resize, NIL, NIL, self ) @@ -144,15 +134,12 @@ METHOD WvgDrawingArea:handleEvent( nMessage, aNM ) RETURN EVENT_HANDELLED CASE nMessage == HB_GTE_CTLCOLOR - hDC := aNM[ 1 ] - IF hb_isNumeric( ::clr_FG ) - WVG_SetTextColor( hDC, ::clr_FG ) + WVG_SetTextColor( aNM[ 1 ], ::clr_FG ) ENDIF IF hb_isNumeric( ::hBrushBG ) - WVG_SetBkMode( hDC, 1 ) - - WVG_FillRect( hDC, { 0,0,::currentSize()[1],::currentSize()[2]}, ::hBrushBG ) + WVG_SetBkMode( aNM[ 1 ], 1 ) + WVG_FillRect( aNM[ 1 ], { 0,0,::currentSize()[1],::currentSize()[2]}, ::hBrushBG ) RETURN EVENT_HANDELLED ENDIF diff --git a/harbour/contrib/gtwvg/wvglistb.prg b/harbour/contrib/gtwvg/wvglistb.prg index d78cf084ae..516af35046 100644 --- a/harbour/contrib/gtwvg/wvglistb.prg +++ b/harbour/contrib/gtwvg/wvglistb.prg @@ -222,7 +222,6 @@ METHOD WvgListBox:handleEvent( nMessage, aNM ) ENDIF CASE nMessage == HB_GTE_NOTIFY -uiDebug( "listbox:notify", aNM[1], aNM[2], aNM[3] ) CASE nMessage == HB_GTE_CTLCOLOR IF hb_isNumeric( ::clr_FG ) diff --git a/harbour/contrib/gtwvg/wvgpushb.prg b/harbour/contrib/gtwvg/wvgpushb.prg index 3b1d5360b9..fc0b0c663e 100644 --- a/harbour/contrib/gtwvg/wvgpushb.prg +++ b/harbour/contrib/gtwvg/wvgpushb.prg @@ -154,7 +154,6 @@ METHOD WvgPushButton:create( oParent, oOwner, aPos, aSize, aPresParams, lVisible METHOD WvgPushButton:handleEvent( nMessage, aNM ) DO CASE - CASE nMessage == HB_GTE_RESIZED IF ::isParentCrt() ::rePosition() @@ -171,7 +170,7 @@ METHOD WvgPushButton:handleEvent( nMessage, aNM ) ::oParent:setFocus() ENDIF eval( ::sl_lbClick, NIL, NIL, self ) - IF ::isParentCrt() + IF ::pointerFocus ::setFocus() ENDIF ENDIF diff --git a/harbour/contrib/gtwvg/wvgscrlb.prg b/harbour/contrib/gtwvg/wvgscrlb.prg index 71365b9382..0daf668f63 100644 --- a/harbour/contrib/gtwvg/wvgscrlb.prg +++ b/harbour/contrib/gtwvg/wvgscrlb.prg @@ -116,12 +116,6 @@ typedef struct tagRECT { ; #endif /*----------------------------------------------------------------------*/ -#ifndef __DBG_PARTS__ -#xtranslate hb_traceLog( [] ) => -#endif - -/*----------------------------------------------------------------------*/ - CLASS WvgScrollBar INHERIT WvgWindow, DataRef DATA autoTrack INIT .t. @@ -202,10 +196,7 @@ METHOD create( oParent, oOwner, aPos, aSize, aPresParams, lVisible ) CLASS WvgSc METHOD handleEvent( nMessage, aNM ) CLASS WvgScrollBar LOCAL nScrMsg, nScrPos, nCommand - hb_traceLog( " %s:handleEvent( %i ) %i %i %i %i", __ObjGetClsName( self ), nMessage ) - DO CASE - CASE nMessage == HB_GTE_RESIZED IF ::isParentCrt() ::rePosition() @@ -219,7 +210,11 @@ METHOD handleEvent( nMessage, aNM ) CLASS WvgScrollBar ENDIF CASE nMessage == HB_GTE_HSCROLL - IF !hb_isBlock( ::sl_xbeSB_Scroll ) + IF ::isParentCrt() + ::oParent:setFocus() + ENDIF + + IF ! hb_isBlock( ::sl_xbeSB_Scroll ) RETURN EVENT_UNHANDELLED ENDIF @@ -227,7 +222,7 @@ METHOD handleEvent( nMessage, aNM ) CLASS WvgScrollBar IF nScrMsg == SB_THUMBPOSITION .or. nScrMsg == SB_THUMBTRACK nScrPos := aNM[ 2 ] ELSE - nScrPos := WAPI_GetScrollPos( ::pWnd, SB_CTL ) + nScrPos := WAPI_GetScrollPos( ::pWnd, SB_CTL ) ENDIF DO CASE @@ -282,11 +277,14 @@ METHOD handleEvent( nMessage, aNM ) CLASS WvgScrollBar ENDCASE ::sl_editBuffer := nScrPos - eval( ::sl_xbeSB_Scroll, { nScrPos, nCommand }, NIL, self ) + eval( ::sl_xbeSB_Scroll, { nScrPos, nCommand }, NIL, Self ) RETURN EVENT_HANDELLED CASE nMessage == HB_GTE_VSCROLL + IF ::isParentCrt() + ::oParent:setFocus() + ENDIF nScrMsg := aNM[ 1 ] IF nScrMsg == SB_THUMBPOSITION .or. nScrMsg == SB_THUMBTRACK @@ -295,7 +293,7 @@ METHOD handleEvent( nMessage, aNM ) CLASS WvgScrollBar nScrPos := WAPI_GetScrollPos( ::pWnd, SB_CTL ) ENDIF - IF !hb_isBlock( ::sl_xbeSB_Scroll ) + IF ! hb_isBlock( ::sl_xbeSB_Scroll ) RETURN EVENT_UNHANDELLED ENDIF diff --git a/harbour/contrib/gtwvg/wvgsle.prg b/harbour/contrib/gtwvg/wvgsle.prg index 3c9792ac50..9e5697ee04 100644 --- a/harbour/contrib/gtwvg/wvgsle.prg +++ b/harbour/contrib/gtwvg/wvgsle.prg @@ -247,8 +247,7 @@ METHOD handleEvent( nMessage, aNM ) CLASS WvgSLE RETURN EVENT_HANDELLED ENDIF ELSEIF aNM[ 2 ] == 65 -uiDebug( "edit",65 ) - RETURN EVENT_HANDELLED + // RETURN EVENT_HANDELLED ENDIF ENDCASE diff --git a/harbour/contrib/gtwvg/wvgwin.c b/harbour/contrib/gtwvg/wvgwin.c index fefc69c534..6a8871f6c6 100644 --- a/harbour/contrib/gtwvg/wvgwin.c +++ b/harbour/contrib/gtwvg/wvgwin.c @@ -188,6 +188,13 @@ HB_FUNC( WVG_SETFOCUS ) /*----------------------------------------------------------------------*/ +HB_FUNC( WVG_GETFOCUS ) +{ + hb_retnint( ( HB_PTRDIFF ) GetFocus() ); +} + +/*----------------------------------------------------------------------*/ + HB_FUNC( WVG_SETTEXTCOLOR ) { hb_retnl( ( HB_ULONG ) SetTextColor( ( HDC ) ( HB_PTRDIFF ) hb_parnint( 1 ), ( COLORREF ) hb_parnl( 2 ) ) ); @@ -1332,7 +1339,20 @@ HB_FUNC( WVG_SENDTOOLBARMESSAGE ) case TB_MAPACCELERATOR: case TB_MOVEBUTTON: case TB_GETINSERTMARK: + break; case TB_GETCOLORSCHEME: + { + PHB_ITEM info = hb_itemArrayNew( 2 ); + COLORSCHEME colorScheme; + + colorScheme.dwSize = sizeof( COLORSCHEME ); + SendMessage( hTB, TB_GETCOLORSCHEME, ( WPARAM ) 0, ( LPARAM ) & colorScheme ); + + hb_arraySetNInt( info, 1, colorScheme.clrBtnHighlight ); + hb_arraySetNInt( info, 2, colorScheme.clrBtnShadow ); + hb_itemReturnRelease( info ); + break; + } case TB_CUSTOMIZE: case TB_GETANCHORHIGHLIGHT: case TB_GETEXTENDEDSTYLE: diff --git a/harbour/contrib/gtwvg/wvtwin.ch b/harbour/contrib/gtwvg/wvtwin.ch index b27c146dc4..5bed06cf55 100644 --- a/harbour/contrib/gtwvg/wvtwin.ch +++ b/harbour/contrib/gtwvg/wvtwin.ch @@ -212,7 +212,22 @@ #define TVN_FIRST (0-400) #define HDM_FIRST 0x1200 // Header messages #define TCM_FIRST 0x1300 // Tab control messages + + +#define CCM_FIRST 0x2000 +#define CCM_LAST (CCM_FIRST+0x200) #define CCM_SETBKCOLOR 8193 +#define CCM_SETCOLORSCHEME 8194 +#define CCM_GETCOLORSCHEME 8195 +#define CCM_GETDROPTARGET 8196 +#define CCM_SETUNICODEFORMAT 8197 +#define CCM_GETUNICODEFORMAT 8198 +#define CCM_SETVERSION 0x2007 +#define CCM_GETVERSION 0x2008 +#define CCM_SETNOTIFYWINDOW 0x2009 +#define CCM_SETWINDOWTHEME 0x200b +#define CCM_DPISCALE 0x200c + /*----------------------------------------------------------------------*/ /*----------------------------------------------------------------------*/