Novo teste, tela de fundo
Enviado: 29 Mar 2023 15:02
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
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
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.
Antes de mostrar o último menu, faço a "mágica"
Desenhar, e restaurar as janelas de todos os menus
Antes de chamar um módulo, atualizo o último sub-menu
(pensando bem, acho que nem precisava, porque vai ser reescrito sempre)
E ao sair do sub-menu, tiro ele da lista
Deu certo, ao restaurar um pedaço da tela texto, apenas aquele pedaço perde o desenho
Parece até que são janelas....
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() ) }
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 } )
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 ) } )
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
(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 )
Código: Selecionar todos
aSize( aTelas, Len( aTelas ) - 1 )
Parece até que são janelas....