Página 2 de 3

GTWVG - Harbour 3.2

Enviado: 08 Mar 2023 16:13
por JoséQuintas

Código: Selecionar todos

   AAdd( aBlocks, {|| wvt_DrawLabel( 1, 40, cLabel, 6,, RGB( 255, 255, 255 ), RGB( 198, 198, 198 ), "Arial", 26, , , , , .T., .T. ) } )
   AAdd( aBlocks, {|| wvt_DrawBoxRaised( nTop, nLft, nBtm, nRgt ) } )
   AAdd( aBlocks, {|| wvt_DrawBoxRecessed( 7, 61, 13, 70 ) } )
   AAdd( aBlocks, {|| wvt_DrawBoxGroup( 15, 59, 18, 72 ) } )
   AAdd( aBlocks, {|| wvt_DrawBoxGroup( 5, 6, 19, 44 ) } )
   AAdd( aBlocks, {|| wvt_DrawImage( 8, 62, 12, 69, IMAGE_VOUCH, , .T. ) } )
   AAdd( aBlocks, {|| wvt_DrawBoxRecessed( 7, 48, 13, 55 ) } )
   AAdd( aBlocks, {|| wvt_DrawLine( MaxRow() - 2, 0, MaxRow() - 2, MaxCol(), WVT_LINE_HORZ, WVT_LINE_RECESSED, WVT_LINE_BOTTOM ) } )
   AAdd( aBlocks, {|| wvt_DrawLine( MaxRow() - 1, 41, MaxRow(), 41, WVT_LINE_VERT, WVT_LINE_RECESSED, WVT_LINE_CENTER ) } )
   AAdd( aBlocks, {|| AEval( GetList, {| oGet | wvt_DrawBoxGet( oGet:Row, oGet:Col, Len( Transform( oGet:VarGet(), oGet:Picture ) ) ) } ) } )
Nos exemplos da WVG o uso é outro.
Isso tudo acima é "desenhar na tela de fundo", não são controles GUI.

Código: Selecionar todos

   LOCAL wvtScr     := wvt_SaveScreen( 0, 0, MaxRow(), MaxCol() )
   wvt_RestScreen( wvtScr )
Isso acima, é salvar/restaurar a tela gráfica, só essa "tela de fundo".

Então....
Existia a WVT pra tudo isso, por isso esses levam o nome WVT_.
A WVG foi pra permitir o uso de controles Windows, como uma LIB GUI.
Acho que o próprio criador não percebeu que entre totalmente gráfico e totalmente GUI, existe esse modo intermediário, que tira proveito dos dois ambientes.
Acabou que GTWVG tem tudo, mas não tem nada de exemplos, só exemplo mais complicado.

GTWVG - Harbour 3.2

Enviado: 08 Mar 2023 22:57
por JoséQuintas
test.png
Fiz um teste com a WVG ORIGINAL.
É SÓ TESTE, NÃO É PRA USAR.

Coloquei no evento resize() do button pra recarregar o ícone do tamanho do button - tamanho do fonte.
Lógico, esse resize é pra texto encima ou embaixo, e não do lado, aonde era do lado, o texto sumiu porque o ícone "empurrou" o texto pra fora da janela.
Lógico também, ele começa normal, só faz o redimensionamento do ícone quando altera tamanho da janela, que faz alterar o tamanho do button - isso aciona a rotina em resize()

Foi só teste.
Talvez isso carregue um novo ícone a cada redimensionamento, acumulando na memória, pela falta do LR_SHARED.

Parecido com o que seria usado em HWGUI ou outra LIB, SE USAREM IMAGEM NO AUTOMÁTICO.
O Ownerbutton usa desenho manual, e usa DrawIconEx() pra isso.

GTWVG - Harbour 3.2

Enviado: 08 Mar 2023 23:06
por JoséQuintas
Esqueci de mostrar o fonte alterado.
Neste fonte, só uma rotina pra criar os buttons.
Assim começa a reduzir fonte extra.

Código: Selecionar todos

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

PROCEDURE Main

   LOCAL cResp := Space(1), GetList := {}, oBtn
   LOCAL oBtnList := { ;
      { -1, -1, -5, -10, 0, "teste", Nil }, ;
      { -1, -11, -5, -10, BS_TOP, "teste", "icoBook" }, ;
      { -1, -21, -5, -10, BS_BOTTOM, "teste", "icoBook" }, ;
      { -1, -31, -5, -10, BS_RIGHT, "teste", "icoBook" }, ;
      { -1, -41, -5, -10, BS_LEFT, "teste", "icoBook" } }

   SetMode(30,100)
   CLS
   Altd()
   FOR EACH oBtn IN oBtnList
      CreateButton( oBtn )
   NEXT
   @ 12, 5 SAY "ok" GET cResp
   READ

   RETURN

