Page 1 of 2

Progress bar windows 10 animation

PostPosted: Thu Sep 28, 2017 2:05 pm
by AntoninoP
Hello,
I tried a modified version of progres1.prg that create a progress bar directly, in this way:

Code: Select all  Expand view
#include "FiveWin.ch"

function Main()

   local oDlg, oProg1, oProg2
   
   DEFINE DIALOG oDlg TITLE "Progress Bars"
   
   @ 1, 1 PROGRESS oProg1 SIZE 80, 12

   @ 1, 20 PROGRESS oProg2 SIZE 12, 50 VERTICAL
   
   @ 3,  9 BUTTON "Ok" ACTION oDlg:End()
   
   oDlg:bStart = { || Increase( oProg1, oProg2 ) }
   
   ACTIVATE DIALOG oDlg CENTER ;
      ON INIT ( oProg1:SetRange( 0, 100 ), oProg1:SetStep( 1 ),;
                oProg2:SetRange( 0, 100 ), oProg2:SetStep( 1 ), ;
                CREATEPROGRESS(oDlg:hWnd) )
   
return nil  

function Increase( oProg1, oProg2 )

   local n  
   for n = 1 to 11
      oProg1:SetPos( n*10 )
      oProg2:SetPos( n*10 )
      Sleep( 50 )
      SysRefresh()
   next  
return nil

//*
#pragma BEGINDUMP
#include <windows.h>
#include <hbapi.h>
#include <CommCtrl.h>

HB_FUNC( CREATEPROGRESS )
{
#ifndef _WIN64
   HWND hWnd = ( HWND ) hb_parnl( 1 );
#else
   HWND hWnd = ( HWND ) hb_parnll( 1 );
#endif
   HWND hProgress = CreateWindow("msctls_progress32", "progress", WS_CHILD | WS_VISIBLE | WS_TABSTOP |PBS_SMOOTH, 12, 80, 160, 24, hWnd, 0,
      (HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE), 0);
   SendMessage(hProgress, PBM_SETPOS, 50, 0);
   hb_retnl(1);
}

#pragma ENDDUMP


What i see, is the the direct create window has an animation (on windows 10) the other 2 does not.

Image

I tried to fix it and I was not able to do it :cry:

any idea?

Re: Progress bar windows 10 animation

PostPosted: Thu Sep 28, 2017 3:09 pm
by karinha
Code: Select all  Expand view

SendMessage(hProgress, PBM_SETPOS, 100, 0);  
 


??

Re: Progress bar windows 10 animation

PostPosted: Thu Sep 28, 2017 3:29 pm
by AntoninoP
karinha wrote:
Code: Select all  Expand view

SendMessage(hProgress, PBM_SETPOS, 100, 0);  
 

The problem is not the progress half full (or half empty :lol: ) the problem is the animation that does not work.

Re: Progress bar windows 10 animation

PostPosted: Thu Sep 28, 2017 3:42 pm
by karinha
test please

Code: Select all  Expand view

#Include "FiveWin.Ch"

STATIC oDlg, oTimerR, lDesliga := .F., oWnd, oTimerP
STATIC oFnt, oSaida

FUNCTION TEM_PROGRESS()

   LOCAL oProgress

   DEFINE FONT oFnt      NAME "Arial"         SIZE 08,  20 BOLD

   DEFINE DIALOG oDlg FROM 0,0 TO 250,500 TITLE "Test Timer" PIXEL

   oDlg:lHelpIcon := .F.

   oProgress := TProgress():New(50,00,oDlg,0,CLR_RED,CLR_WHITE,.t.,.f.,oDlg:nWidth,8,,.f.,.f.)

   @ 005, 017 BUTTON oSaida PROMPT "&Exit" OF oDlg SIZE 40, 14         ;
              ACTION ( oDlg:End ) CANCEL

   oSaida:cToolTip := OemToAnsi( "Exit" )

   SET FONT OF oSaida   TO oFnt

   ACTIVATE DIALOG oDlg CENTERED                                        ;
            ON INIT( ACIONA_TIMER( oWnd, oProgress ) )

   IF lDesliga
      oTimerR:DeActivate()
      oTimerP:DeActivate()
   ENDIF

   oFnt:End()

