Página 1 de 1

Meus controles, não totalmente portados pra 3.2

Enviado: 10 Abr 2023 13:37
por JoséQuintas
testwvg.zip
(908.6 KiB) Baixado 172 vezes
O ícone usado é harbour\package\harbour.ico, mas só existe quando se baixam os fontes do harbour, e vai precisar ajustar o path no arquivo RC.
Em todo caso, tem o compilado junto, harbour 3.2.
Talvez algum dia possa fazer parte do harbour.
menu.png
button.png
Note que é sempre o mesmo ícone, com redimensionamento, coisa que não tem na wvg atual.
Também não estava previsto na wvg atual usar texto + icone ao mesmo tempo
all.png
No 3.4 a cor de fundo do texto, por exemplo, era alterada, no 3.4 está mantendo branco.
Ainda não fiz muita tentativa pra corrigir isso.
rmchart.png
Com certeza acima é recurso do rmchart.
Mas usando um controle simples pro gráfico, chamei de wvgTstRectangle()
É só um controle vazio.

Meus controles, não totalmente portados pra 3.2

Enviado: 10 Abr 2023 13:44
por JoséQuintas
O exemplo dos buttons, compliquei um pouco pra dar opção de janela modal ou não modal, e pra recursividade de acordo.

Código: Selecionar todos

#include "inkey.ch"
#include "hbgtwvg.ch"
#include "wvgparts.ch"
#include "wvtwin.ch"

FUNCTION demo_button( cText, nMode )

   LOCAL nKey := 0, oCrt, oControl, nCol := 0, GetList := {}
   LOCAL cName := Space(30), cAddress := Space(30), cCity := Space(20)
   LOCAL oCtlList := { ;
      { "Insert", "icoharbour", Asc( "I" ), Nil }, ;
      { "Edit",   "icoharbour", Asc( "E" ), Nil }, ;
      { "Delete", "icoharbour", Asc( "D" ), Nil }, ;
      { "Search", "icoharbour", Asc( "S" ), Nil }, ;
      { "Exit",   "icoharbour", K_ESC, Nil } }

   hb_Default( @cText, "" )
   hb_Default( @nMode, 1 )
   IF nMode == 1
      oCrt := wvgCrt():New()
      oCrt:lModal := .T.
      oCrt:Create( ,, { 1, 1 }, { 24, 60 } )
   ELSE
      hb_gtReload( "WVG" )
      SetMode( 25, 80 )
   ENDIF
   SetColor( "W/B" )
   CLS
   @ 1, 0 SAY cText
   FOR EACH oControl IN oCtlList
      WITH OBJECT oControl[ 4 ] := wvgTstPushbutton():New()
         :PointerFocus := .F.
         :Style += BS_TOP
         :Create( oCrt, , { -3, iif( nCol == 0, -0.1, -nCol ) }, { -3, -6 } )
         :SetCaption( { , WVG_IMAGE_ICONRESOURCE, oControl[ 2 ] } )
         :SetCaption( oControl[ 1 ] )
         :Activate := BuildBlockKeyPut( oControl[ 3 ] )
         :TooltipText( oControl[ 1 ] )
         nCol += 6
      ENDWITH
   NEXT
   @ 8, 1         SAY "Name.....:" GET cName
   @ Row() + 1, 1 SAY "Address..:" GET cAddress
   @ Row() + 1, 1 SAY "City.....:" GET cCity
   SetPaintGetList( GetList, oCrt )
   CLEAR GETS
   DO WHILE nKey != K_ESC
      nKey := Inkey(0)
      IF nKey != K_ESC
         FOR EACH oControl IN oCtlList
            IF nKey == oControl[ 3 ]
               IF oCrt == Nil
                  hb_ThreadStart( { || demo_button( oControl[ 1 ], nMode ) } )
               ELSE
                  demo_button( oControl[ 1 ], nMode )
               ENDIF
            ENDIF
         NEXT
      ENDIF
   ENDDO
   IF nMode == 1
      oCrt:Destroy()
   ENDIF

   RETURN Nil

FUNCTION BuildBlockKeyPut( nKey )

   RETURN { || HB_KeyPut( nKey ) }