FUNCTION CreateButton( oBtn )

   AAdd( oBtn, Nil )
   WITH OBJECT oBtn[8] := wvgPushButton():New()
      :PointerFocus := .F.
      IF ! Empty( oBtn[5] )
         :Style += oBtn[5]
      ENDIF
      :Create( , , { oBtn[1], oBtn[2] }, { oBtn[3], oBtn[4] } )
      IF ! Empty( oBtn[7] )
         :SetCaption( { , WVG_IMAGE_ICONRESOURCE, oBtn[7] } )
         :sl_Resize := { || ResizeIcon( oBtn[8], oBtn[7] ) }
      ENDIF
      :SetCaption( oBtn[6] )
   ENDWITH

   RETURN oBtn

FUNCTION ResizeIcon( oBtn, cIcon )

   LOCAL aSize, nWidth, nHeight

   WITH OBJECT oBtn
      aSize := :CurrentSize()
      nWidth  := aSize[ 1 ] - 2
      nHeight := aSize[ 2 ] - wvt_GetFontInfo()[ 6 ] - 2
      wvg_SendMessage( :hWnd, BM_SETIMAGE, IMAGE_ICON, wvg_LoadImage( cIcon, 1, IMAGE_ICON, nWidth, nHeight ) )
   ENDWITH

   RETURN Nil
Só comentário:
Apesar de usar linha/coluna pra posições, o button usa pixels, e o redimensionamento da imagem é todo usando pixels.

GTWVG - Harbour 3.2

Enviado: 08 Mar 2023 23:31
por JoséQuintas

Código: Selecionar todos

   WITH OBJECT oBtn
      aSize := :CurrentSize()
      nWidth  := aSize[ 1 ] - 2
      nHeight := aSize[ 2 ] - wvt_GetFontInfo()[ 6 ] - 2
      wvg_SendMessage( :hWnd, BM_SETIMAGE, IMAGE_ICON, wvg_LoadImage( cIcon, 1, IMAGE_ICON, nWidth, nHeight ) )
   ENDWITH
Quem usa GUI sabe, só mudam os nomes.

aSize := :CurrentSize()
Isso pega o array que contém o tamanho da janela

nWidth := aSize[ 1 ] - 2
Pra largura, menos 2 pixels, pro contorno do button

nHeight := aSize[ 2 ] - wvt_GetFontInfo()[ 6 ] - 2
Pra altura, se vai ter um texto, menos o tamanho do fonte, menos 2 pro contorno do button

wvg_SendMessage( :hWnd, BM_SETIMAGE, IMAGE_ICON, wvg_LoadImage( cIcon, 1, IMAGE_ICON, nWidth, nHeight ) )
E por último, carrega a imagem indicando o tamanho, e manda uma mensagem para o button com a nova imagem.

Essa parte toda não precisa fazer parte do fonte, melhor copiar o fonte do controle button e já alterar (ou alterar o original).

É legal a brincadeira.
GTWVG, HWGUI, HMG.... é tudo API Windows.
Os detalhes, como os nomes de métodos ou funções são diferentes, mas o funcionamento dos controles GUI é o mesmo.
E tem o desenho automático e o desenho manual, onde no manual abre mais possibilidades de cores, aparência, etc. e deixa os controles de uma LIB diferentes dos controles de outra.

GTWVG - Harbour 3.2

Enviado: 08 Mar 2023 23:51
por JoséQuintas
Mais dois métodos do button:

Código: Selecionar todos

         oControl:Activate := BuildBlockKeyPut( oElement[ 1 ] )
         oControl:TooltipText( cTooltip )
Tooltiptext é o texto de dica, de tooltip, que mostra quando passa o mouse por cima do button.

Activate é quando clica - como eu disse, nomes puxado do xbase++
Na hwgui é no ON CLICK, ou :bClick

Pode ser uma rotina mais complexa, mas eu preferi enviar um KEYBOARD, e tratar na rotina normal do aplicativo.
Lá no controle button tem um SetFocus() de volta pra janela de GT antes de executar o comando, então o KEYBOARD vai pra GT.

Podemos ter na rotina I-Inclui, A-Altera, E-Exclui

Código: Selecionar todos

@ 1, 0 GET cResp PICTURE "!A"
READ
IF LastKey() == K_ESC
   EXIT
