WinBatch Tech Support Home

Database Search

If you can't find the information using the categories below, post a question over in our WinBatch Tech Support Forum.

TechHome

Dialog Editor version 6.2
plus

Can't find the information you are looking for here? Then leave a message over on our WinBatch Tech Support Forum.

Marquee Style Progress Bars Not Supported

 Keywords:  Marquee Style Progress Bar Not Supported

Question:

Does anyone know of any way to display a Marquee style progress bar using DllCall with user32.dll and the CreateWindowExA function and msctls_progress32 class? I have a script that will do a standard progress bar, but I would really like it to look more like a Windows 7 progress bar and have it be in the Marquee style. I have spent a lot time trying to figure it out. All of the examples I can find on the internet are using Visual Studio, C#, etc. I have looked at the Win32 API and the Win32 Controls but I cannot figure out how to make it work. Here is the .wbt I was playing with. However I am unable to trigger the progress bar to start.


#DefineFunction SetupProgBar(DlgHandle)
   ;~~~~~CONSTANTS~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   HWND_TOPMOST    = -1           ;Stay on top
   ICC_PROGRESS_CLASS = 32
   ;-----WindowPosition--------------------------
   SWP_NOSIZE      = 1            ;Retains the current size (ignores the cx and cy parameters
   SWP_NOMOVE      = 2            ;Retains the current position (ignores X and Y parameters)
   SWP_NOACTIVATE  = 16           ;Does not activate the window
   ;-----Styles--------------------------
   GWL_STYLE = -16
   CW_USEDEFAULT = 0
   PBS_MARQUEE = 8
   BARTYPE = 3 ; horz
   SMOOTH = 1
   VIS = 268435456
   CHILD = 1073741824
   ;flags = bartype | smooth | vis | child | PBS_MARQUEE
   flags = vis | child
  ;-----Messages--------------------------
   WM_USER = 1024
   PBM_SETPOS = WM_USER + 2
   PBM_SETRANGE32 = WM_USER +6
   PBM_SETBARCOLOR = WM_USER + 9
   PBM_SETBKCOLOR = WM_USER + 7169
   ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

   hInst=DllHinst("")                                      ;Get instance handle of dialog window
   User32=StrCat(DirWindows(1),"User32.dll")
   ComCtl32=StrCat(DirWindows(1),"ComCtl32.dll")

   ;-----Initialize common controls--------------
   COMMONCONTROLSEX=BinaryAlloc(8)                         ;Create buffer for CommonControlsEX buffer
   BinaryPoke4 (COMMONCONTROLSEX,0,8)
   BinaryPoke4 (COMMONCONTROLSEX,4,ICC_PROGRESS_CLASS)
   ICC=DllCall (ComCtl32,long:"InitCommonControlsEx",lpbinary:COMMONCONTROLSEX)
   BinaryFree  (COMMONCONTROLSEX)                          ;Free CommonControlsEX buffer

   ;-----Create Progress bar-----------------------
   startx = 250
   starty = 250
   width = 600
   height = 25
   ;hProg=DllCall(User32,long:"CreateWindowExA",long:0,lpstr:"msctls_progress32",lpstr:"",long:flags,long:CW_USEDEFAULT,long:CW_USEDEFAULT,long:CW_USEDEFAULT,long:CW_USEDEFAULT,long:DlgHandle,long:0,long:hInst,long:0)
   hProg=DllCall(User32,long:"CreateWindowExA",long:0,lpstr:"msctls_progress32",lpstr:"",long:flags,long:startx,long:starty,long:width,long:height,long:DlgHandle,long:0,long:hinst,long:0)
   If !hProg
      Pause('Error','CreateWindowExA failed')
      Exit
   EndIf

   ; Add Marquee style to existing styles ( set PBS_MARQUEE style after creating Progress bar because of some articles found on the internet)
   OldStyle=DllCall(User32, long:"GetWindowLongA", long:hProg, long:GWL_STYLE)
   DllCall(User32,long:"SetWindowLongA",long:hProg,long:GWL_STYLE,long:OldStyle|PBS_MARQUEE)


   DllCall (User32,long:"SetWindowPos",long:hProg,long:HWND_TOPMOST,long:0,long:0,long:0,long:0,long:SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE)

   RetVal=DllCall(user32,long:"SendMessageA",long:hProg,long:PBM_SETPOS,long:1,long:100)
   RetVal=DllCall(user32,long:"SendMessageA",long:hProg,long:PBM_SETBKCOLOR,long:0,long:0)      ;Black
   RetVal=DllCall(user32,long:"SendMessageA",long:hProg,long:PBM_SETBARCOLOR,long:0,long:32768) ;Green

   Return (hProg)
#EndFunction


#DefineFunction SetProgBar(hProg,setting) ;1 to turn on , 0 to turn off
   WM_USER = 1024
   PBM_SETMARQUEE = WM_USER + 10
   user32 = StrCat(DirWindows(1),"User32.dll")
   RetVal=DllCall(user32,long:"SendMessageA",long:hProg,long:PBM_SETMARQUEE,long:setting,long:30)
   Return (RetVal)
#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

   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

   ;DialogControlSet / DialogControlGet Constants
   DC_CHECKBOX=1             ; CHECKBOX
   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
   DC_ITEMBOXSELECT=6        ; ITEMBOX FILELISTBOX DROPLISTBOX
   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
   DC_PICTUREBITMAP=12       ; PICTURE PICTUREBUTTON
   DC_TEXTCOLOR=13           ; RADIOBUTTON CHECKBOX VARYTEXT STATICTEXT GROUPBOX PUSHBUTTON ITEMBOX FIELLISTBOX DROPLISTBOX SPINNER EDITBOX MULTILINEBOX
   DC_ITEMBOXADD=14          ; ITEMBOX FILELISTBOX DROPLISTBOX
   DC_ITEMBOXREMOVE=15       ; ITEMBOX FILELISTBOX DROPLISTBOX
   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)


   ;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_BUTTONPUSHED,@TRUE)
         DialogProcOptions(MyDialog_Handle,MSG_TIMER,100)
         hProg = SetupProgBar(MyDialog_Handle)
         SetProgBar(hProg, 1)  ; Start marquee bar (FAILS here)
         DialogProcOptions( MyDialog_Handle, 1000, 1 )
         RET_DO_NOT_EXIT
         Return(RET_DO_DEFAULT)
     Case MSG_TIMER
          ;SetProgBar(hProg, 1)  ; Start marquee bar   (FAILS here)
          Return(RET_DO_NOT_EXIT)
     Case MSG_BUTTONPUSHED
        If MyDialog_Name == "PushButton_Start"                ; Start
              SetProgBar(hProg, 1)  ; Start marquee bar (FAILS here)
              Return(RET_DO_NOT_EXIT)

        ElseIf MyDialog_Name == "PushButton_Cancel"        ; Cancel
              Return(RET_DO_DEFAULT)

        EndIf                                              ; MyDialog_Name
        Return(RET_DO_DEFAULT)

   EndSwitch                                                ; MyDialog_Message
   Return(RET_DO_DEFAULT)
