Here is a UNDEBUGGED code sample that dynamically draws a slider control using DLlCalls and returns the user selected value:
;***************************************************************************
;** TrackBar32 in a WIL Dialog
;**
;** Purpose: Add TrackBar32 Controls to WIL Dialog
;**
;** http://msdn.microsoft.com/en-us/library/windows/desktop/ff486103(v=vs.85).aspx
;** http://www.minigui.org/api_ref/3.0.12_standalone/group__ctrl__trackbar__msgs.html
;**
;** Developer: Deana Falk 2014.04.24
;***************************************************************************
Gosub UDFS
MyDialogFormat=`WWWDLGED,6.2`
MyDialogCaption=`TrackBar32`
MyDialogX=-01
MyDialogY=-01
MyDialogWidth=300
MyDialogHeight=149
MyDialogNumControls=003
MyDialogProcedure=`MyDialogCallbackProc`
MyDialogFont=`DEFAULT`
MyDialogTextColor=`DEFAULT`
MyDialogBackground=`DEFAULT,DEFAULT`
MyDialogConfig=0
MyDialog001=`009,111,036,012,PUSHBUTTON,"PushButton_OK",DEFAULT,"OK",1,1,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog002=`071,111,036,012,PUSHBUTTON,"PushButton_Cancel",DEFAULT,"Cancel",0,2,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog003=`035,063,044,020,VARYTEXT,"VaryText_1",vtVariable1,"Vary 1",DEFAULT,30,DEFAULT,"Microsoft Sans Serif|10752|70|34","0|0|255",DEFAULT`
ButtonPushed=Dialog("MyDialog")
Pause('POSITION is',POSITION)
Exit
:UDFS
#Definefunction InitCommonControls(class)
ComCtl32 = DirWindows(1):"ComCtl32.dll"
COMMONCONTROLSEX=BinaryAlloc(8) ;Create buffer for CommonControlsEX buffer
BinaryPoke4 (COMMONCONTROLSEX,0,8)
BinaryPoke4 (COMMONCONTROLSEX,4,class)
ICC=DllCall (ComCtl32,long:"InitCommonControlsEx",lpbinary:COMMONCONTROLSEX)
BinaryFree (COMMONCONTROLSEX) ;Free CommonControlsEX buffer
Return
#Endfunction
#Definefunction TrackBarCreate(style,handle,startx,starty,width,height)
user32 = DirWindows(1):"user32.dll"
;Trackbar32 styles
WM_USER = 1024; 0x0400
TBS_AUTOTICKS = 1 ;The trackbar control has a tick mark for each increment in its range of values.
TBS_VERT = 2;The trackbar control is oriented vertically.
;TBS_HORZ ;The trackbar control is oriented horizontally. This is the default orientation.
TBS_TOP = 4;The trackbar control displays tick marks above the control. This style is valid only with TBS_HORZ.
TBS_BOTTOM = 0 ;The trackbar control displays tick marks below the control. This style is valid only with TBS_HORZ.
TBS_LEFT = 4;The trackbar control displays tick marks to the left of the control. This style is valid only with TBS_VERT.
;TBS_RIGHT ;The trackbar control displays tick marks to the right of the control. This style is valid only with TBS_VERT.
TBS_BOTH = 8;The trackbar control displays tick marks on both sides of the control. This will be both top and bottom when used with TBS_HORZ or both left and right if used with TBS_VERT.
;TBS_NOTICKS ;The trackbar control does not display any tick marks.
;TBS_ENABLESELRANGE ;The trackbar control displays a selection range only. The tick marks at the starting and ending positions of a selection range are displayed as triangles (instead of vertical dashes), and the selection range is highlighted.
;TBS_FIXEDLENGTH ;The trackbar control allows the size of the slider to be changed with the TBM_SETTHUMBLENGTH message.
;TBS_NOTHUMB ;The trackbar control does not display a slider.
WS_BORDER = 8388608
WS_CHILD = 1073741824
WS_VISIBLE = 268435456
; Handle to dialog
hinst = dllhinst("")
Return dllcall(user32,long:"CreateWindowExA",long:512,lpstr:"msctls_trackbar32",lpstr:"DateTime",long:WS_CHILD|WS_VISIBLE|TBS_AUTOTICKS|style,long:startx,long:starty,long:width,long:height,long:handle,long:0,long:hinst,long:0)
#Endfunction
#DefineSubRoutine InitDialogConstants()
;DialogprocOptions Constants
MSG_INIT=0 ; The one-time initialization
MSG_TIMER=1 ; Timer event
MSG_BUTTONPUSHED=2 ; Pushbutton or Picturebutton
MSG_RADIOPUSHED=3 ; Radiobutton clicked
MSG_CHECKBOX=4 ; Checkbox clicked
MSG_EDITBOX=5 ; Editbox or Multilinebox
MSG_FILESELECT=6 ; Filelistbox
MSG_ITEMSELECT=7 ; Itembox
MSG_COMBOCHANGE=8 ; Combobox/Droplistbox
MSG_CALENDAR=9 ; Calendar date change
MSG_SPINNER=10 ; Spinner number change
MSG_CLOSEVIA49=11 ; Close clicked (Enabled via DialogProcOptions 1002
MSG_FILEBOXDOUBLECLICK=12 ; Get double-click message on a FileListBox
MSG_ITEMBOXDOUBLECLICK=13 ; Get double-click message on an ItemBox
MSG_COMEVENT=14 ; COMCONTROL Event notification from DialogObject (NOT DialogProcOptions)
MSG_MENUITEM=15 ; MenuItem selected
MSG_MENUITEMINIT=16 ; MenuItem initialized
MSG_RESIZE=17 ; Dialog resized
MSG_RVITEMSELROW=18 ; Reportview item select row
MSG_RVDBLCLICKROW=19 ; Reportview double-click row
MSG_RVCHECKEDITEM=20 ; Reportview checked/unchecked Item
MSG_RVITEMTEXT=21 ; Reportview changed text of first column
MSG_RVHEADER=22 ; Reportview header clicked
DPO_DISABLESTATE=1000 ; codes -1=GetSetting 0=EnableDialog 1=DisableDialog
DPO_CHANGEBACKGROUND=1001 ; -1=Get Current otherise bitmap or color string
DPO_CHANGESYSMENU=1002 ; -1=Get Current 0=none 1=close 2=close/min 3=close/max 4=close/min/max
DPO_CHANGETITLE=1003 ; Set/Get Dialog Title - (-1 to get)
DPO_GETNAME=1004 ; Returns the name associated with a control's number.
DPO_GETNUMBER=1005 ; Returns the number associated with a control's name.
DPO_GETCLIENTAREA=1007 ; Returns a space delimited list of the width and height of the client area.
;DialogControlState Constants
DCSTATE_SETFOCUS=1 ; Give Control Focus
DCSTATE_QUERYSTYLE=2 ; Query control's style
DCSTATE_ADDSTYLE=3 ; Add control style
DCSTATE_REMOVESTYLE=4 ; Remove control style
DCSTATE_GETFOCUS=5 ; Get control that has focus
DCSTATE_MOVEMOUSEOVER=6 ; Move the mouse over the control
DCSTYLE_DEFAULT=0 ; Set Default Style
DCSTYLE_INVISIBLE=1 ; Set Control Invisible
DCSTYLE_DISABLED=2 ; Set Control Disabled
DCSTYLE_NOUSERDATA=4 ; Note: Setable via DialogControlState function ONLY SPINNER control only
DCSTYLE_READONLY=8 ; Sets control to read-only (user cannot type in data) EDITBOX MULTILINEBOX SPINNER
DCSTYLE_PASSWORD=16 ; Sets 'password mode' where only *'s are displayed EDITBOX
DCSTYLE_DEFAULTBUTTON=32 ; Sets a button as the default button PUSHBUTTON PICTUREBUTTON
DCSTYLE_DIGITSONLY=64 ; Set edit box to accept digits only EDITMOX MULTILINEBOX
DCSTYLE_FLAT=128 ; Makes a 'flat' hyperlink-looking button PUSHBUTTON PICTUREBUTTON
DCSTYLE_NOADJUST=256 ; Turns off auto-height adjustment ITEMBOX FILELISTBOX
DCSTYLE_TEXTCENTER=512 ; Center text in control VARYTEXT STATICTEXT
DCSTYLE_TEXTRIGHT=1024 ; Flush-Right text in control VARYTEXT STATICTEXT
DCSTYLE_NOSELCURLEFT=2048 ; No selection, cursor left EDITBOX MULTILINEBOX
DCSTYLE_NOSELCURRIGHT=4096 ; No selection, cursor right EDITBOX MULTILINEBOX
DCSTYLE_SHIELD=8192 ; Display Security Shield icon on button (Vista only) PUSHBUTTON PICTUREBUTTON
DCSTYLE_MENUCHECK=32768 ; Adds a check mark to the left of a menu item MENUITEM
DCSTYLE_MENURADIO=65536 ; Adds a radio button like dot graphic to the left of a menu item MENUITEM
DCSTYLE_MENUSEP=131072 ; Separator bar graphic MENUITEM
DCSTYLE_MENUBREAK=262144 ; Column break MENUBAR
DCSTYLE_NOHEADER=524288 ; No header bar REPORTVIEW
DCSTYLE_COLHEADER=1048576 ; First row column header REPORTVIEW
DCSTYLE_GRIDLINES=2097152 ; Grid lines REPORTVIEW
DCSTYLE_SELONEROW=4194304 ; Only one row can be selected at a time REPORTVIEW
DCSTYLE_SELALLROW = 8388608 ; Highlight complete row REPORTVIEW
DCSTYLE_SORTASC=16777216 ; Ascending sort REPORTVIEW
DCSTYLE_SORTDESC=33554432 ; Descending sort REPORTVIEW
DCSTYLE_EDITCOL=67108864 ; Edit first columns text REPORTVIEW
DCSTYLE_COLCHECKBOX=134217728 ; Add checkbox to first column REPORTVIEW
DCSTYLE_INSHEADER=268435456 ; Include column header text REPORTVIEW
;DialogControlSet / DialogControlGet Constants
DC_CHECKBOX=1 ; CHECKBOX REPORTVIEW
DC_RADIOBUTTON=2 ; RADIOBUTTON
DC_EDITBOX=3 ; EDITBOX MULTILINEBOX
DC_TITLE=4 ; PICTURE RADIOBUTTON CHECKBOX PICTUREBUTTON VARYTEXT STATICTEXT GROUPBOX PUSHBUTTON MENUITEM
DC_ITEMBOXCONTENTS=5 ; ITEMBOX FILELISTBOX DROPLISTBOX REPORTVIEW
DC_ITEMBOXSELECT=6 ; ITEMBOX FILELISTBOX DROPLISTBOX REPORTVIEW
DC_CALENDAR=7 ; CALENDAR
DC_SPINNER=8 ; SPINNER
DC_MULTITABSTOPS=9 ; MULTILINEBOX
DC_ITEMSCROLLPOS=10 ; ITEMBOX FILELISTBOX
DC_BACKGROUNDCOLOR=11 ; RADIOBUTTON CHECKBOX VARYTEXT STATICTEXT GROUPBOX PUSHBUTTON ITEMBOX FILELISTBOX DROPLISTBOX SPINNER EDITBOX MULTILINEBOX REPORTVIEW
DC_PICTUREBITMAP=12 ; PICTURE PICTUREBUTTON
DC_TEXTCOLOR=13 ; RADIOBUTTON CHECKBOX VARYTEXT STATICTEXT GROUPBOX PUSHBUTTON ITEMBOX FILELISTBOX DROPLISTBOX SPINNER EDITBOX MULTILINEBOX REPORTVIEW
DC_ITEMBOXADD=14 ; ITEMBOX FILELISTBOX DROPLISTBOX REPORTVIEW
DC_ITEMBOXREMOVE=15 ; ITEMBOX FILELISTBOX DROPLISTBOX REPORTVIEW
DC_RADIOVALUE=16 ; RADIOBUTTON
DC_POSITION=17 ; ALL CONTROLS (Except MENUBAR and MENUITEM)
DC_MENUNAMES=18 ; ALL CONTROLS
DC_HANDLE=19 ; ALL CONTROLS (Except MENUBAR and MENUITEM)
DC_RVCOLHEAD=20 ; REPORTVIEW
DC_RVCOLWIDTH=21 ; REPORTVIEW
DC_RVADDCOL=22 ; REPORTVIEW
DC_RVREMOVECOL=23 ; REPORTVIEW
DC_RVMATCHCOL=24 ; REPORTVIEW
DC_RVCANCELEDIT=25 ; REPORTVIEW
DC_RVCHECKEDROWS=26 ; REPORTVIEW
DC_RVJUSTIFY=27 ; REPORTVIEW
;DialogObject constants
DLGOBJECT_ADDEVENT=1 ; Call dialog callback when the specified event occurs
DLGOBJECT_STOPEVENT=2 ; Stop calling dialog callback when an event previously requested with
DLGOBJECT_GETOBJECT=3 ; Return an object references to the specified control
DLGOBJECT_GETPICTURE=4 ; Create and return an object reference to a picture object
;Return code constants
RET_DO_CANCEL=0 ; Cancels dialog
RET_DO_DEFAULT= -1 ; Continue with default processing for control
RET_DO_NOT_EXIT= -2 ; Do not exit the dialog
return
#EndSubroutine
;============================================================
;============================================================
;============================================================
#DefineSubroutine MyDialogCallbackProc(MyDialog_Handle,MyDialog_Message,MyDialog_Name,MyDialog_EventInfo,MyDialog_ChangeInfo)
InitDialogConstants() ; Initialize Dialog Constants
ON_EQUAL = @TRUE ; Initialize variable ON_EQUAL
switch MyDialog_Message ; Switch based on Dialog Message type
case MSG_INIT ; Standard Initialization message
DialogProcOptions(MyDialog_Handle,MSG_TIMER,100)
DialogProcOptions(MyDialog_Handle,MSG_BUTTONPUSHED,@TRUE)
ICC_PROGRESS_CLASS = 32
InitCommonControls(ICC_PROGRESS_CLASS)
; Control Coordinates
startx = 10
starty = 10
width = 400
height = 50
TBHandle1 = TrackBarCreate(0,MyDialog_Handle,startx,starty,width,height)
TBM_SETRANGE = 61584 ;0xF090
TBM_SETMIN = 61597; 0xF09D Sets the minimum logical position for the slider in a trackbar.
TBM_SETMAX = 61598; 0xF09E Sets the maximum logical position for the slider in a trackbar.
; Set Range Positons of TrackBar32 control
;DllCall(DirWindows(1):"user32.dll",long:"SendMessageA",long:TBHandle1,long:TBM_SETMIN,long:0,long:0)
;DllCall(DirWindows(1):"user32.dll",long:"SendMessageA",long:TBHandle1,long:TBM_SETMAX,long:100,long:0)
DllCall(DirWindows(1):"user32.dll",long:"SendMessageA",long:TBHandle1,long:TBM_SETRANGE,long:0,long:100)
return(RET_DO_NOT_EXIT)
case MSG_TIMER
; Get Positon of TrackBar32 control
TBM_GETPOS = 1024; 0xF093 Gets the current logical position of the slider.
POSITION = DllCall(DirWindows(1):"user32.dll",long:"SendMessageA",long:TBHandle1,long:TBM_GETPOS,long:0,long:0)
DialogControlSet( MyDialog_Handle, "VaryText_1", DC_TITLE, POSITION )
return(RET_DO_NOT_EXIT)
case MSG_BUTTONPUSHED
if MyDialog_Name == "PushButton_OK" ; OK
; Get Positon of TrackBar32 control
TBM_GETPOS = 1024; 0xF093 Gets the current logical position of the slider.
POSITION = DllCall(DirWindows(1):"user32.dll",long:"SendMessageA",long:TBHandle1,long:TBM_GETPOS,long:0,long:0)
return(RET_DO_DEFAULT)
elseif MyDialog_Name == "PushButton_Cancel" ; Cancel
return(RET_DO_DEFAULT)
endif ; MyDialog_Name
return(RET_DO_CANCEL)
endswitch ; MyDialog_Message
return(RET_DO_DEFAULT)
#EndSubroutine ; End of Dialog Callback MyDialogCallbackProc
;============================================================
;============================================================
;============================================================
RETURN
Ok I have some trouble... I have 2 cosmetics I am trying to achieve and I can't seem to tweak the control to achieve my wishes.
1) fairly important - I would like to set the slider to start at a specific point when the dialog initializes.
I tried adding to the CASE_INIT
.
.
.
TBHandle_PS = TrackBarCreate(0,MyDialog_Handle,10,305,width,height)
TBM_SETRANGE = 61584 ;0xF090
TBM_SETMIN = 61597; 0xF09D Sets the minimum logical position for the slider in a trackbar.
TBM_SETMAX = 61598; 0xF09E Sets the maximum logical position for the slider in a trackbar.
TBM_SETPOS = 61586; 0xF092 Sets the current logical position of the slider. ;
http://www.minigui.org/api_ref/3.0.12_standalone/group__ctrl__trackbar__msgs.html STARTPOS = 100
; Set Range Positons of TrackBar32 control
;DllCall(DirWindows(1):"user32.dll",long:"SendMessageA",long:TBHandle_MP,long:TBM_SETMIN,long:50,long:50)
;DllCall(DirWindows(1):"user32.dll",long:"SendMessageA",long:TBHandle1,long:TBM_SETMAX,long:100,long:0)
DllCall(DirWindows(1):"user32.dll",long:"SendMessageA",long:TBHandle_MP,long:TBM_SETRANGE,long:0,long:100)
DllCall(DirWindows(1):"user32.dll",long:"SendMessageA",long:TBHandle_PS,long:TBM_SETRANGE,long:0,long:100)
;attempt to set "starting"/current position of trackbar
DllCall(DirWindows(1):"user32.dll",long:"SendMessageA",long:TBHandle_PS,long:TBM_SETPOS,long:STARTPOS,long:STARTPOS)
DllCall(DirWindows(1):"user32.dll",long:"SendMessageA",long:TBHandle_PS,long:TBM_SETPOS,long:0,long:STARTPOS)
DllCall(DirWindows(1):"user32.dll",long:"SendMessageA",long:TBHandle_PS,long:TBM_SETPOS,long:STARTPOS,long:0)
none of the calls worked
(also I am confused how you determined TPM_GETPOS = 1024 when the documentation seems to indicate it would be 0xF093 [61587]
so I also tried TPM_SETPOS = 1023; on a whim... also did not work)
2) cosmetic (I can achieve in the data instead of the control if needed) - I would like to set the control to go from 50 - 100 (or in another circumstance 0 - 50)
====
;note: I added functionality to the case MSG_TIMER that check for if the value has changed
; code wise this is less efficient, but without it sometimes the VariableText Control blinks
case MSG_INIT
.
.
.
LastPercentSame = 0
.
.
break
case MSG_TIMER
TBM_GETPOS = 1024; 0xF093 Gets the current logical position of the slider.
PercentSame = DllCall(DirWindows(1):"user32.dll",long:"SendMessageA",long:TBHandle_PS,long:TBM_GETPOS,long:0,long:0)
if PercentSame != LastPercentSame then
LastPercentSame = PercentSame
DialogControlSet( MyDialog_Handle, "PerSame", DC_TITLE, PercentSame )
end if
return(RET_DO_NOT_EXIT)