1. RE: (Newbie) Using built-in scrollbars - ta Dan!

Dan,

Thanks very much for your amended code - it got me thinking and I have 
now figured out how to alter the scroll ranges as well.  

I delved into some win32 documentation and it turned out that you should 
be able to get/set built-in scrollbar attributes with the 
get/setScrollInfo functions. 

Looking in win32lib these functions exist but they have not been quite 
correctly implemented for built-in scrollbars. I extracted & fixed the 
relevant code and I attach an amended code sample below which shows the 
built-in scrollbar ranges being altered programmatically.

Do you happen to know who I should send win32lib fix requests to these 
days?

Many thanks to you and everybody else who replied to my original post

Regards,

Phil

-- scroll.exw
-- Test built-in scrollbars
-- (displays scrollbar position in window)
-- Phil Russell Nov 2001
---- with slight modification by Dan Moyer
---- and further by Phil after inspiration provided above...

without warning
include win32lib.ew

-- Create window with built-in scrollbars
constant ScrollWin =
    create( Window, "ScrollTest", 0, Default, Default, 200, 200, 
WS_SCROLLBARS )
    
    
-- Modified from win32lib.setScrollRange     
procedure setBuiltInScrollRange( integer window_id, integer scrollbar, 
integer min, integer max )

    -- set the allowable range for a scroll bar
    atom sif
    object VOID -- ***duplicated from win32lib

    -- store value ***no access to win32lib private sequence
    --window_range[ id ] = { min, max }

    -- Allocate structure
    sif = acquire_mem(0, SIZEOF_SCROLLINFO )
	
    -- store values
    store( sif, sifSize, SIZEOF_SCROLLINFO )
    store( sif, sifMask, SIF_RANGE )
    store( sif, sifMin, min )
    store( sif, sifMax, max )

    -- check for valid scrollbar option
    -- SB_VERT = vertical scrollbar
    -- SB_HORZ = horizontal scrollbar
    if scrollbar = SB_VERT or scrollbar = SB_HORZ then

	VOID = w32Func( xSetScrollInfo,
		    {   getHandle( window_id ),     -- handle
			scrollbar,                  -- scroll bar to change
			sif,                        -- pointer to structure
			0 } )                       -- redraw flag
    end if
	
    -- Free structure
    release_mem( sif )
	
end procedure

    
-- Process scroll event (as amended by Dan Moyer and further by me)
procedure onScroll_ScrollWin( integer pos)

-- show scrollbar positions
setPenPosition( ScrollWin, 1, 10 ) -- ADD THIS
wPuts(ScrollWin, "Horizontal: " & sprint(getHScrollPos( ScrollWin ))) -- 
AND THIS
setPenPosition( ScrollWin, 1, 30 )-- AND THIS
wPuts(ScrollWin, "Vertical: " & sprint(getVScrollPos( ScrollWin ))) 
--AND THIS

end procedure

procedure onOpen_ScrollWin ()

	-- *** Fool win32lib into not clipping the scrollbars
	setScrollRange(ScrollWin, 0, 999)
	
	-- *** Alter the scroll ranges
	setBuiltInScrollRange( ScrollWin, SB_VERT, 0, 500 )
	setBuiltInScrollRange( ScrollWin, SB_HORZ, 0, 20 )	

end procedure
   
-- Trap scroll event
onScroll[ScrollWin] = routine_id("onScroll_ScrollWin")   

-- Initialisation
onOpen[ScrollWin] = routine_id("onOpen_ScrollWin")

-- Hand control over to Windows
WinMain( ScrollWin, Normal )

new topic     » topic index » view message » categorize

2. RE: (Newbie) Using built-in scrollbars - ta Dan!

Couple small additions/corrections:
-- scroll.exw
-- Test built-in scrollbars
-- (displays scrollbar position in window)
-- Phil Russell Nov 2001
---- with slight modification by Dan Moyer
---- and further by Phil after inspiration provided above...

