vamos pegar a progressbar.
na HWGUI:
METHOD New( oWndParent, nId, nLeft, nTop, nWidth, nHeight, maxPos, nRange, bInit, bSize, bPaint, ctooltip, nAnimation, lVertical ) CLASS HProgressBar
::Style := IIF( lvertical != NIL .AND. lVertical, PBS_VERTICAL, 0 )
::Style += IIF( nAnimation != NIL .AND. nAnimation > 0, PBS_MARQUEE, 0 )
::nAnimation := nAnimation
::Super:New( oWndParent, nId, ::Style, nLeft, nTop, nWidth, nHeight,, bInit, bSize, bPaint, ctooltip )
::maxPos := Iif( maxPos != NIL .AND. maxPos != 0, maxPos, 20 )
::lNewBox := .F.
::nRange := Iif( nRange != NIL .AND. nRange != 0, nRange, 100 )
::nLimit := Int( ::nRange/::maxPos )
::Activate()
RETURN SELF
...
HB_FUNC( HWG_UPDATEPROGRESSBAR )
{
SendMessage( ( HWND ) HB_PARHANDLE( 1 ), PBM_STEPIT, 0, 0 );
}
HB_FUNC( HWG_SETPROGRESSBAR )
{
SendMessage( ( HWND ) HB_PARHANDLE( 1 ), PBM_SETPOS,
( WPARAM ) hb_parni( 2 ), 0 );
}
HB_FUNC( HWG_SETRANGEPROGRESSBAR )
{
SendMessage( ( HWND ) HB_PARHANDLE( 1 ), PBM_SETRANGE, 0, MAKELPARAM( 0, hb_parni( 2 ) ) );
SendMessage( ( HWND ) HB_PARHANDLE( 1 ), PBM_SETSTEP, 1 , 0 );
}
Criação na HMG Extended... o que mata é variável pública e o maldito array.
PUBLIC &mVar. := k
_HMG_aControlType [k] := "PROGRESSBAR"
_HMG_aControlNames [k] := ControlName
_HMG_aControlHandles [k] := ControlHandle
_HMG_aControlParentHandles [k] := ParentFormHandle
_HMG_aControlIds [k] := nId
_HMG_aControlProcedures [k] := ""
_HMG_aControlPageMap [k] := {}
_HMG_aControlValue [k] := Value
_HMG_aControlInputMask [k] := ""
_HMG_aControllostFocusProcedure [k] := ""
_HMG_aControlGotFocusProcedure [k] := ""
_HMG_aControlChangeProcedure [k] := ""
_HMG_aControlDeleted [k] := FALSE
_HMG_aControlBkColor [k] := BackColor
_HMG_aControlFontColor [k] := BarColor
_HMG_aControlDblClick [k] := ""
_HMG_aControlHeadClick [k] := {}
_HMG_aControlRow [k] := y
_HMG_aControlCol [k] := x
_HMG_aControlWidth [k] := w
_HMG_aControlHeight [k] := h
_HMG_aControlSpacing [k] := 0
_HMG_aControlContainerRow [k] := iif ( _HMG_FrameLevel > 0 , _HMG_ActiveFrameRow [_HMG_FrameLevel] , -1 )
_HMG_aControlContainerCol [k] := iif ( _HMG_FrameLevel > 0 , _HMG_ActiveFrameCol [_HMG_FrameLevel] , -1 )
_HMG_aControlPicture [k] := ""
_HMG_aControlContainerHandle [k] := 0
_HMG_aControlFontName [k] := ''
_HMG_aControlFontSize [k] := 0
_HMG_aControlFontAttributes [k] := { FALSE, FALSE, FALSE, FALSE }
_HMG_aControlToolTip [k] := tooltip
_HMG_aControlRangeMin [k] := Lo
_HMG_aControlRangeMax [k] := Hi
_HMG_aControlCaption [k] := ''
_HMG_aControlVisible [k] := iif( invisible, FALSE, TRUE )
_HMG_aControlHelpId [k] := HelpId
_HMG_aControlFontHandle [k] := 0
_HMG_aControlBrushHandle [k] := 0
_HMG_aControlEnabled [k] := .T.
_HMG_aControlMiscData1 [k] := 0
_HMG_aControlMiscData2 [k] := ''
e tem o fonte C
HB_FUNC( INITPROGRESSBAR )
{
HWND hwnd;
HWND hbutton;
int Style = WS_CHILD;
INITCOMMONCONTROLSEX i;
i.dwSize = sizeof( INITCOMMONCONTROLSEX );
i.dwICC = ICC_PROGRESS_CLASS;
InitCommonControlsEx( &i );
hwnd = ( HWND ) HB_PARNL( 1 );
if( hb_parl( 9 ) )
Style = Style | PBS_VERTICAL;
if( hb_parl( 10 ) )
Style = Style | PBS_SMOOTH;
if( ! hb_parl( 11 ) )
Style = Style | WS_VISIBLE;
hbutton = CreateWindowEx
(
WS_EX_CLIENTEDGE,
PROGRESS_CLASS,
0,
Style,
hb_parni( 3 ),
hb_parni( 4 ),
hb_parni( 5 ),
hb_parni( 6 ),
hwnd,
( HMENU ) HB_PARNL( 2 ),
g_hInstance,
NULL
);
SendMessage( hbutton, PBM_SETRANGE, 0, MAKELONG( hb_parni( 7 ), hb_parni( 8 ) ) );
SendMessage( hbutton, PBM_SETPOS, ( WPARAM ) hb_parni( 12 ), 0 );
HB_RETNL( ( LONG_PTR ) hbutton );
}
na GTWVG:
METHOD WvgProgressBar:create( oParent, oOwner, aPos, aSize, aPresParams, lVisible )
::ClassName := "msctls_progress32"
::ObjType := objTypeStatic
::Style += WIN_WS_CHILD + WIN_WS_GROUP + ;
iif( ::lMarquee, PBS_MARQUEE, 0 ) + ;
iif( ::lVertical, PBS_VERTICAL, 0 ) + ;
iif( ::lSmooth, PBS_SMOOTH, 0 ) + WIN_WS_EX_CLIENTEDGE
::wvgWindow:create( oParent, oOwner, aPos, aSize, aPresParams, lVisible )
::oParent:AddChild( Self )
::createControl()
::SetValue( ::nValue, ::nRangeMin, ::nRangeMax, ::nSpeed )
IF HB_ISNUMERIC( ::nColorBarFG )
::SetColorBarFG( ::nColorBarFG )
ENDIF
IF HB_ISNUMERIC( ::nColorBarBG )
::SetColorBarGB( ::nColorBarBG )
ENDIF
...
METHOD PROCEDURE WvgProgressBar:setCaption( cCaption )
IF HB_ISSTRING( cCaption )
::Caption := cCaption
ENDIF
IF HB_ISSTRING( ::Caption )
::sendMessage( WIN_WM_SETTEXT, 0, ::Caption )
ENDIF
RETURN
METHOD WvgProgressBar:SetValue( nValue, nRangeMin, nRangeMax, nSpeed )
IF HB_ISNUMERIC( nRangeMin ) .AND. HB_ISNUMERIC( nRangeMax ) .AND. ! ::lMarquee
::nRangeMin := nRangeMin
::nRangeMax := nRangeMax
::sendMessage( PBM_SETRANGE, 0, WIN_MAKELONG( ::nRangeMin, ::nRangeMax ) )
ENDIF
IF HB_ISNUMERIC( nValue ) .AND. ! ::lMarquee
::sendMessage( PBM_SETPOS, nValue, 0 )
::nValue := nValue
ENDIF
IF HB_ISNUMERIC( nSpeed ) .AND. ::lMarquee
::sendMessage( PBM_SETMARQUEE, 1, nSpeed )
::nSpeed := nSpeed
ENDIF
RETURN ::sendMessage( PBM_GETPOS, 0, 0 )
METHOD PROCEDURE WvgProgressBar:SetCOlorBarFG( nColor )
IF HB_ISNUMERIC( nColor )
::sendMessage( PBM_SETBARCOLOR, 0, nColor )
ENDIF
RETURN
METHOD PROCEDURE WvgProgressBar:SetColorBarBG( nColor )
IF HB_ISNUMERIC( nColor )
::sendMessage( PBM_SETBKCOLOR, 0, nColor )
ENDIF
RETURN
Reparem que é tudo a mesma coisa.
Todos usam a classe de API do Windows pra criar janela e enviar mensagens.
A diferença é: na GTWVG é mais PRG, criar janela é por PRG, enviar mensagens pra progressbar é por PRG.
Vantagem que vejo: menos fonte C pra causar incompatibilidade, e PRG para o usuário "brincar".
Desvantagem que vejo no geral: as LIBs tem fonte C, pra fazer o que o Harbour já tem pronto e não precisa de C, são fontes repetidos que poderiam ser padronizados.
Até onde pode ir essa padronização? não sei, mas com certeza nem a parte básica foi tentada.
E comentário adicional: é o mesmo controle da GTWVG, não deixaria nada a desejar pra outras LIBs, ao contrário, por ser baseada em linha/coluna, automaticamente terá o recurso de redimensionamento automático.
Linha e coluna é pra console? Não, o próprio VB6 tem ESCALA pra ser usada em formulários e não ficar preso a pixels, trata-se apenas de uma escala de medida.