FUNCTION SetPaintGetList( GetList, oCrt )

   LOCAL oGet, oControl

   FOR EACH oGet IN GetList
      oControl := wvgTstGroupbox():New()
      oControl:Create( oCrt, , { -(oGet:Row-0.3), -(oGet:Col-0.3) }, { -1.3, -0.4-Len( Transform( oGet:VarGet(), oGet:Picture ) ) } )
   NEXT

   RETURN Nil
button.png
Se executar exemplo modal cada button que clica numa janela, abre outra janela modal por cima.
Se executar exemplo nomodal, cada button que clica abre uma nova janela independente.
É só esse fonte acima pras duas opções.

ESSE RECURSO DE JANELAS É DA PRÓPRIA GTWVG.
O recurso de buttons também, só o redimensionamento de ícone que não é, e esse uso de texto+ícone.

E aqui cabe uma pergunta básica:
Dá pra comparar algum exemplo da gtwvg com esse ?
Acho que não. Os exemplos da GTWVG são complicados.

Esse usa o que seria uma LIB GUI, sem reaproveitar janela, e controles windows.
Os exemplos da GTWVG usam as funções WVT_*, que são usados de outra forma mais chata/complicada.

Meus controles, não totalmente portados pra 3.2

Enviado: 10 Abr 2023 13:56
por JoséQuintas
Ainda sobre o anterior:

Os controles windows (wvg*) são criados e não somem da janela, igual é normal em GUI.
Não precisa ficar repintando igual os outros.

Uma diferença entre console e GUI é justamente o console ficar usando sempre a mesma janela, apagar, salvar, restaurar, etc.
Em GUI a janela é criada do jeito que vai ser usada o tempo todo, uma nova janela pra cada "diálogo" diferente.
É isso que tem aí.
Torna tudo relativamente mais simples.

Talvez se na época que saiu a GTWVG exemplos assim tivessem chamado mais a atenção.
De qualquer jeito, OOP confunde a cabeça de quem não está acostumado.
E os exemplos confundiram mais ainda kkkk

Meus controles, não totalmente portados pra 3.2

Enviado: 10 Abr 2023 14:02
por JoséQuintas
Pensando bem, faltou um exemplo com buttons de tamanhos variados e mesmo ícone....

Meus controles, não totalmente portados pra 3.2

Enviado: 10 Abr 2023 14:13
por JoséQuintas
size.png
Na prática não vai ser usado, é só pra demonstrar o recurso de redimensionamento da imagem no button.

Código: Selecionar todos

#include "inkey.ch"
#include "hbgtwvg.ch"
#include "wvgparts.ch"
#include "wvtwin.ch"

FUNCTION demo_buttonSize( cText )

   LOCAL nKey := 0, oCrt, oControl, nCol := 0, aButtonSize := { 3, 6 }
   LOCAL oCtlList := { ;
      { "Insert", "icoharbour", Asc( "I" ), Nil }, ;
      { "Edit",   "icoharbour", Asc( "E" ), Nil }, ;
      { "Delete", "icoharbour", Asc( "D" ), Nil }, ;
      { "Search", "icoharbour", Asc( "S" ), Nil }, ;
      { "Exit",   "icoharbour", K_ESC, Nil } }

   hb_Default( @cText, "" )
   oCrt := wvgCrt():New()
   oCrt:lModal := .T.
   oCrt:Create( ,, { 1, 1 }, { 24, 60 } )
   SetColor( "W/B" )
   CLS
   @ 1, 0 SAY cText
   FOR EACH oControl IN oCtlList
      WITH OBJECT oControl[ 4 ] := wvgTstPushbutton():New()
         :PointerFocus := .F.
         :Style += BS_TOP
         :Create( oCrt, , { -3, iif( nCol == 0, -0.1, -nCol ) }, { -aButtonSize[ 1 ], -aButtonSize[ 2 ] } )
         :SetCaption( { , WVG_IMAGE_ICONRESOURCE, oControl[ 2 ] } )
         :SetCaption( oControl[ 1 ] )
         :Activate := BuildBlockKeyPut( oControl[ 3 ] )
         :TooltipText( oControl[ 1 ] )
         nCol += aButtonSize[2]
         aButtonSize[ 1 ] += 1
         aButtonSize[ 2 ] += 2
      ENDWITH
   NEXT
   DO WHILE nKey != K_ESC
      nKey := Inkey(0)
      IF nKey != K_ESC
         FOR EACH oControl IN oCtlList
            IF nKey == oControl[ 3 ]
               demo_button( oControl[ 1 ] )
            ENDIF
         NEXT
      ENDIF
   ENDDO
   oCrt:Destroy()

   RETURN Nil