ENDIF
E criar os buttons pra só fazer o keyboard da letra, ou do ESC.
O usuário digita letra funciona, o usuário clica no button funciona.

Só não vamos usar o GET, pra não ficar aquele get aparecendo na tela... vai por Inkey(0) ou com tempo...

GTWVG - Harbour 3.2

Enviado: 09 Mar 2023 12:09
por JoséQuintas
menu.png
Outro controle é o menu.
Mas não gosto de menu Windows, não acho prático.
Nenhuma novidade, igual qualquer menu Windows.
Tenho no aplicativo talvez há 10 anos, como opção, mas nunca liberei pra ninguém.

Deixar o menu uma bost. só pra dizer que é Windows ?
Não vejo vantagem.

Tá aí.... talvez criar um controle novo pra menu !!!

GTWVG - Harbour 3.2

Enviado: 09 Mar 2023 12:29
por JoséQuintas
relatorio.png
Tenho um menu desse tipo EM CADA RELATÓRIO.
Alguma idéia GUI pra substituir ?

Ou talvez de outra forma:
Alguma idéia GUI QUE COMPENSE substituir ?

Dependendo da opção, tem pesquisa em cadastros.

Até dá pra fazer com letras diferentes, escolher entre milhões de cores, talvez enfeitar, mas....
Sei lá...
Desse jeito seria trocar 6 por meia dúzia...

E se for um controle que faça isso.... me parece também trocar 6 por meia dúzia.

Nota: mouse funciona, rodinha do mouse funciona, à primeira vista, GUI seria só pra visual mesmo, tipos de letras e cores.
A não ser que invente uma nova forma de fazer isso.

GTWVG - Harbour 3.2

Enviado: 09 Mar 2023 12:57
por JoséQuintas
Trocar por combobox?

Aí o usuário teria que obrigatoriamente clicar com o mouse pra mudar o foco.
Poderia perder o recurso de digitar a letra.
Em HWGUI, por exemplo, tem o recurso ON KEY, mas o usuário teria que clicar no form pra poder funcionar ON KEY.
O mesmo deve acontecer se usar o combobox da gtwvg.

Não se trata de LIB ou recurso, mas, se for pra mudar, tem que ser pra melhor.

Mudar pra hwgui ? Aí na digitação do código vai ter o bug da validação do último campo.
Teria que ficar MUITO MELHOR do que está hoje, pra compensar o bug.

Mudar pra HMG?
Não sei se tem bug, mas teria que ficar melhor do que é hoje, pra justificar a troca.

Até hoje sem idéias do que melhorar nisso.

Só pensei em talvez esconder as opções, e ter apenas uma opção de filtro, que vai acrescentando o que for escolhido.
Isso deixaria um visual mais limpo.
Acho que essa sempre foi a idéia geral, mais reforçada na atualidade: visual limpo

GTWVG - Harbour 3.2

Enviado: 09 Mar 2023 13:53
por Fernando queiroz
eu uso um combobox ficou legal
eu uso um combobox ficou legal
Não dou muita ênfase a relatórios, prefiro uma tela de consulta das informações, menos papel, tonner/tinta e mais atualizado os dados estao

GTWVG - Harbour 3.2

Enviado: 09 Mar 2023 14:09
por JoséQuintas
Fernando queiroz escreveu:Não dou muita ênfase a relatórios, prefiro uma tela de consulta das informações, menos papel, tonner/tinta e mais atualizado os dados estao
Mas não necessáriamente o relatório vai pra impressora.
A saída é um PDF que pode ser somente visualizado.

GTWVG - Harbour 3.2

Enviado: 09 Mar 2023 14:15
por JoséQuintas
Ou também pode ser enviado por email.

Vendedores, por exemplo, querem ver direitinho suas comissões.
Além disso, há casos onde os vendedores ficam o tempo todo na rua, e nem usam computador.

GTWVG - Harbour 3.2

Enviado: 09 Mar 2023 19:33
por JoséQuintas

Código: Selecionar todos

METHOD WvgStatic:new( oParent, oOwner, aPos, aSize, aPresParams, lVisible )

   ::wvgWindow:new( oParent, oOwner, aPos, aSize, aPresParams, lVisible )

   /* SS_NOTIFY  SS_ETCHEDFRAME  SS_SUNKEN  SS_WHITERECT */

   ::style       := WS_CHILD + WS_CLIPCHILDREN
   ::className   := "STATIC"
   ::objType     := objTypeStatic

   RETURN Self

