Lack of Windows expertise is dogging me (not to mention lack of talent, application, etc). I'm attempting to make a control which fades a graphic to nothing then disappears, all in a specified time. In fact it will (in my imagination) also accept a user message which "kills" it. All straightforward stuff you might think, but I don't know how to do the fading bit. Can anyone help, for example by telling me what progression of colour values I should use?
Announcement
Collapse
No announcement yet.
fading
Collapse
X
-
Chris,
something like this?
Code:To fade in n seconds with s seconds/step TotalSteps = n/s for count = 1 to TotSteps for pixel = first to last NewRed = originalRed * (TotalSteps - count)/TotalSteps NewGreen = originalGreen * (TotalSteps - count)/TotalSteps NewBlue = originalBlue * (TotalSteps - count)/TotalSteps next ..update and display the graphic here ..delay for however long you want each step to take here next ..all done, graphic has faded to nothing.
-
Paul, yes, thanks!
Code:#PBFORMS CREATED V1.51 #COMPILE EXE #DIM ALL #PBFORMS BEGIN INCLUDES #IF NOT %DEF(%WINAPI) #INCLUDE "WIN32API.INC" #ENDIF #PBFORMS END INCLUDES #PBFORMS BEGIN CONSTANTS %IDD_DIALOG1 = 101 %IDC_LABEL1 = 1001 #PBFORMS END CONSTANTS DECLARE CALLBACK FUNCTION ShowDIALOG1Proc() DECLARE FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG #PBFORMS DECLARATIONS ' ' Paul Dixon's method ' To fade in n seconds with s seconds/step ' 'TotalSteps = n/s ' 'for count = 1 to TotSteps ' for pixel = first to last ' NewRed = originalRed * (TotalSteps - count)/TotalSteps ' NewGreen = originalGreen * (TotalSteps - count)/TotalSteps ' NewBlue = originalBlue * (TotalSteps - count)/TotalSteps ' next ' ' '..update and display the graphic here '..delay for however long you want each step to take here ' 'next ' '..all done, graphic has faded to nothing. FUNCTION PBMAIN() ShowDIALOG1 %HWND_DESKTOP END FUNCTION %totalsteps = 10 CALLBACK FUNCTION ShowDIALOG1Proc() STATIC lcount, lred, lgreen, lblue AS LONG SELECT CASE AS LONG CBMSG CASE %WM_INITDIALOG CONTROL SET COLOR CBHNDL, %idc_label1, %WHITE, 0 CONTROL SET TEXT CBHNDL, %idc_label1, "FADING!" CASE %WM_NCACTIVATE STATIC hWndSaveFocus AS DWORD IF ISFALSE CBWPARAM THEN hWndSaveFocus = GetFocus() ELSEIF hWndSaveFocus THEN SetFocus(hWndSaveFocus) hWndSaveFocus = 0 END IF CASE %WM_COMMAND SELECT CASE AS LONG CBCTL CASE %IDC_LABEL1 lRed = &Hff * lcount/%TotalSteps lGreen = &Hff * lcount/%TotalSteps lBlue = &Hff * lcount/%TotalSteps INCR lcount IF lcount = %totalsteps THEN lcount = 0 CONTROL SET COLOR CBHNDL, %idc_label1, %WHITE, RGB(lRed, lgreen, lblue) CONTROL SET TEXT CBHNDL, %idc_label1, HEX$(lred) + HEX$(lgreen)+HEX$(lblue) END SELECT END SELECT END FUNCTION FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG LOCAL lRslt AS LONG #PBFORMS BEGIN DIALOG %IDD_DIALOG1->-> LOCAL hDlg AS DWORD DIALOG NEW hParent, "Click 2 Fade", 177, 118, 201, 121, %WS_POPUP OR %WS_BORDER OR %WS_DLGFRAME OR %WS_SYSMENU OR %WS_CLIPSIBLINGS _ OR %WS_VISIBLE OR %DS_MODALFRAME OR %DS_3DLOOK OR %DS_NOFAILCREATE OR %DS_SETFONT, %WS_EX_CONTROLPARENT OR %WS_EX_LEFT _ OR %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg CONTROL ADD LABEL, hDlg, %IDC_LABEL1, "Label1", 50, 15, 115, 75, %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP OR %SS_CENTER _ OR %SS_CENTERIMAGE OR %SS_NOTIFY #PBFORMS END DIALOG DIALOG SHOW MODAL hDlg, CALL ShowDIALOG1Proc TO lRslt #PBFORMS BEGIN CLEANUP %IDD_DIALOG1 #PBFORMS END CLEANUP FUNCTION = lRslt END FUNCTION
Comment
-
Doing this I noticed that if the colour is faded to white, the white seems more persistent to the eye than the nearly faded colour, plus I suppose it hangs around until the control is killed. The effect - at least on my eyes - is that the white is held for too long.
Anyway, this version takes a start colour as a parameter to the Fader function and uses a colour gradient array rather than attempting to calculate the colour on the fly.
** updated to include a colour picker, controls for specifying interval & number of steps, "stop" button
Code:#PBFORMS CREATED V1.51 #COMPILE EXE #DIM ALL #PBFORMS BEGIN INCLUDES #IF NOT %DEF(%WINAPI) #INCLUDE "WIN32API.INC" #ENDIF #PBFORMS END INCLUDES #INCLUDE "comdlg32.inc" #PBFORMS BEGIN CONSTANTS %IDD_DIALOG1 = 103 %IDC_LISTBOX1 = 104 %IDC_LABEL1 = 105 %IDC_LABEL2 = 108 %IDC_LABEL3 = 109 %IDC_steps_tb = 106 %IDC_int_TB = 107 %IDC_STOP_BN = 110 %IDC_GO_BN = 102 #PBFORMS END CONSTANTS DECLARE CALLBACK FUNCTION ShowDIALOG1Proc() DECLARE FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG #PBFORMS DECLARATIONS '-------------------------------------------------------------------- ' common functions '-------------------------------------------------------------------- ' return selected colour FUNCTION SelColour( hD AS DWORD) AS LONG STATIC CCA AS CHOOSECOLORAPI LOCAL lResult AS LONG STATIC clrRef() AS DWORD ' colorref DIM clrRef(0 TO 16) AS STATIC DWORD 'colorref CCA.lStructSize = LEN(CCA) CCA.hwndOwner = hD CCA.lpCustColors = VARPTR(ClrRef()) CCA.rgbResult = getsyscolor(%color_3dface) CCA.Flags = CCA.Flags OR %CC_RGBINIT 'or %CC_FULLOPEN lResult = ChooseColor(CCA) IF lResult <> 0 THEN 'check if user cancelled dialog ? FUNCTION = CCA.rgbResult 'HEX$(CCA.rgbResult,6) 'to get RGB sequence, use RIGHT$(ClrStr,2) + MID$(ClrStr,3,2) + LEFT$ (ClrStr,2) END IF END FUNCTION '------------------------------------------------------------------- ' FADER functions '---------------------------------------------------------------------- CALLBACK FUNCTION FaderCallBackProc() STATIC lcount, lredstart, lgreenstart, lbluestart, interval, steps AS LONG LOCAL i, l, lcol, lred, lgreen, lblue AS LONG LOCAL fR, fG, fB AS SINGLE DIM lcolgrad(0 TO 255) AS STATIC LONG SELECT CASE AS LONG CBMSG CASE %WM_INITDIALOG DIALOG GET USER CBHNDL, 1 TO steps DIALOG GET USER CBHNDL, 2 TO lcol lcount = 0 ' it's static, so clear down each time through ' make a colour gradient ' start the gradient with the colour supplied l = lcol fR = l AND &HFF SHIFT RIGHT l, 8 fG = l AND &HFF SHIFT RIGHT l, 8 fB = l AND &HFF FOR i = 0 TO 255 lColGrad(i) = RGB((i*(255-fR)/255) + fR, (i*(255-fg)/255) + fg ,(i*(255-fb)/255) + fb) NEXT CONTROL SET COLOR CBHNDL, 101, %WHITE, lColGrad(0) CONTROL SHOW STATE CBHNDL, 101, %SW_SHOW CASE %wm_timer INCR lcount IF lcount = steps -1 THEN EXIT FUNCTION ' avoid showing white IF lcount >= Steps THEN DIALOG END CBHNDL, 0 END IF LISTBOX ADD getparent(CBHNDL), %idc_listbox1, HEX$( lcolgrad(255*lcount/steps), 6)' & format$( int(255*lcount/steps), " ###.#") CONTROL SET COLOR CBHNDL, 101, %WHITE, lcolgrad(255*lcount/steps) CONTROL REDRAW CBHNDL, 101 CASE %WM_USER + 2 lcount = steps ' stop fading CASE %WM_NCACTIVATE STATIC hWndSaveFocus AS DWORD IF ISFALSE CBWPARAM THEN hWndSaveFocus = GetFocus() ELSEIF hWndSaveFocus THEN SetFocus(hWndSaveFocus) hWndSaveFocus = 0 END IF CASE %WM_DESTROY CONTROL KILL CBHNDL, 101 IF killtimer(CBHNDL, 1) = 0 THEN ? "can't kill timer!" END IF CASE %WM_COMMAND SELECT CASE AS LONG CBCTL CASE 101 DIALOG END CBHNDL, 0 END SELECT END SELECT END FUNCTION '---------------------------------------------------------------------------------------------- ' parameters are parent window handle, # of steps, interval between steps in mSec, ' start colour, text for label. FUNCTION Fader(BYVAL hParent AS DWORD, steps AS LONG, BYVAL interval AS LONG, _ BYVAL lColour AS LONG, BYVAL stext AS STRING) AS LONG LOCAL lRslt, x, y, h, w AS LONG LOCAL hDlg AS DWORD LOCAL rc AS rect ' static labeltext as string GetWindowRect hParent, rc DIALOG NEW PIXELS, hparent, "", 0,0, rc.nright - rc.nleft, rc.nbottom-rc.ntop, _ %WS_POPUP OR %WS_CHILD OR _ %WS_CLIPSIBLINGS OR %WS_VISIBLE OR %DS_NOFAILCREATE, _ %WS_EX_CONTROLPARENT OR %WS_EX_TOOLWINDOW OR _ %WS_EX_TOPMOST OR %WS_EX_LEFT TO hDlg DIALOG SET COLOR hdlg, -1, -2 DIALOG SET USER hdlg, 1, steps DIALOG SET USER hdlg, 2, lcolour DIALOG SEND hParent, %WM_USER + 1, hdlg, 0 ' let parent know who we are CONTROL ADD LABEL, hDlg, 101, stext,10, 10, 80, 30, %SS_CENTER OR %SS_CENTERIMAGE CONTROL SET LOC hdlg, 101, (rc.nright - rc.nleft)/3, (rc.nbottom-rc.ntop)/3 SetTimer hdlg, 1, interval, %NULL DIALOG SHOW MODELESS hDlg, CALL FaderCallBackProc TO lRslt FUNCTION = lRslt END FUNCTION '-------------------------------------------------------------------------------- FUNCTION PBMAIN() ShowDIALOG1 %HWND_DESKTOP END FUNCTION CALLBACK FUNCTION ShowDIALOG1Proc() LOCAL interval, steps, TryCOl AS LONG LOCAL s AS STRING STATIC hDfader AS DWORD SELECT CASE AS LONG CBMSG CASE %WM_INITDIALOG CASE %WM_USER + 1 hDFader = CBWPARAM CASE %WM_NCACTIVATE STATIC hWndSaveFocus AS DWORD IF ISFALSE CBWPARAM THEN hWndSaveFocus = GetFocus() ELSEIF hWndSaveFocus THEN SetFocus(hWndSaveFocus) hWndSaveFocus = 0 END IF CASE %WM_COMMAND SELECT CASE AS LONG CBCTL CASE %IDC_GO_BN CONTROL GET TEXT CBHNDL, %idc_int_tb TO s interval = VAL(s) IF interval = 0 THEN BEEP: EXIT FUNCTION CONTROL GET TEXT CBHNDL, %idc_steps_tb TO s steps = VAL(s) IF steps = 0 THEN BEEP: EXIT FUNCTION TryCol = selcolour ( CBHNDL) fader(CBHNDL, steps, interval, TryCol, "GOODBYE") ' change the colour or text CASE %IDC_STOP_BN DIALOG SEND hdfader, %WM_USER + 2, 0, 0 ' send message to fader dialog to stop fading END SELECT END SELECT END FUNCTION FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG LOCAL lRslt AS LONG #PBFORMS BEGIN DIALOG %IDD_DIALOG1->-> LOCAL hDlg AS DWORD DIALOG NEW hParent, "Fader", 70, 70, 265, 134, %WS_POPUP OR %WS_BORDER OR %WS_DLGFRAME OR %WS_SYSMENU OR %WS_CLIPSIBLINGS OR _ %WS_VISIBLE OR %DS_MODALFRAME OR %DS_3DLOOK OR %DS_NOFAILCREATE OR %DS_SETFONT, %WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR _ %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg CONTROL ADD BUTTON, hDlg, %IDC_GO_BN, "GO", 190, 110, 30, 20 CONTROL ADD LISTBOX, hDlg, %IDC_LISTBOX1, , 5, 60, 80, 70 CONTROL ADD LABEL, hDlg, %IDC_LABEL1, "RGB picked from color gradient", 5, 45, 80, 15 CONTROL ADD TEXTBOX, hDlg, %IDC_steps_tb, "", 220, 85, 25, 15, %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP OR %ES_LEFT OR _ %ES_AUTOHSCROLL OR %ES_NUMBER, %WS_EX_CLIENTEDGE OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR CONTROL ADD TEXTBOX, hDlg, %IDC_int_TB, "", 220, 65, 25, 15, %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP OR %ES_LEFT OR _ %ES_AUTOHSCROLL OR %ES_NUMBER, %WS_EX_CLIENTEDGE OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR CONTROL ADD LABEL, hDlg, %IDC_LABEL2, "Interval", 170, 65, 45, 15, %WS_CHILD OR %WS_VISIBLE OR %SS_RIGHT, %WS_EX_RIGHT OR _ %WS_EX_LTRREADING CONTROL ADD LABEL, hDlg, %IDC_LABEL3, "Steps", 170, 85, 45, 15, %WS_CHILD OR %WS_VISIBLE OR %SS_RIGHT, %WS_EX_RIGHT OR _ %WS_EX_LTRREADING CONTROL ADD BUTTON, hDlg, %IDC_STOP_BN, "STOP", 225, 110, 30, 20 #PBFORMS END DIALOG DIALOG SHOW MODAL hDlg, CALL ShowDIALOG1Proc TO lRslt #PBFORMS BEGIN CLEANUP %IDD_DIALOG1 #PBFORMS END CLEANUP FUNCTION = lRslt END FUNCTION
Comment
-
If 'fading' is just one option you are considering to remove the control from view in a less-than-abrupt fashion, you could also try the effects you can get from the AnimateWindow() function.
AnimateWindow() has a 'fade' option, too, but the doc says that only works on top-level windows, so it would not be supported for use on a control (a child window).
It's a thought.
MCMMichael Mattias
Tal Systems (retired)
Port Washington WI USA
[email protected]
http://www.talsystems.com
Comment
-
Originally posted by Michael Mattias View Post...AnimateWindow() ...
Comment
Comment