RETURN NIL

STATIC FUNCTION ACIONA_TIMER( oWnd, oProgress )

   DEFINE TIMER oTimerP INTERVAL 1000 OF oDlg                        ;
          ACTION MOSTRA_TIMER( oWnd, oProgress )

   ACTIVATE TIMER oTimerP

RETURN NIL

STATIC FUNCTION MOSTRA_TIMER( oWnd, oProgress )

   LOCAL oFont

   DEFINE FONT oFont NAME "Arial" SIZE  0, -70 BOLD
   DEFINE FONT oFnt  NAME "Arial" SIZE 08,  20 BOLD

   DEFINE TIMER oTimerR INTERVAL 1500                                    ;
          ACTION ExibeTimer( oProgress )

   ACTIVATE TIMER oTimerR

   SET FONT OF oDlg   TO oFont
   SET FONT OF oSaida TO oFnt

   oFont:End()

   lDesliga := .T.  //-> Para Desligar o Timer

   oTimerP:DeActivate()

RETURN NIL

FUNCTION ExibeTimer( oProgress )

   IF ISWINDOWVISIBLE( oDlg:hWnd )

      oProgress:SetRange( 0, 200 )
      oProgress:SetPos( 100 )
     
   ENDIF

RETURN NIL
 

Re: Progress bar windows 10 animation

PostPosted: Thu Sep 28, 2017 4:17 pm
by cnavarro
Antonino, also try this

Code: Select all  Expand view

#include "FiveWin.ch"

function Main()

   local oDlg, oProg1, oProg2
   
   DEFINE DIALOG oDlg TITLE "Progress Bars"
   
   @ 1, 1 PROGRESS oProg1 SIZE 80, 12

   @ 1, 20 PROGRESS oProg2 SIZE 12, 50 VERTICAL
   
   @ 3,  9 BUTTON "Ok" ACTION oDlg:End()
   
   oDlg:bStart = { || Increase( oProg1, oProg2, oDlg ) }
   
   ACTIVATE DIALOG oDlg CENTER ;
      ON INIT ( oProg1:SetRange( 0, 100 ), oProg1:SetStep( 1 ),;
                oProg2:SetRange( 0, 100 ), oProg2:SetStep( 1 ), ;
                CREATEPROGRESS( oDlg:hWnd ) )
   
return nil  

function Increase( oProg1, oProg2, oDlg )

   local n  
   for n = 1 to 11
      oProg1:SetPos( n*10 )
      oProg2:SetPos( n*10 )
      CREATEPROGRESS( oDlg:hWnd )
      Sleep( 500 )
      SysRefresh()
   next  
return nil

#pragma BEGINDUMP
#include <windows.h>
#include <hbapi.h>
#include <CommCtrl.h>

static HWND hProgress;

HB_FUNC( CREATEPROGRESS )
{
#ifndef _WIN64
   HWND hWnd = ( HWND ) hb_parnl( 1 );
#else
   HWND hWnd = ( HWND ) hb_parnll( 1 );
#endif
   COLORREF bColor  = RGB( 255, 0, 0 );
   COLORREF bColor1 = RGB( 255, 255, 0 );
   if ( !hProgress )
   {
   hProgress = CreateWindow( "msctls_progress32", "progress", WS_CHILD | WS_VISIBLE | WS_TABSTOP| PBS_SMOOTH, 12, 80, 160, 24, hWnd, 0,
      ( HINSTANCE ) GetWindowLong( hWnd, GWL_HINSTANCE ), 0);
   SendMessage( hProgress, PBM_SETRANGE32, 0, 1000);
   SendMessage( hProgress, PBM_SETBARCOLOR, 0, bColor );
   SendMessage( hProgress, PBM_SETBKCOLOR, 0, bColor1 );
   }
   else
   {
   //SendMessage( hProgress, PBM_SETPOS, 50, 0 );
   SendMessage( hProgress, PBM_DELTAPOS, 100, 0 );
   }
   
   hb_retnl( ( LONG ) hProgress );
}