without warning
include win32lib.ew
include graphics.e
-- Create window with built-in scrollbars
constant ScrollWin =
    create( Window, "ScrollTest", 0, Default, Default, 200, 200,
WS_SCROLLBARS )


-- Modified from win32lib.setScrollRange
procedure setBuiltInScrollRange( integer window_id, integer scrollbar,
integer min, integer max )

    -- set the allowable range for a scroll bar
    atom sif
    object VOID -- ***duplicated from win32lib

    -- store value ***no access to win32lib private sequence
    --window_range[ id ] = { min, max }

    -- Allocate structure
    sif = acquire_mem(0, SIZEOF_SCROLLINFO )

    -- store values
    store( sif, sifSize, SIZEOF_SCROLLINFO )
    store( sif, sifMask, SIF_RANGE )
    store( sif, sifMin, min )
    store( sif, sifMax, max )

    -- check for valid scrollbar option
    -- SB_VERT = vertical scrollbar
    -- SB_HORZ = horizontal scrollbar
    if scrollbar = SB_VERT or scrollbar = SB_HORZ then

VOID = w32Func( xSetScrollInfo,
    {   getHandle( window_id ),     -- handle
scrollbar,                  -- scroll bar to change
sif,                        -- pointer to structure
0 } )                       -- redraw flag
    end if

    -- Free structure
    release_mem( sif )

end procedure


-- Process scroll event (as amended by Dan Moyer and further by me)
procedure onScroll_ScrollWin( integer pos)

--Clear the old text before we write to the window.
repaintWindow(ScrollWin)

-- show scrollbar positions
--Not setPenPosition, just setPenPos :)
setPenPos( ScrollWin, 1, 10 ) -- ADD THIS
wPuts(ScrollWin, "Horizontal: " & sprint(getHScrollPos( ScrollWin ))) 
--AND THIS
setPenPos( ScrollWin, 1, 30 )-- AND THIS
wPuts(ScrollWin, "Vertical: " & sprint(getVScrollPos( ScrollWin )))
--AND THIS

end procedure

procedure onOpen_ScrollWin ()

-- *** Fool win32lib into not clipping the scrollbars
setScrollRange(ScrollWin, 0, 999)

-- *** Alter the scroll ranges
setBuiltInScrollRange( ScrollWin, SB_VERT, 0, 500 )
setBuiltInScrollRange( ScrollWin, SB_HORZ, 0, 20 )

end procedure

-- Trap scroll event
onScroll[ScrollWin] = routine_id("onScroll_ScrollWin")

-- Initialisation
onOpen[ScrollWin] = routine_id("onOpen_ScrollWin")

-- Hand control over to Windows
WinMain( ScrollWin, Normal )

new topic     » goto parent     » topic index » view message » categorize

3. RE: (Newbie) Using built-in scrollbars - ta Dan!

oops, graphics.e doesn't need to be included.  When I tried to run the 
code, and saw the setPenPosition error, my first impulse was obviously 
that the include was forgotten.  Then I looked it up and found the 
correct command (RTFM, Cassidy).  Sorry.

-=Cassidy Napoli=-

new topic     » goto parent     » topic index » view message » categorize

4. RE: (Newbie) Using built-in scrollbars - ta Dan!

Cassidy,

Thanks for this.  It took me quite a while to work out why 
setPenPosition worked for me but not for you. Eventually I found it in 
compat01.ew which apparently contains deprecated win32lib functions.  
Evidently it is included in my version of win32lib but not yours. As you 
rightly point out, setPenPos is the correct function to use.

Regards

Phil

Cassidy Napoli wrote:
> oops, graphics.e doesn't need to be included.  When I tried to run the 
> code, and saw the setPenPosition error, my first impulse was obviously 
> that the include was forgotten.  Then I looked it up and found the 
> correct command (RTFM, Cassidy).  Sorry.
> 
> -=Cassidy Napoli=-
> 
>

new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu