'==================================================================== ' Very simple liteweight custom-colored progress bar with text ' Usage: ' ADD_TEXT_PROGRESSBAR hDlg, %IDC_PROGRESSBAR, 4, 30, 192, 20 ' SET_TEXT_PROGRESSBAR hDlg, %IDC_PROGRESSBAR, 25, "Progress is 25%" [,%RGB_DARKGREEN ,%GREEN [,%WHITE ,%BLACK]] '==================================================================== FUNCTION TPBCOLOR(BYVAL co AS BYTE) AS WORD FUNCTION = VAL("&H" + HEX$(co) + "00") END FUNCTION '==================================================================== SUB ADD_TEXT_PROGRESSBAR(hDlg AS DWORD, CtlId AS LONG, _ x AS LONG, y AS LONG, w AS LONG, h AS LONG) CONTROL ADD GRAPHIC, hDlg, CtlId, "", x, y, w, h, %SS_SUNKEN END SUB '==================================================================== SUB SET_TEXT_PROGRESSBAR (BYVAL hDlg AS DWORD, BYVAL CtlId AS LONG, _ pct AS LONG, tx AS STRING, OPTIONAL _ ' all 4 following parameters are optional BYVAL barcol1 AS LONG, BYVAL barcol2 AS LONG, _ BYVAL txtcol1 AS LONG, BYVAL txtcol2 AS LONG) '-------------------------------------------------------------------- STATIC bco1, bco2, tco1, tco2 AS LONG ' colors (static) LOCAL gRect AS GRADIENT_RECT LOCAL hDC, hCtrl AS DWORD DIM vert(3) AS TRIVERTEX LOCAL x, y, w, h AS LONG STATIC hFont AS DWORD ' font (static) LOCAL rc AS RECT ' First call IF hFont = 0 THEN FONT NEW "Lucida Console", 10, 0, %ANSI_CHARSET TO hFont ' Define bar colors IF ISFALSE (barcol1 OR barcol2 OR bco1 OR bco2) THEN bco1 = %RGB_DARKGREEN bco2 = %GREEN ELSEIF ISTRUE (barcol1 OR barcol2) THEN bco1 = barcol1 bco2 = barcol2 END IF ' Define text colors IF ISFALSE (txtcol1 OR txtcol2 OR tco1 OR tco2) THEN tco1 = %WHITE tco2 = %BLACK ELSEIF ISTRUE (txtcol1 OR txtcol2) THEN tco1 = txtcol1 tco2 = txtcol2 END IF ' Attach the custom progressbar handle CONTROL HANDLE hDlg, CtlId TO hCtrl GetClientRect hCtrl, rc GRAPHIC ATTACH hDlg, CtlId, REDRAW GRAPHIC GET DC TO hDC ' Define top-left and bottom-right trivertexes for first gradient (top half of the progress bar) vert(0).x = 0 vert(0).y = 0 vert(0).Red = TPBCOLOR(GetRValue(bco1)) vert(0).Green = TPBCOLOR(GetGValue(bco1)) vert(0).Blue = TPBCOLOR(GetBValue(bco1)) vert(0).Alpha = &H0000 vert(1).x = rc.nRight * MIN(MAX(pct,0),100) \ 100 vert(1).y = rc.nBottom \ 2 vert(1).Red = TPBCOLOR(GetRValue(bco2)) vert(1).Green = TPBCOLOR(GetGValue(bco2)) vert(1).Blue = TPBCOLOR(GetBValue(bco2)) vert(1).Alpha = &H0000 ' Define top-left and bottom-right trivertexes for second gradient (bottom half of the progress bar) vert(2).x = 0 vert(2).y = rc.nBottom \ 2 vert(2).Red = TPBCOLOR(GetRValue(bco2)) vert(2).Green = TPBCOLOR(GetGValue(bco2)) vert(2).Blue = TPBCOLOR(GetBValue(bco2)) vert(2).Alpha = &H0000 vert(3).x = rc.nRight * MIN(MAX(pct,0),100) \ 100 vert(3).y = rc.nBottom vert(3).Red = TPBCOLOR(GetRValue(bco1)) vert(3).Green = TPBCOLOR(GetGValue(bco1)) vert(3).Blue = TPBCOLOR(GetBValue(bco1)) vert(3).Alpha = &H0000 gRect.UpperLeft = 0 gRect.LowerRight = 1 GRAPHIC COLOR -1, -1 : GRAPHIC CLEAR ' Set text font and calculate its dimensions GRAPHIC SET FONT hFont GRAPHIC TEXT SIZE tx TO w, h x = (rc.nRight - w) \ 2 y = (rc.nBottom - h) \ 2 ' Draw text under the progress bar (in black) GRAPHIC COLOR tco2, -2 GRAPHIC SET POS (x, y) : GRAPHIC PRINT tx ' Draw the progress bar GradientFill hDC, vert(0), 2, gRect, 1, %GRADIENT_FILL_RECT_V GradientFill hDC, vert(2), 2, gRect, 1, %GRADIENT_FILL_RECT_V ' Draw text on the progress bar (in white), limited to the progressbar rect IF rc.nRight * MIN(MAX(pct,0),100) \ 100 >= x THEN GRAPHIC SET POS (x, y) GRAPHIC COLOR tco1, -2 rc.nRight = rc.nRight * MIN(MAX(pct,0),100) \ 100 DrawText hDC, (tx), -1, rc, %DT_SINGLELINE OR %DT_CENTER OR %DT_VCENTER END IF GRAPHIC REDRAW END SUB