#pragma ENDDUMP

 

Re: Progress bar windows 10 animation

PostPosted: Wed Dec 20, 2017 10:39 am
by AntoninoP
Hello,
I think there was a misunderstand, I don't want remove animation from my progress bar, I want add animation in FiveWin's progress bar.
I did some tests, and arrived to this code:
Code: Select all  Expand view
#include "FiveWin.ch"
#include "Constant.ch"

#define PBM_SETPOS        1026
#define PBM_SETRANGE      1025
#define PBM_SETMARQUEE    1034

#define PBS_MARQUEE       8

CLASS TMyProgres FROM TControl
    METHOD New( nTop, nLeft, oWnd, lPixel, nWidth, nHeight)
    METHOD cToChar() INLINE ::Super:cToChar( "msctls_progress32" )
    METHOD SetPos(nPos) INLINE  SendMessage( ::hWnd, PBM_SETPOS, nPos )
   METHOD SetRange( nMin, nMax ) INLINE SendMessage( ::hWnd, PBM_SETRANGE, 0, nMakeLong( nMin, nMax ) )
endclass

METHOD New( nTop, nLeft, oWnd, lPixel, nWidth, nHeight, lMarquee) CLASS TMyProgres
   DEFAULT nTop     := 0, nLeft := 0,;
           oWnd     := GetWndDefault(),;
           lPixel   := .f.,;
           nWidth   := 200, nHeight := 21,;
           lMarquee := .F.

   ::nStyle    = nOR( WS_CHILD, WS_VISIBLE, WS_TABSTOP,If( lMarquee, PBS_MARQUEE, 0 ) )
                     
   ::nId       = ::GetNewId()
   ::oWnd      = oWnd
   ::nTop      = If( lPixel, nTop, nTop * SAY_CHARPIX_H )
   ::nLeft     = If( lPixel, nLeft, nLeft * SAY_CHARPIX_W )
   ::nBottom   = ::nTop + nHeight - 1
   ::nRight    = ::nLeft + nWidth - 1
   
   ::hWnd := CREATEWINDOW("msctls_progress32",::cCaption,::nStyle, ::nLeft, ::nTop, ::nRight - ::nLeft + 1, ;
                                ::nBottom - ::nTop + 1,oWnd:hWnd,0)
    //::Link() //<-- With this no animation, without this bLClicked does not work
   ::Default()
   
   if lMarquee
    SendMessage(::hWnd,PBM_SETMARQUEE,1,0)
   endif
   
return self

function Main()
   local oDlg, oProg1, oProg2, oPrgCustom, oPrgCustom2  
   DEFINE WINDOW oDlg TITLE "Progress Bars" FROM 100,100 to 400,350 PIXEL
   @ 30, 30 PROGRESS oProg1 SIZE 160, 24 PIXEL
   @ 30, 200 PROGRESS oProg2 SIZE 24, 160 VERTICAL PIXEL
   oPrgCustom := TMyProgres():New(90,30,,.t.,160,24)
   oPrgCustom:bLClicked := {|| MsgInfo("Click") }
   oPrgCustom2 := TMyProgres():New(150,30,,.t.,160,24, .T.)
   //@ 150,30 PROGRESS oPrgCustom2 SIZE 160,24 MARQUEE PIXEL
   //oPrgCustom2:SetMarquee( .T. ) FiveWin Marquee does not works here (in progres2 sample it works, but I don't know how)
   @ 210, 80 BUTTON "Ok" ACTION oDlg:End() SIZE 80,30 PIXEL
   ACTIVATE WINDOW oDlg ON INIT Increase( oProg1, oProg2, oPrgCustom, oDlg )
return nil  

