Announcement

Collapse
No announcement yet.

fading

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Chris Holbrook
    replied
    Originally posted by Michael Mattias View Post
    ...AnimateWindow() ...
    yes, there's an example here. I almost wish I'd found it before coding the fade! The "blend" effect looks particularly good and I suspect that it would need quite a bit of coding - or would it? either there is some cunning mixing of bitmaps going on, or the window is split into many RECTs which are progressively dropped from a region?

    Leave a comment:


  • Michael Mattias
    replied
    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.

    MCM

    Leave a comment:


  • Chris Holbrook
    replied
    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
    Last edited by Chris Holbrook; 25 Jan 2008, 06:11 AM. Reason: added colour picker, etc

    Leave a comment:


  • Chris Holbrook
    replied
    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

    Leave a comment:


  • Paul Dixon
    replied
    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.

    Leave a comment:


  • Chris Holbrook
    started a topic fading

    fading

    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?
Working...
X