Página 1 de 1

Novo teste, tela de fundo

Enviado: 29 Mar 2023 15:02
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....

Novo teste, tela de fundo

Enviado: 29 Mar 2023 15:09
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.

Novo teste, tela de fundo

Enviado: 29 Mar 2023 15:11
por JoséQuintas
É só mais um de vários testes.
Vai ficar anotado no fonte.

Novo teste, tela de fundo

Enviado: 30 Mar 2023 11:24
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.

Novo teste, tela de fundo

Enviado: 30 Mar 2023 11:35
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.