function Increase( oProg1, oProg2, oPrgCustom, oDlg )
   local n,c    
   oProg1:SetRange( 0, 100 )
   oProg2:SetRange( 0, 100 )
   oPrgCustom:SetRange( 0, 100 )
   
   for n = 1 to 5
      oProg1:SetPos( n*10 )
      oProg2:SetPos( n*10 )
      oPrgCustom:SetPos( n*10 )
      for c = 1 to 10
        Sleep( 50 )
        SysRefresh()
      next
   next  
   //oDlg:End()
return nil

that produce this window:
Image
The top and the right progress are TProgress the other two are TMyProgress, we have a smooth filling and a background animation...
I locate the animation killer in Link method of TWindow, that calls XChangeProc that is not provided...
Maybe there is some message ignored or overwritten that make the animation not working...

Re: Progress bar windows 10 animation

PostPosted: Wed Dec 20, 2017 11:09 am
by Antonio Linares
Antonino,

> Maybe there is some message ignored or overwritten that make the animation not working...

Yes, probably. Thank you for your findings.

In the meantime, your new class is working nicely. Many thanks :-)

Re: Progress bar windows 10 animation

PostPosted: Wed Dec 20, 2017 11:16 am
by AntoninoP
In my class does not works the bLClicked or other callbacks... So it can be a workaround but with heavy limitations...

Re: Progress bar windows 10 animation

PostPosted: Wed Dec 20, 2017 11:22 am
by Antonio Linares
Please try adding these methods in Class TProgress:

METHOD Display() VIRTUAL

METHOD Paint() VIRTUAL

Re: Progress bar windows 10 animation

PostPosted: Wed Dec 20, 2017 11:34 am
by AntoninoP
I found a fix, if we add the method HandleEvent to TProgress in this way
Code: Select all  Expand view
METHOD HandleEvent( nMsg, nWParam, nLParam ) CLASS TProgres
   if nMsg == WM_TIMER
      return nil
   endif
return ::Super:HandleEvent( nMsg, nWParam, nLParam )

Animation works! :D :D

PS. I copied it from TAnimate 8)

Re: Progress bar windows 10 animation

PostPosted: Wed Dec 20, 2017 11:57 am
by Antonio Linares
Great! :-D

Many thanks

Re: Progress bar windows 10 animation

PostPosted: Wed Dec 20, 2017 12:02 pm
by Antonio Linares
Fix included for next FWH version

many details to remember all of them ;-)

Re: Progress bar windows 10 animation

PostPosted: Wed Dec 20, 2017 12:05 pm
by AntoninoP
Another thing, I would change the SetMarquee in this way:

Code: Select all  Expand view
METHOD SetMarquee( lOnOff )  CLASS TProgress
   ::WinStyle(PBS_MARQUEE, lOnOff)
   SendMessage(::hWnd,PBM_SETMARQUEE,iif(lOnOff,1,0),0)
return nil


then change the TProgress:new in the same way...

Re: Progress bar windows 10 animation

PostPosted: Thu Dec 21, 2017 9:37 am
by Antonio Linares
Antonino,

Already implemented for next FWH build, many thanks

> then change the TProgress:new in the same way...

I don't understand what you mean exactly

Re: Progress bar windows 10 animation

PostPosted: Thu Dec 21, 2017 1:06 pm
by AntoninoP
About TProgress:New
First thing the nStyle shoud has PSB_MARQUEE not PBM_SETMARQUEE:
Code: Select all  Expand view
  ::nStyle    = nOR( WS_CHILD, WS_VISIBLE,;
                      If( lDesign, WS_CLIPSIBLINGS, 0 ),;
                      If( lVertical, PBS_VERTICAL, 0 ), WS_TABSTOP,;
                      If( lMarquee, PBS_MARQUEE, 0 ) )

Then need to call the send message:
Code: Select all  Expand view
  if ! Empty( oWnd:hWnd )
      ::Create( CTRL_CLASS )
      oWnd:AddControl( Self )
      SendMessage(::hWnd,PBM_SETMARQUEE,iif(lMarquee,1,0),0)
   else
      oWnd:DefControl( Self )
      // In this case?
   endif

But I don't remember how do the else case :(

Antonino