Meus controles, não totalmente portados pra 3.2

Enviado: 10 Abr 2023 15:43
por JoséQuintas
Comentário extra:

Código: Selecionar todos

   oButton:Activate := BuildBlockKeyPut( oControl[ 3 ] )
Esse é o codeblock a ser executado no button.
Em GUI costuma se chamar OnClick(), na gtwvg é Activate(), fazer o que...
Poderia ser { || rotina() } e chamar diretamente uma rotina.
Mas como estamos trabalhando com GT, que de certa forma é console, pode ser mais interessante usar um KEYBOARD, e seguir o normal do console.

Supondo que tenha lá no fonte:

Código: Selecionar todos

@ 1, 0 SAY "I-Inclui, A-Altera, E-Exclui, ESC-Sai" Get cOpcao PICTURE "!A"
READ
DO CASE
CASE cOpcao == "I"
CASE cOpcao == "A"
...
ENDCASE
A alteração no fonte pra usar buttons se resume a criar os buttons, e cada um faz o seu KEYBOARD.
A rotina existente já vai servir para o restante.
E provavelmente algum ajuste de tela, pra caber os buttons.

Pode ter caso que faça sentido chamar rotina diretamente, mas, assim continua do jeito tradicional estilo console, sem precisar alterar muito os fontes.

Mas como eu digo sempre:
Os fontes podem ter muito a ser melhorado.
Não é porque aproveita fonte, que vai deixar um fonte ruim no aplicativo.
Se o fonte tá ruim, pode ficar pior, mesmo sendo só a criação de buttons.

Nos exemplos acima, usei FOR/EACH pra criar os buttons.
Isso economiza muito fonte, comparado a criar um por um.

Cada um vai encontrar seu próprio jeito de lidar com tudo isso.

Pode até usar PIXEL, mas aí vai ficar preso a resolução de tela, o que pode não ser bom.
Usando linha/coluna, todo posicionamento e redimensionamento é automático ao redimensionar a tela.

Pode ficar comprido ou curto, conforme o que o usuário redimensionar... e daí?

Meus controles, não totalmente portados pra 3.2

Enviado: 10 Abr 2023 15:53
por JoséQuintas
um recurso do windows 10 é arrastar a janela para um lado.
Isso vai fazer com que a janela do aplicativo ocupe metade da tela.
janela1.png
soltou o mouse, o aplicativo ocupa a metade.
Não pergunte qual a vantagem, o recurso apenas existe.
Tá aí redimensionado.
janela2.png
O aplicativo não tem nada especial pra isso, é automático.

Meus controles, não totalmente portados pra 3.2

Enviado: 10 Abr 2023 17:34
por JoséQuintas
E que tal criar um novo ?
Gosto desse meu gráfico.
graf1.png
Tenho este exemplo da bostaurus.
graf2.png
Acho que juntando os dois, e mais meu rectangle.... dá pra criar um controle novo....

Meus controles, não totalmente portados pra 3.2

Enviado: 10 Abr 2023 18:46
por JoséQuintas
progb.png
A barra ok, o texto não deu certo.

Código: Selecionar todos

CREATE CLASS MyClass INHERIT wvgTstRectangle
   
   METHOD SetValue( nIndex, nTotal )
   
   ENDCLASS