METHOD WvgStatic:create( oParent, oOwner, aPos, aSize, aPresParams, lVisible )

   ::wvgWindow:create( oParent, oOwner, aPos, aSize, aPresParams, lVisible )

#if 0
   SS_ETCHEDFRAME
   SS_SUNKEN
   SS_LEFTNOWORDWRAP
   SS_SIMPLE
   SS_CENTERIMAGE
   SS_REALSIZEIMAGE
   SS_ENHMETAFILE
   SS_ETCHEDHORZ
   SS_ETCHEDVERT
   SS_RIGHTJUST
#endif

   SWITCH ::type
   CASE WVGSTATIC_TYPE_TEXT
      IF hb_bitAnd( ::options, WVGSTATIC_TEXT_LEFT ) == WVGSTATIC_TEXT_LEFT
         ::style += SS_LEFT /*+ SS_LEFTNOWORDWRAP */
      ENDIF
      IF hb_bitAnd( ::options, WVGSTATIC_TEXT_RIGHT ) == WVGSTATIC_TEXT_RIGHT
         ::style += SS_RIGHT
      ENDIF
      IF hb_bitAnd( ::options, WVGSTATIC_TEXT_CENTER ) == WVGSTATIC_TEXT_CENTER
         ::style += SS_CENTER
      ENDIF
      IF hb_bitAnd( ::options, WVGSTATIC_TEXT_WORDBREAK ) == WVGSTATIC_TEXT_WORDBREAK
         ::style -= SS_LEFTNOWORDWRAP
      ENDIF
      EXIT

   CASE WVGSTATIC_TYPE_GROUPBOX
      EXIT
   CASE WVGSTATIC_TYPE_ICON
      ::style += SS_ICON
      EXIT
   CASE WVGSTATIC_TYPE_SYSICON
      EXIT
   CASE WVGSTATIC_TYPE_BITMAP
      ::style += SS_BITMAP
      DO CASE
      CASE ::options == WVGSTATIC_BITMAP_TILED
         ::style += SS_CENTERIMAGE
      CASE ::options == WVGSTATIC_BITMAP_SCALED

      OTHERWISE

      ENDCASE
      EXIT

   CASE WVGSTATIC_TYPE_FGNDRECT
      ::style += SS_WHITERECT
      EXIT
   CASE WVGSTATIC_TYPE_BGNDRECT
      ::style += SS_BLACKRECT
      EXIT
   CASE WVGSTATIC_TYPE_HALFTONERECT
      ::style += SS_GRAYRECT
      EXIT
   CASE WVGSTATIC_TYPE_FGNDFRAME
      ::style += SS_WHITEFRAME
      EXIT
   CASE WVGSTATIC_TYPE_BGNDFRAME
      ::style += SS_BLACKFRAME
      EXIT
   CASE WVGSTATIC_TYPE_HALFTONEFRAME
      ::style += SS_GRAYFRAME
      EXIT
   CASE WVGSTATIC_TYPE_RAISEDBOX
      ::style += SS_ETCHEDFRAME
      EXIT

   CASE WVGSTATIC_TYPE_RECESSEDBOX
      EXIT
   CASE WVGSTATIC_TYPE_RAISEDRECT
      EXIT
   CASE WVGSTATIC_TYPE_RECESSEDRECT
      EXIT
   CASE WVGSTATIC_TYPE_RAISEDLINE
      EXIT
   CASE WVGSTATIC_TYPE_RECESSEDLINE
      EXIT
   ENDSWITCH  /* ::type */

#if 1
   /* Options */
   IF AScan( { WVGSTATIC_TYPE_FGNDFRAME, WVGSTATIC_TYPE_BGNDFRAME, WVGSTATIC_TYPE_HALFTONEFRAME }, ::type ) > 0
      DO CASE
      CASE hb_bitAnd( ::options, WVGSTATIC_FRAMETHIN ) == WVGSTATIC_FRAMETHIN
         ::style += WS_BORDER
      CASE hb_bitAnd( ::options, WVGSTATIC_FRAMETHICK ) == WVGSTATIC_FRAMETHICK
         ::style += WS_DLGFRAME
      ENDCASE
   ENDIF
#endif
#if 0
   IF ::type == WVGSTATIC_TYPE_TEXT
      DO CASE
      CASE ::options == WVGSTATIC_FRAMETHIN
         ::style += WS_BORDER
      CASE ::options == WVGSTATIC_FRAMETHICK
         ::style += WS_DLGFRAME
      ENDCASE
   ENDIF
#endif

   ::oParent:addChild( Self )
Fonte parcial do wvgStatic da WVG.
Daria pra apagar quase tudo, e deixar o Style por conta do usuário.

Código: Selecionar todos

METHOD WvgStatic:setCaption( xCaption, cDll )

   HB_SYMBOL_UNUSED( cDll )

   __defaultNIL( @xCaption, ::caption )
   ::caption := xCaption

   DO CASE
   CASE ::type == WVGSTATIC_TYPE_TEXT
      wvg_SendMessageText( ::hWnd, WM_SETTEXT, 0, ::caption )

   CASE ::type == WVGSTATIC_TYPE_BITMAP
      IF ::hBitmap != nil
         wvg_DeleteObject( ::hBitmap )
      ENDIF

      ::hBitmap := wvg_LoadImage( ::caption, iif( HB_ISNUMERIC( ::caption ), 1, 2 ) )

      wvg_SendMessage( ::hWnd, STM_SETIMAGE, IMAGE_BITMAP, ::hBitmap )

   ENDCASE

   RETURN Self
Tá errado/incompleto aí.
Se tem a opção de ícone, porque só tem opção de carregar bitmap?
Bom.... tudo bem.... vai ser só copiar do button, e já adicionar resize.

Igual em qualquer LIB, o STATIC é uma coisa de uso geral, só pra apresentar texto ou imagem ou algum desenho.
O Style seleciona entre os desenhos pré-definidos: traço, quadrado, frame com título, ícone, bitmap, etc.
Talvez até ownerdraw pra desenhos adicionais não previstos no Windows.

Tá aí um controle que é extremamente simples, mas serve pra muita coisa.

E pois é.... até um simples traço na tela é uma janela adicional.
Isso é GUI.

GTWVG - Harbour 3.2

Enviado: 09 Mar 2023 19:52
por JoséQuintas
E quais são os Styles que podem ser usados no controle static?

https://learn.microsoft.com/en-us/windo ... rol-styles

O ruim é que aí não mostra o que pode ser combinado.
Combinar errado, o resultado pode ser qualquer coisa.

Então.... o que temos até agora:

- Tela estilo console
- Texto de qualquer tamanho/cor
- Desenhos pré definidos e imagens
- controles

Limitação 1: trocar GET por textbox é péssima opção, por causa do foco

Limitação 2: o uso do GET normal vai ser sempre a mesma fonte/tamanho, pelo menos vai ter resize automático

Limitação 3: não é exatamente uma limitação. o ideal vai ser usar janelas e esquecer aquilo de savescreen/restorescreen.
Ou então, hide() e show() para os controles GUI, se abrir janelas comuns estilo console.

GTWVG - Harbour 3.2

Enviado: 09 Mar 2023 20:03
por JoséQuintas
debug.png
É só lembrar daqui, a tela de debug.

É considerar que é tela GUI, mesmo parecendo console.

O normal, pra evitar trabalho extra, é abrir uma janela pra cada coisa.

Nessa mesma tela:

Opção 1: usar hide() e show(), pra esconder e mostrar esses buttons

Opção 2: o normal de GUI, abrir uma nova janela. Ela vai estar vazia sem esses buttons. Igual toda lib GUI faz.

Não vale CLS, SAVE SCREEN, RESTORE SCREEN, porque isso passou a ser GUI e não console.

E agora.... faltam idéias...
Vale pra qualquer LIB.
Com exceção da parte de GETs.... que na WVG melhor não fugir dos GETs.
E talvez isso também elimine a TABPAGE, porque ela também depende de foco.

GTWVG - Harbour 3.2

Enviado: 09 Mar 2023 20:46
por JoséQuintas
hb32.png
Só comentário do que estou usando.

É o Harbour 3.2 ORIGINAL.

Usando MINGW 7.3 SOMENTE 32 bits, NÃO SERVE AQUELA VERSÃO COM 32+64 bits juntos pra harbour 3.2

Essas duas alterações a mais foram enviadas para a versão oficial, mas uma aguarda há mais de um ano, outra aguarda menos.
- cor opcional diferente pras barras do tbrowse
- wvg_LoadImage() com os parâmetros pra resize da imagem sendo carregada

E removi a inclusão automática de arquivos CH em gtwvg.hbc
#headers=hbgtwvg.ch wvgparts.ch wvtwin.ch

Nada anormal, se o fonte precisa hbgtwvg.ch, precisa colocar no fonte #include "hbgtwvg.ch"
Incluir automático causa #define duplicado ao usar outras LIBs GUI ao mesmo tempo.

Pensando bem.... agora que passei a usar o Harbour 3.2, pode ficar mais fácil testar FIVEWIN.