Novo teste, tela de fundo

GTWVG com API Windows somente no Harbour.
No Harbouir 3.4 está sendo usado pointer, aonde no 3.2 é numérico.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Novo teste, tela de fundo

Mensagem por JoséQuintas »

tela.png
Melhorei um pouco, comparado à outra vez.
O problema era: ao retornar para o menu, perdia a imagem.

Mas é um menu chamando sub-menu, que pode chamar sub-menus, que depois chama o módulo.
Save Screen/Restore Screen não salva parte gráfica, janela Windows só redesenhando.

Situação anterior:
- Redesenhando tela, perdia-se o texto
- Restaurando texto, perdia-se o desenho, e faltava redesenhar (A rotina Paint() que quem mexe com GUI conhece).
Esse é o comportamento normal da GT.
O desenho entra como imagem de fundo, e apaga o texto da GT.
O harbour mostra o texto da GT como imagem de fundo, o que apaga a imagem do desenho.

O que GUI faz ? redesenha tudo.
O primeiro pensamento foi modificar as rotinas pra desenhar cada um dos menus e também os de nível anterior.
Muito complicado... muito trabalho pra pouca coisa....

Mas veio uma luz, algo relativamente simples.
O que GUI faz ? usa JANELAS !!!
Quais janelas existem aí: a do menu horizontal, e a de cada menu vertical.

etapa 1: salvar janela do menu horizontal ATUALIZADO
Acrescentei a última linha

Código: Selecionar todos

   DO WHILE .T.
      SetColor( SetColorNormal() )
      Scroll( 1, 0, 1, MaxCol(), 0 )
      FOR mCont = 1 TO Len( mMenuOpt )
         @ 1, mColIni[ mCont ] SAY mMenuOpt[ mCont, 1 ] COLOR iif( mCont == mOpc, SetColorFocus(), SetColorNormal() )
      NEXT
      aTela := { 1, 0, 1, MaxCol(), SaveScreen( 1, 0, 1, MaxCol() ) }
Minha função de menu vertical é recursiva
Passei uma lista de telas, contendo esse menu horizontal
Acrescentei o último parâmetro, que de início vai receber apenas o menu horizontal

Código: Selecionar todos

      BoxMenu( 3, mColIni[ mOpc ] - 20 + Int( Len( mMenuOpt[ mOpc, 1 ] ) / 2 ), mMenuOpt[ mOpc, 2 ], @mMenuOpt[ mOpc, 5 ], mMenuOpt[ mOpc, 1 ], .T., .T., aMouseMenu, 1, 1, { aTela } )
Mais como tapa-buraco, adiciono a tela vazia do menu vertical atual.
Se fosse fazer análise de tamanho, acrescentar vazio, testar se tá vazio, etc, ia ser muito fonte, mais simples adicionar um elemento inútil.

Código: Selecionar todos

   AAdd( aTelas, { mLini, mColi, mLini + nHeight - 1, mColi + nWidth - 1, SaveScreen( mLini, mColi, mLini + nHeight - 1, mColi + nWidth - 1 ) } )
Antes de mostrar o último menu, faço a "mágica"
Desenhar, e restaurar as janelas de todos os menus

Código: Selecionar todos

   DO WHILE .T.
   wvt_DrawImage( 2, 0, MaxRow() - 3, MaxCol(), "d:\temp\rio.jpg" )
   FOR EACH aTela IN aTelas
      RestScreen( aTela[1], aTela[2], aTela[3], aTela[4], aTela[5] )
   NEXT
      FOR EACH oElement IN mMenuOpt
Antes de chamar um módulo, atualizo o último sub-menu
(pensando bem, acho que nem precisava, porque vai ser reescrito sempre)

Código: Selecionar todos

      Atail( aTelas )[ 5 ] := SaveScreen( mLini, mColi, mLini + nHeight - 1, mColi + nWidth - 1 )
E ao sair do sub-menu, tiro ele da lista

Código: Selecionar todos

   aSize( aTelas, Len( aTelas ) - 1 )
Deu certo, ao restaurar um pedaço da tela texto, apenas aquele pedaço perde o desenho
Parece até que são janelas....
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Novo teste, tela de fundo

Mensagem por JoséQuintas »

tela2.png
Pensei que ia dar pra remover o que salva antes do módulo, já que ele é redesenhado.....
mas não dá, porque só no último da fila é que isso funciona, os anteriores ficaram em branco.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Novo teste, tela de fundo

Mensagem por JoséQuintas »

É só mais um de vários testes.
Vai ficar anotado no fonte.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Novo teste, tela de fundo

Mensagem por JoséQuintas »

Esse exemplo é muuuuito interessante....

Talvez dê pra criar um controle Windows pra isso, pra usar em GTWVG ou HWGUI ou HMG.

1) Usando controle Windows:

Pode ser em qualquer GUI, pode ser GTWVG, HWGUI, HMG
O ruim é que um controle precisa saber sobre o outro.

2) Rotina pra desenhar diretamente na tela:

Pode ser em qualquer GUI, pode ser GTWVG, HWGUI, HMG
Vai usar o ON KEY DOWN da janela (ou algo parecido)

3) Rotina tradicional console

Esse é o que postei, só GTWVG mesmo, ou outra equivalente.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Novo teste, tela de fundo

Mensagem por JoséQuintas »

Supondo que seja controle GUI:

Todos os menus vão precisar conhecer as janelas "filhas", pra destruir e criar conforme se clica nas opções.
Isso em GUI é comum
A única coisa que pode ser considerada "não comum", é que as janelas filhas não ficam dentro da janela mãe.

Mas talvez fique até mais fácil de programar do que em DOS/Console

Também vai fugir à regra outra coisa: lembrar da opção anterior de cada menu/janela
Isso seria a diferença entre o menu que já existe no windows e esse.
E esse seria o motivo de criar alguma coisa nova pra menu, porque o do Windows NÃO faz isso, e é por isso que não gosto dele.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder