to change colors, use setwindowlong.
Code:
#compile exe #register none #dim all #include "win32api.inc" '****************************** '* pbprogressbar * '****************************** %pbprogressbar_done = 0 %pbprogressbar_bkgl_rgb1 = 4 %pbprogressbar_bkgl_rgb2 = 8 %pbprogressbar_bkgl_rgb3 = 12 %pbprogressbar_bkgl_rgb4 = 16 %pbprogressbar_bkgr_rgb = 20 %pbprogressbar_frgl_rgb = 24 %pbprogressbar_frgr_rgb = 28 function register_pbprogressbar as long local wc as wndclass local szclassname as asciiz * 14 szclassname = "pbprogressbar" wc.lpfnwndproc = codeptr(pbprogressbarproc) wc.hinstance = getmodulehandle(byval %null) wc.hbrbackground = getstockobject(%null_brush) wc.lpszclassname = varptr(szclassname) wc.cbwndextra = 32 function = registerclass(wc) end function function pbprogressbarrgbcoloref (crgb as long) as long redim b(0 : 3) as byte at varptr(crgb) function = rgb(b(2), b(1), b(0)) end function function pbprogressbarproc (byval hwnd as long, byval wmsg as long, _ byval wparam as long, byval lparam as long) as long select case wmsg case %wm_create ' defaults setwindowlong hwnd, %pbprogressbar_done, 0 setwindowlong hwnd, %pbprogressbar_bkgl_rgb1, rgb( 0, 0, 255) setwindowlong hwnd, %pbprogressbar_bkgl_rgb2, rgb( 0, 0, 64) setwindowlong hwnd, %pbprogressbar_bkgl_rgb3, %ltgray setwindowlong hwnd, %pbprogressbar_bkgl_rgb4, %gray setwindowlong hwnd, %pbprogressbar_bkgr_rgb, %black setwindowlong hwnd, %pbprogressbar_frgl_rgb, %white setwindowlong hwnd, %pbprogressbar_frgr_rgb, %white case %wm_user + 2 ' = %pbm_setpos setwindowlong hwnd, %pbprogressbar_done, wparam invalidaterect hwnd, byval 0&, 0: updatewindow hwnd case %wm_paint dim i as long, j as long, jj as long, k as long, kk as long dim bmi as bitmapinfo, bm as bitmap, ps as paintstruct, rc as rect dim hmemdc(1 to 2) as long, hmembmp(1 to 2) as long, pbits as long ptr dim done as long, coef as double dim red1 as long, green1 as long, blue1 as long, red2 as long, green2 as long, blue2 as long dim clrb1 as long, clrb2 as long, clr1 as long, clr2 as long done = min(getwindowlong (hwnd, %pbprogressbar_done), 100): done = max(0, done) i = getwindowlong (hwnd, %pbprogressbar_bkgl_rgb1) blue1 = (i and &h00ff0000): shift right blue1, 16 green1 = (i and &h0000ff00): shift right green1, 8 red1 = (i and &hff) i = getwindowlong (hwnd, %pbprogressbar_bkgl_rgb2) blue2 = (i and &h00ff0000): shift right blue2, 16 green2 = (i and &h0000ff00): shift right green2, 8 red2 = (i and &hff) clrb1 = pbprogressbarrgbcoloref(getwindowlong (hwnd, %pbprogressbar_bkgl_rgb3)) clrb2 = pbprogressbarrgbcoloref(getwindowlong (hwnd, %pbprogressbar_bkgl_rgb4)) clr2 = pbprogressbarrgbcoloref(getwindowlong (hwnd, %pbprogressbar_bkgr_rgb)) getclientrect hwnd, rc beginpaint hwnd, ps for i = 1 to 2 hmemdc(i) = createcompatibledc(ps.hdc) bmi.bmiheader.bisize = sizeof(bmi.bmiheader) bmi.bmiheader.biwidth = rc.nright bmi.bmiheader.biheight = rc.nbottom bmi.bmiheader.biplanes = 1 bmi.bmiheader.bibitcount = 32 bmi.bmiheader.bicompression = %bi_rgb hmembmp(i) = createdibsection(hmemdc(i), bmi, %dib_rgb_colors, 0, 0, 0) globallock hmembmp(i): selectobject hmemdc(i), hmembmp(i) getobject hmembmp(i), sizeof(bm), bm pbits = bm.bmbits kk = rc.nright * done / 100 for j = rc.nbottom - 1 to 0 step - 1 coef = j / rc.nbottom clr1 = rgb(blue1 - (blue1 - blue2) * coef, green1 - (green1 - green2) * coef, red1 - (red1 - red2) * coef) for k = 0 to rc.nright - 1 if i = 2 then @pbits = clr2 else _ if k < kk then @pbits = clr1 else _ if k = kk then @pbits = clrb1 else _ if k = (kk + 1) then @pbits = clrb2 pbits = pbits + 4 next next setbkmode hmemdc(i), %transparent if i = 1 then settextcolor hmemdc(i), getwindowlong (hwnd, %pbprogressbar_frgl_rgb) else _ settextcolor hmemdc(i), getwindowlong (hwnd, %pbprogressbar_frgr_rgb) drawtext hmemdc(i), format$(done)+"%", -1, rc, %dt_singleline or %dt_center or %dt_vcenter next bitblt hmemdc(2), 0, 0, min(kk + 2, rc.nright), rc.nbottom, hmemdc(1), 0, 0, %srccopy bitblt ps.hdc, 0, 0, rc.nright, rc.nbottom, hmemdc(2), 0, 0, %srccopy endpaint hwnd, ps for i = 1 to 2: deletedc hmemdc(i): deleteobject hmembmp(i): next function = 0: exit function end select function = defwindowproc(hwnd, wmsg, wparam, lparam) end function '************************************************************** %pbm_setpos = %wm_user + 2 callback function dlgproc static done1 as long, done2 as long select case cbmsg case %wm_initdialog control add "pbprogressbar", cbhndl, 101, ", 10, 10, 176, 14, %ws_child, %ws_ex_clientedge control add "pbprogressbar", cbhndl, 102, ", 10, 30, 176, 14, %ws_child, %ws_ex_clientedge setwindowlong getdlgitem(cbhndl, 102), %pbprogressbar_bkgl_rgb1, %red setwindowlong getdlgitem(cbhndl, 102), %pbprogressbar_bkgl_rgb2, rgb(64, 0, 0) ' setwindowlong getdlgitem(cbhndl, 102), %pbprogressbar_bkgl_rgb3, rgb(192, 192, 192) ' setwindowlong getdlgitem(cbhndl, 102), %pbprogressbar_bkgl_rgb4, rgb(128, 128, 128) setwindowlong getdlgitem(cbhndl, 102), %pbprogressbar_bkgr_rgb, rgb(64, 64, 0) setwindowlong getdlgitem(cbhndl, 102), %pbprogressbar_frgl_rgb, %yellow setwindowlong getdlgitem(cbhndl, 102), %pbprogressbar_frgr_rgb, rgb(255, 255, 255) control add button, cbhndl, %idok, "&show", 10, 80, 50, 14, %bs_default control add button, cbhndl, %idcancel, "&hide", 70, 80, 50, 14 control set focus cbhndl, %idok case %wm_command if cbctl = %idok then done1 = 0: done2 = 0 settimer cbhndl, 1, 100, byval %null settimer cbhndl, 2, 500, byval %null showwindow getdlgitem(cbhndl, 101), 1 showwindow getdlgitem(cbhndl, 102), 1 control send cbhndl, 101, %pbm_setpos, done1, 0 control send cbhndl, 102, %pbm_setpos, done2, 0 elseif cbctl = %idcancel then killtimer cbhndl, 1: killtimer cbhndl, 2 showwindow getdlgitem(cbhndl, 101), 0 showwindow getdlgitem(cbhndl, 102), 0 end if case %wm_timer if cbctl = 1 then done1 = done1 + 2: if done1 > 100 then done1 = 0 control send cbhndl, 101, %pbm_setpos, done1, 0 else done2 = done2 + 2 if done2 > 100 then if done1 >= 100 then killtimer cbhndl, 1: killtimer cbhndl, 2 else control send cbhndl, 102, %pbm_setpos, done2, 0 end if end if end select end function function pbmain register_pbprogressbar local hdlg as long, hdlg1 as long dialog new 0, "progress bar",,, 200, 120, %ws_sysmenu to hdlg dialog show modal hdlg call dlgproc end function
Leave a comment: