Download text file
#if 0
---------------------------- PowerBASIC v8.x
---| DASoft |------------------------------------------
---------------------------- Code DATE: 2005-02-19
| FILE NAME scrollbar2.bas | by
---------------------------- Don Schullian, Jr.
This code is released into the Public Domain
----------------------------------------------------------
No guarantee as to the viability, accuracy, or safety of
use of this code is implied, warranted, or guaranteed
----------------------------------------------------------
Use at your own risk!
----------------------------------------------------------
CONTACT AUTHOR AT d83@DASoftVSS.com
-------------------------------------------------------------------------
#endif
#if 0
See the notes in "Scrollbar Demo 1.bas"
The difference here is that by creating a separate callba
less code and confusing are created. The overall effects
I've also changed the output to the labels to be the perc
scrollbars and left it as the absolute value for the smal
controlling which with a flag set in USER 8 of the label.
Don
www.DASoftVSS.com
basic@DASoftVSS.com
#endif
#COMPILE EXE
#INCLUDE "WIN32API.INC"
%ID_SCROLLv = 2000 ' By using a seperate callback we no longer need to
%ID_SCROLLh = 2011 ' keep the individual scrollbar ID's in any particular
%ID_SCROLL2 = 2102 ' order
'
'------------------------------------------------------------------------------
'
SUB UpdateLabel ( BYVAL hParent AS DWORD, _
BYVAL CtrlID AS LONG , _
BYVAL tSB AS SCROLLINFO PTR )
DIM Flag AS LOCAL LONG
DIM P AS LOCAL CUX
IF CtrlID = 0 THEN EXIT SUB
CONTROL GET USER hParent, CtrlID, 8 TO Flag
IF Flag THEN
P = @tSB.nPos / @tSB.nMax
P = MAX(P,0.01)
P = MIN(P,1)
CONTROL SET TEXT hParent, CtrlID, FORMAT$(P,"0%")
ELSE
CONTROL SET TEXT hParent, CtrlID, FORMAT$(@tSB.nPos)
END IF
END SUB
'
'------------------------------------------------------------------------------
'
CALLBACK FUNCTION ScrollbarCallback
DIM Ctrl AS LOCAL LONG ' CBLPARAM = handle of scrollbar
DIM hCtrl AS LOCAL DWORD ' CBLPARAM = handle of scrollbar
DIM tSB AS LOCAL SCROLLINFO PTR '
'
IF (CBMSG <> %WM_VSCROLL ) AND _ '
(CBMSG <> %WM_HSCROLL ) THEN EXIT FUNCTION ' not for us!
'
DIALOG GET USER CBLPARAM, 8 TO tSB ' get the UDT pointer
SELECT CASE LO(WORD,CBWPARAM) ' get the hot command
CASE %SB_LINEDOWN : INCR @tSB.nPos '
CASE %SB_PAGEDOWN : @tSB.nPos = @tSB.nPos + @tSB.nPage '
CASE %SB_LINEUP : DECR @tSB.nPos '
CASE %SB_PAGEUP : @tSB.nPos = @tSB.nPos - @tSB.nPage '
CASE %SB_THUMBPOSITION, _ '
%SB_THUMBTRACK : @tSB.nPos = HI(WORD,CBWPARAM) '
CASE %SB_BOTTOM : @tSB.nPos = @tSB.nMax '
CASE %SB_TOP : @tSB.nPos = 1 '
CASE %SB_ENDSCROLL : EXIT FUNCTION '
END SELECT '
@tSB.nPos = MAX(@tSB.nMin, @tSB.nPos) ' can't be less than minimum
@tSB.nPos = MIN(@tSB.nMax, @tSB.nPos) ' can't be more than maximim
DIALOG SEND CBLPARAM, %SBM_SETPOS, @tSB.nPos, %TRUE '
DIALOG GET USER CBLPARAM, 6 TO Ctrl ' get the label's handle
UpdateLabel CBHNDL, Ctrl, tSB ' do what it says
'
FUNCTION = 1 ' send an 'I'm done' message to Windows
END FUNCTION
'
'------------------------------------------------------------------------------
'
CALLBACK FUNCTION DlgCallback
DIM Ctrl AS LOCAL LONG
DIM tSB AS LOCAL SCROLLINFO PTR
SELECT CASE CBMSG
CASE %WM_COMMAND : IF CBCTLMSG <> %BN_CLICKED THEN EXIT FUNCTION
CONTROL GET USER CBHNDL, CBCTL, 8 TO Ctrl ' get the scrollbar's ctrlid
CONTROL GET USER CBHNDL, Ctrl, 8 TO tSB ' get the pointer to the UDT
CONTROL GET USER CBHNDL, CBCTL, 7 TO @tSB.nPos ' get the pre-set value
CONTROL SEND CBHNDL, Ctrl, %SBM_SETPOS, @tSB.nPos, %TRUE ' set the scrollbar's new value
CONTROL GET USER CBHNDL, Ctrl, 6 TO Ctrl ' get label's CtrlID
UpdateLabel CBHNDL, Ctrl, tSB
END SELECT
END FUNCTION
'
'------------------------------------------------------------------------------
'
FUNCTION PBMAIN
DIM hDlg AS LOCAL DWORD
DIM tSB(2) AS LOCAL SCROLLINFO
DIM Txt AS LOCAL STRING
DIALOG NEW 0, "SCROLLBAR Test",,, 200, 100, %WS_SYSMENU OR %WS_CAPTION TO hDlg
CONTROL ADD BUTTON, hDlg, 1001, "Set Min", 135, 5, 50, 13
CONTROL SET USER hDlg, 1001, 7, 1
CONTROL SET USER hDlg, 1001, 8, %ID_SCROLLv
CONTROL ADD BUTTON, hDlg, 1002, "Set Max", 135, 20, 50, 13
CONTROL SET USER hDlg, 1002, 7, 100
CONTROL SET USER hDlg, 1002, 8, %ID_SCROLLv
CONTROL ADD BUTTON, hDlg, 1003, "Set Min", 5, 75, 50, 13
CONTROL SET USER hDlg, 1003, 7, 1
CONTROL SET USER hDlg, 1003, 8, %ID_SCROLLh
CONTROL ADD BUTTON, hDlg, 1004, "Set Max", 60, 75, 50, 13
CONTROL SET USER hDlg, 1004, 7, 200
CONTROL SET USER hDlg, 1004, 8, %ID_SCROLLh
CONTROL ADD LABEL , hDlg, 1005, "50%" , 135, 35, 50, 13, %WS_CHILD Or %WS_VISIBLE Or %WS_BORDER Or %SS_CENTER Or %SS_CENTERIMAGE, %WS_EX_LEFT Or %WS_EX_LTRREADING
CONTROL SET COLOR hDlg, 1005, %BLACK, %WHITE
CONTROL SET USER hDlg, 1005, 8, 1
CONTROL ADD LABEL , hDlg, 1006, "50%" , 115, 75, 50, 13, %WS_CHILD Or %WS_VISIBLE Or %WS_BORDER Or %SS_CENTER Or %SS_CENTERIMAGE, %WS_EX_LEFT Or %WS_EX_LTRREADING
CONTROL SET COLOR hDlg, 1006, %BLACK, %WHITE
CONTROL SET USER hDlg, 1006, 8, 1
CONTROL ADD LABEL , hDlg, 1007, "1" , 5, 5, 15, 13, %WS_CHILD Or %WS_VISIBLE Or %WS_BORDER Or %SS_CENTER Or %SS_CENTERIMAGE, %WS_EX_LEFT Or %WS_EX_LTRREADING
CONTROL SET COLOR hDlg, 1007, %BLACK, %WHITE
CONTROL ADD SCROLLBAR, hDlg, %ID_SCROLLv, "", 190, 0, 11, 100, %SBS_VERT OR %SBS_RIGHTALIGN, CALL ScrollbarCallback
tSB(0).cbSize = SIZEOF(SCROLLINFO) ' size of UDT
tSB(0).fMask = %SIF_ALL ' Sets nPage, nPos, nMin, and nMax
tSB(0).nMin = 1 ' 1st position
tSB(0).nMax = 109 ' Last position + nPage - 1
tSB(0).nPage = 10 ' size of cursor block
tSB(0).nPos = 50 ' starting position
CONTROL SET USER hDlg, %ID_SCROLLv, 6, 1005 ' store label's CtrlID
CONTROL SET USER hDlg, %ID_SCROLLv, 8, VARPTR(tSB(0)) ' store pointer to UDT
CONTROL SEND hDlg, %ID_SCROLLv, %SBM_SETSCROLLINFO, %TRUE, VARPTR(tSB(0)) ' initialize the scrollbar & redraw
tSB(0).nMax = 100 ' reset the max value
CONTROL ADD SCROLLBAR, hDlg, %ID_SCROLLh, "", 0, 90, 189, 10, %SBS_HORZ OR %SBS_BOTTOMALIGN, CALL ScrollbarCallback
tSB(1).cbSize = SIZEOF(SCROLLINFO)
tSB(1).fMask = %SIF_ALL
tSB(1).nMin = 1
tSB(1).nMax = 209
tSB(1).nPage = 10
tSB(1).nPos = 100
CONTROL SET USER hDlg, %ID_SCROLLh, 6, 1006
CONTROL SET USER hDlg, %ID_SCROLLh, 8, VARPTR(tSB(1))
CONTROL SEND hDlg, %ID_SCROLLh, %SBM_SETSCROLLINFO, %TRUE, VARPTR(tSB(1))
tSB(1).nMax = 200
CONTROL ADD SCROLLBAR, hDlg, %ID_SCROLL2, "", 20, 5, 20, 13, %SBS_VERT, CALL ScrollbarCallback
tSB(2).cbSize = SIZEOF(SCROLLINFO)
tSB(2).fMask = %SIF_ALL
tSB(2).nMin = 1
tSB(2).nMax = 15
tSB(2).nPage = 1
tSB(2).nPos = 1
CONTROL SET USER hDlg, %ID_SCROLL2, 6, 1007
CONTROL SET USER hDlg, %ID_SCROLL2, 8, VARPTR(tSB(2))
CONTROL SEND hDlg, %ID_SCROLL2, %SBM_SETSCROLLINFO, %TRUE, VARPTR(tSB(2))
DIALOG SHOW MODAL hDlg CALL DlgCallback
Txt = "Vert Scrollbar" & STR$(tSB(0).nPos) & $CRLF & _
"Horz Scrollbar" & STR$(tSB(1).nPos) & $CRLF & _
"Scrollbar2" & STR$(tSB(2).nPos)
MSGBOX Txt, %MB_OK, "Results"
END FUNCTION