#EndFunction                                                ; End of Dialog Callback MyDialogCallbackProc

;============================================================
;============================================================
;============================================================

MyDialogFormat=`WWWDLGED,6.2`

MyDialogCaption=`Marquess Style Progress Bar Problem`
MyDialogX=157
MyDialogY=131
MyDialogWidth=566
MyDialogHeight=243
MyDialogMinWidth=100
MyDialogMinHeight=100
MyDialogNumControls=002
MyDialogProcedure=`MyDialogCallbackProc`
MyDialogFont=`DEFAULT`
MyDialogTextColor=`DEFAULT`
MyDialogBackground=`DEFAULT,DEFAULT`
MyDialogConfig=0

MyDialog001=`165,223,036,012,PUSHBUTTON,"PushButton_Start",DEFAULT,"Start",1,10,32,DEFAULT,DEFAULT,DEFAULT`
MyDialog002=`365,223,036,012,PUSHBUTTON,"PushButton_Cancel",DEFAULT,"Cancel",0,20,DEFAULT,DEFAULT,DEFAULT,DEFAULT`

ButtonPushed=Dialog("MyDialog")



;END SCRIPT
Exit

Answer:

Unfortunately, in order to use the PBS_MARQUEE style Progress Bar, an application must be specifically linked with or be manifested to use a particular version of the Windows Shell Common Controls. Because WinBatch is designed to work with Win2k and newer version of Windows and also because it would break too many existing WinBatch user interface elements, WinBatch does not use the version of the Common Controls dll that supports Marquee style progress bars.
Article ID:   W17726
Filename:   Marquee Style Progress Bars Not Supported.txt
File Created: 2012:05:21:11:19:52
Last Updated: 2012:05:21:11:19:52