METHOD SetValue( nIndex, nTotal ) Class MyClass
   
   LOCAL n_hWnd, nWidth, nHeight
   LOCAL hDC, BTstruct, nAlignText, nTypeText, aSize

   BT_ClientAreaInvalidateAll( ::hWnd )
   n_hWnd := ::hWnd
   aSize := ::CurrentSize()
   nWidth := aSize[ 1 ] // BT_ClientAreaWidth( n_hWnd )
   nHeight := aSize[ 2 ] // BT_ClientAreaHeight( n_hWnd )

   hDC = BT_CreateDC( n_hWnd, BT_HDC_INVALIDCLIENTAREA, @BTstruct)

   BT_DrawGradientFillHorizontal( hDC, 0, 0, Int( ( nWidth * nIndex ) / nTotal ), nHeight, BLACK, BLUE )

   BT_DrawGradientFillHorizontal( hDC, 0, Int( ( nWidth * nIndex ) / nTotal ), nWidth - Int( ( nWidth * nIndex ) / nTotal ), nHeight, BLACK, RED )

   nTypeText  := BT_TEXT_TRANSPARENT + BT_TEXT_BOLD + BT_TEXT_ITALIC + BT_TEXT_UNDERLINE
   nAlignText := BT_TEXT_CENTER + BT_TEXT_BASELINE
   BT_DrawText( hDC, 0, 0, "Testing graphic", "Comic Sans MS", 18, YELLOW, BLACK, nTypeText, nAlignText )

   BT_DeleteDC( BTstruct )

   RETURN Nil
É só teste, ainda não está no lugar certo, que seria o Paint() do controle.
Poderia ser usada em qualquer lib.
Bostaurus, assim como gtwvg do harbour 3.2, trabalha com numérico ao invés de pointer, nem precisou conversão. (para o hwnd)

Meus controles, não totalmente portados pra 3.2

Enviado: 10 Abr 2023 19:09
por JoséQuintas
bosta.png
Até deu certo, mas não entendi a métrica usada pro texto.
Parece que está pegando da janela maior e não da janela do controle.

Código: Selecionar todos

#include "inkey.ch"
#include "bostaurus.ch"
#include "i_color.ch"
#include "hbclass.ch"

FUNCTION MAIN

   LOCAL oWin, nKey := 0, nCont

   hb_gtReLoad( "WVG" )
   //wvt_SetGui( .T. )
   SetMode(25,80)
   CLS
   oWin := MyClass():New()
   oWin:Create( , , { -1, -1 }, { -5, -35 } )
   DO WHILE nKey != K_ESC
      FOR nCont = 1 TO 100
         oWin:SetValue( nCont, 100 )
         IF ( nKey := Inkey(1) ) == K_ESC
            EXIT
         ENDIF
      NEXT
      IF nKey == K_ESC
         EXIT
      ENDIF
   ENDDO

   RETURN NIL

CREATE CLASS MyClass INHERIT wvgTstRectangle

   VAR nIndex INIT 1
   VAR nTotal INIT 1
   METHOD Paint()
   METHOD SetValue( nIndex, nTotal ) INLINE ::nIndex := nIndex, ::nTotal := nTotal, ::Paint()

   ENDCLASS

METHOD Paint() Class MyClass

   LOCAL n_hWnd, nWidth, nHeight
   LOCAL hDC, BTstruct, nAlignText, nTypeText, aSize

   BT_ClientAreaInvalidateAll( ::hWnd )
   n_hWnd := ::hWnd
   aSize := ::CurrentSize()
   nWidth := aSize[ 1 ] // BT_ClientAreaWidth( n_hWnd )
   nHeight := aSize[ 2 ] // BT_ClientAreaHeight( n_hWnd )

   hDC = BT_CreateDC( n_hWnd, BT_HDC_INVALIDCLIENTAREA, @BTstruct)

   BT_DrawGradientFillHorizontal( hDC, 0, 0, Int( ( nWidth * ::nIndex ) / ::nTotal ), nHeight, BLACK, BLUE )

   BT_DrawGradientFillHorizontal( hDC, 0, Int( ( nWidth * ::nIndex ) / ::nTotal ), nWidth - Int( ( nWidth * ::nIndex ) / ::nTotal ), nHeight, BLACK, RED )

   nTypeText  := BT_TEXT_TRANSPARENT + BT_TEXT_BOLD + BT_TEXT_ITALIC
   nAlignText := BT_TEXT_LEFT + BT_TEXT_BASELINE
   BT_DrawText( hDC, 40, 55, "Testing graphic", "Comic Sans MS", 25, YELLOW, BLACK, nTypeText, nAlignText )

   BT_DeleteDC( BTstruct )

   RETURN Nil