mensagens subindo e descendo

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

mensagens subindo e descendo

Mensagem por Abel »

ola pessoal,

alguem tem alguma ideia de como fazer uma mensagem box , subir e descer da tela.
igual aquelas que agora viraram moda nos antivirus...

o problema maior talvez seja porque trabalho no modo console ainda, mas de repente faço alguma adaptacao, utilizo harbour 3.1.0dev

tentei gerar o box fora do campo visual da tela, e usar savescreen restscreen para arrastar ela, mas nao funcionou porque ela foi gerada fora da area da tela.

Abel
yugi386
Usuário Nível 2
Usuário Nível 2
Mensagens: 82
Registrado em: 24 Jul 2008 10:36
Localização: Minas Gerais

mensagens subindo e descendo

Mensagem por yugi386 »

Saudações!

Prezado Abel,

No modo console acho que você vai ter que seguir os seguintes passos:

- Salve a tela toda com savescreen()
- Crie o box numa área visivel da tela com coordenadas l1,c1,l2,c2
- Verifique a diferença entre as coordenadas difcol = c2 - c1 e diflin = l2 - l1
- Agora você tem que fazer uma rotina para alterar o valor de l1 e c1 e calcular os valores de l2 e c2 somando aos primeiros os valores de difcol e diflin
- Cada vez que estes valores forem calculados você deve restaurar a tela com restscreen() e em seguida recriar o box com as novas coordenadas.
- É necessário criar algumas regras como não permitir que l1 + diflin exceda o limite da tela, da mesma forma que c1 + difcol também não exceda o limite da tela.
- As linhas podem ser incrementadas por unidades (+1) até que os limites sejam atingidos onde serão incrementados em inverso por (-1).
- As colunas podem ter a mesma caracerística dependendo do efeito visual que você quer.
- Para utilizar este recurso numa parada tela (prompt, get, wait, etc) é necessário uma Thread.
- Para que funcione a Thread você deve compilar o programa com hbmk2 -mt para que funcione.

Espero ter ajudado.

[]s

Yugi
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

mensagens subindo e descendo

Mensagem por Toledo »

Amigos, recentemente o Alexandre (asimoes) postou um código sobre Marquee (clique aqui para ver o tópico), que com algumas alterações pode fazer o que o Abel quer.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
yugi386
Usuário Nível 2
Usuário Nível 2
Mensagens: 82
Registrado em: 24 Jul 2008 10:36
Localização: Minas Gerais

mensagens subindo e descendo

Mensagem por yugi386 »

Abel, segue código que pode lhe ajudar:

Código: Selecionar todos

#include 'inkey.ch'

Function Main()
    local salvatela, l1, l2, c1, c2, diflin, difcol, mcol, mlin, mudalin, mudacol

    REQUEST HB_LANG_PT
	REQUEST HB_CODEPAGE_UTF8EX
	HB_LANGSELECT( 'PT' )
	HB_CDPSELECT( "UTF8EX" )	

	set date french
	set century on
	set scoreboard off
	set cursor off
    setmode(25,80)

    set color to W+/B
    cls
    set color to W+/R
    @ 00,00 clear to 00,79
    @ 00, 01 say "ESC = SAIR"

    save screen to salvatela
    l1 = 1
    l2 = 6
    c1 = 10
    c2 = 35
    diflin = l2 -l1
    difcol = c2 - c1
    mcol = 79
    mlin = 23
    mudalin = 1
    mudacol = 1

    keyboard chr(13)
    do while.t.
        restore screen from salvatela

        l1 = l1 + mudalin
        l2 = l1 + diflin
        c1 = c1 + mudacol
        c2 = c1 + difcol

        if l2 > mlin
            l1 = mlin - diflin
            mudalin = -1
            loop
        endif
        if l1 < 1
           l1 = 1
           mudalin = 1      
           loop
        endif

        if c2 > mcol
            c1 = mcol - difcol
            mudacol = -1
            loop
        endif
        if c1 < 1
           c1 = 1
           mudacol = 1      
           loop
        endif

        l2 = l1 + diflin
        c2 = c1 + difcol

        ylib_Msg("Testando BOX",l1,c1,l2,c2,"W+/G","N/W",1,"Janela para verificar o efeito de deslocamento de um box!")

        letra := inkey(0.25)

        if letra == 27
            exit
        endif
    enddo    
    set color to 
    cls

return NIL

/** 
--------------------------------------------------------------------------------------------------------------------
Descrição:
Criar Janela Genérica com controle de cor, posição, cor do título e sombra com 4 posições
Parâmetros:
1. mTitulo....: Titulo da janela
2. l1.........: Linha inicial da janela
3. c1.........: Coluna inicial da janela
4. l2.........: Linha final da janela
5. c2.........: Coluna final da janela
6. corTitulo..: Cor do Título da janela (Frente e Fundo)
7. corJanela..: Cor da janela (Frente e Fundo)
8. tipoSombra.: pode ser 1, 2, 3, 4, respectivamente, sombra na posição inferior esquerdo, inferior direito, superior esquerdo e superior direito
--------------------------------------------------------------------------------------------------------------------
*/
function ylib_janela(mTitulo,l1,c1,l2,c2,corTitulo,corJanela,tipoSombra)
	
	if corTitulo == NIL
		corTitulo = "W/B"
	endif

	if corJanela == NIL
		corJanela = "N/W"
	endif

	// Posicionamento da sombra da Janela
	setcolor("N/N+")
	do case
		case tipoSombra == 1	// inferior esquerdo
			ylib_Sombra(l1+1,c1-1,l2+1,c2-1)
		case tipoSombra == 2	// inferior direito
			ylib_Sombra(l1+1,c1+1,l2+1,c2+1)
		case tipoSombra == 3	// superior esquerdo
			ylib_Sombra(l1-1,c1-1,l2-1,c2-1)
		case tipoSombra == 4	// superior direito
			ylib_Sombra(l1-1,c1+1,l2-1,c2+1)
		otherwise
			ylib_Sombra(l1+1,c1-1,l2+1,c2-1) // Padrão inferior esquerdo
	endcase

	// Posicionamento da Janela e Título
	setcolor(corJanela)		
	@ l1,c1 clear to l2,c2
	setcolor(corTitulo)		
	@ l1,c1 clear to l1,c2
	@ l1,c1+1 say mTitulo

return nil

/** 
--------------------------------------------------------------------------------------------------------------------
Descrição:
Sombra Real na tela
Parâmetros:
01. l1...: Linha inicial
02. c1...: Coluna Inicial
03. l2...: Linha final
04. c2...: Coluna final
---------------------------------------------------------------------------------------------------------------------
*/
function ylib_Sombra(l1,c1,l2,c2)
	local ret := "", ct:= 0, tela, coluna:=c1, linha:=l1, cor, tam:=0, acumula := ""
	
	tela :=savescreen(l1,c1,l2,c2)
	
	cor := setcolor()
	setcolor("N+/N")
    tela := hb_utf8tostr(tela)    
	tam := len(tela)

	for ct:= 1 to tam step 4
		@ linha,coluna say substr(tela,ct,1)

		++ coluna
		if coluna > c2
			coluna = c1
			++ linha
		endif

		if linha > l2
			exit
		endif

	next
	setcolor(cor)

return nil

/** 
--------------------------------------------------------------------------------------------------------------------
Descrição:
Tela Para Mensagem
Parâmetros:
01. mTitulo....: Titulo da Janela
02. l1.........: Linha inicial da janela
03. c1.........: Coluna inicial da janela
04. l2.........: Linha final da janela
05. c2.........: Coluna final da janela
06. corTitulo..: Cor do Título da janela (Frente e Fundo)
07. corJanela..: Cor da janela (Frente e Fundo)
08. tipoSombra.: pode ser 1, 2, 3, 4, respectivamente, sombra na posição inferior esquerdo, inferior direito, superior esquerdo e superior direito
09. Mensagem...: Mensagem de Erro ou aviso
--------------------------------------------------------------------------------------------------------------------
*/
function ylib_Msg(mTitulo,l1,c1,l2,c2,corTitulo,corJanela,tipoSombra,mensagem)

	set cursor off
	ylib_janela(mTitulo,l1,c1,l2,c2,corTitulo,corJanela,tipoSombra)
	setcolor(corJanela)
	keyboard chr(27)
	memoedit(mensagem,l1+2,c1+1,l2-1,c2-1,.F.) 

return nil
[]s
Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

mensagens subindo e descendo

Mensagem por Abel »

ola, pessoal.

pelo que entendi estas rotinas vao exibir o box com a mensagem e movimenta-lo pela tela ate a posicao desejada., mas o que eu queria é que o box tivesse o efeito de entrar na tela pela lateral ou pela parte de baixo e nao exibi-lo e movimenta-lo.

desde ja agradeço as sugestoes e vou analisar melhor, se alguem tiver outra ideia ou eu estiver enganado me avise por favor.

Abracos,
ABEL
yugi386
Usuário Nível 2
Usuário Nível 2
Mensagens: 82
Registrado em: 24 Jul 2008 10:36
Localização: Minas Gerais

mensagens subindo e descendo

Mensagem por yugi386 »

Bem, talvez seja isto que você está querendo: O box aparece na lateral esquerda da tela e corre até o centro. Eis o código:

Código: Selecionar todos

#include 'inkey.ch'

Function Main()
    local salvatela, l1, l2, c1, c2, diflin, difcol, mcol, mlin, mudalin, mudacol, pBox := {}

    REQUEST HB_LANG_PT
	REQUEST HB_CODEPAGE_UTF8EX
	HB_LANGSELECT( 'PT' )
	HB_CDPSELECT( "UTF8EX" )	

	set date french
	set century on
	set scoreboard off
	set cursor off
    setmode(25,80)

    set color to W+/GR
    cls

    set color to W+/R
    @ 00,00 clear to 00,79
    @ 00, 01 say "ESC = SAIR"

    save screen to salvatela

    l1 = 6	// linha inicial do box
    l2 = 11  // linha final do box
    c1 = 0	// coluna inicial do box	
    c2 = 25   // coluna final do box	
    difcol = c2 - c1
    mcol = 79	// coluna final da tela
    mfim = int((80-difcol)/2)	// coluna de parada do box	
	mlin = l2 - l1
	l1 = int((25 - mlin)/2)
	l2 = l1 + mlin
	pausa := 0.02

	// aqui temos o box com a mensagem...
	ylib_Msg("Testando BOX",l1,c1,l2,c2,"W+/G","N/W",1,"Janela para verificar o efeito de deslocamento de um box!")

	for ct:= c1 to c2
		aadd(pbox,savescreen(l1,ct,l2,c2))
	next

	tam := len(pbox)
	posic := array(tam)
	for ct:= tam to 1 step - 1
		aadd(posic,pbox[ct])
	next

	c1 = c1 - difcol

    do while.t.
        restore screen from salvatela

		if (c1%2)<> 0
			if (c1 >= 0)
				restscreen(l1,c1,l2,c2,pbox[1])
			else
				restscreen(l1,0,l2,c2,pbox[tam-c2])
			endif
		endif

        c1 = c1 + 1
        c2 = c1 + difcol

		if c1 == mfim	// fim do processamento...
			exit
		endif

		if c1%2==0	
	        inkey(pausa)
		endif

    enddo   
	restscreen(l1,c1,l2,c2,pbox[1])
	inkey(0) 
    set color to 
    cls

return NIL

/** 
--------------------------------------------------------------------------------------------------------------------
Descrição:
Criar Janela Genérica com controle de cor, posição, cor do título e sombra com 4 posições
Parâmetros:
1. mTitulo....: Titulo da janela
2. l1.........: Linha inicial da janela
3. c1.........: Coluna inicial da janela
4. l2.........: Linha final da janela
5. c2.........: Coluna final da janela
6. corTitulo..: Cor do Título da janela (Frente e Fundo)
7. corJanela..: Cor da janela (Frente e Fundo)
8. tipoSombra.: pode ser 1, 2, 3, 4, respectivamente, sombra na posição inferior esquerdo, inferior direito, superior esquerdo e superior direito
--------------------------------------------------------------------------------------------------------------------
*/
function ylib_janela(mTitulo,l1,c1,l2,c2,corTitulo,corJanela,tipoSombra)
	
	if corTitulo == NIL
		corTitulo = "W/B"
	endif

	if corJanela == NIL
		corJanela = "N/W"
	endif

	// Posicionamento da Janela e Título
	setcolor(corJanela)		
	@ l1,c1 clear to l2,c2
	setcolor(corTitulo)		
	@ l1,c1 clear to l1,c2
	@ l1,c1+1 say mTitulo

return nil

/** 
--------------------------------------------------------------------------------------------------------------------
Descrição:
Tela Para Mensagem
Parâmetros:
01. mTitulo....: Titulo da Janela
02. l1.........: Linha inicial da janela
03. c1.........: Coluna inicial da janela
04. l2.........: Linha final da janela
05. c2.........: Coluna final da janela
06. corTitulo..: Cor do Título da janela (Frente e Fundo)
07. corJanela..: Cor da janela (Frente e Fundo)
08. tipoSombra.: pode ser 1, 2, 3, 4, respectivamente, sombra na posição inferior esquerdo, inferior direito, superior esquerdo e superior direito
09. Mensagem...: Mensagem de Erro ou aviso
--------------------------------------------------------------------------------------------------------------------
*/
function ylib_Msg(mTitulo,l1,c1,l2,c2,corTitulo,corJanela,tipoSombra,mensagem)

	set cursor off
	ylib_janela(mTitulo,l1,c1,l2,c2,corTitulo,corJanela,tipoSombra)
	setcolor(corJanela)
	keyboard chr(27)
	memoedit(mensagem,l1+2,c1+1,l2-1,c2-1,.F.) 

return nil
[]s

Yugi
Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

mensagens subindo e descendo

Mensagem por Abel »

Ola,
Entendi agora o que voce fez,
vc exibiu o box na tela, salvou, apagou, e movimentou.

o que eu nao queria era este efeito de piscada que ficou, tentei gerar o box fora da area de visualizacao da tela, mas nao funcionou.

Abel
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

mensagens subindo e descendo

Mensagem por asimoes »

Mensagem subindo e descendo com box.

Código: Selecionar todos

           @ 00,00 to 04,10 
           @ 02,01 say PADC("BOX",9)
           K:=0
           nLin:=1
           lTop:=.T.
           DO WHILE K = 0
              Scroll(00,00,24,10,IF(lTop,-1,1))
              IF lTop
                 nLin++
              ELSE
                 nLin--
              ENDIF
              IF nLin = 21
                 lTop:=.F.
              ENDIF   
              IF nLin = 1
                 lTop:=.T.
              ENDIF   
              k:=inkey(.5)
           ENDDO
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

mensagens subindo e descendo

Mensagem por Abel »

asimoes, executei seu codigo, mas ainda nao é isso que eu queria.

vamos ver se posso explicar melhor, queria o mesmo efeito do box que o avast exibe no canto inferior direito, o box aparece de baixo para cima do nada, como se ele "entrasse" na tela.

pelo que percebi acho q isso nao é possivel, pois para movimentar o box preciso exibi-lo antes em alguma coordenada da tela.

se tiver alguma idéia, me avise.
Abracos, e agradeço desde já.

Abel
Avatar do usuário
Nascimento
Usuário Nível 4
Usuário Nível 4
Mensagens: 763
Registrado em: 19 Jul 2008 12:11
Localização: OLINDA-PE

mensagens subindo e descendo

Mensagem por Nascimento »

eu acho que vc quer um efeito que tem no livro do ramalho 111 funçoes clipper
tem mais ou menos uma coisa assim
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

mensagens subindo e descendo

Mensagem por asimoes »

Abel,

Agora sim entendi o efeito que você quer.

Este efeito você acha na minigui:

D:\Minigui\SAMPLES\Advanced\TaskBarNotifier
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Adalberto
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 01 Set 2007 01:09
Localização: Santa Cruz de la Sierra - Bolivia

mensagens subindo e descendo

Mensagem por Adalberto »

Abel, buenas noches.

Sólo con ánimo de ayudar, te entrego este código en clipper puro e duro, espero que te sirva.

Código: Selecionar todos

FUNCTION MAIN()
acMat:= ''; acVector:= {}; cRayaFin:= ''
cTxt01:= cTxt02:= cTxt03:= cTxt04:= cTxt05:= cTxt06:= cTxt07:= cTxt08:= cTxt09:= ''
nLen:= Llenar('Esta es una demostraci¢n;de un cuadro con mensaje;que aparece de un lateral;Y AYUDAR A UN AMIGO')
FOR nJ:= 1 TO nLen
	cJ:= STRZERO(nJ, 2, 0)
	FOR nI:= 1 TO (LEN(acVector) + 2)
		cI:= STRZERO(nI, 2, 0)
		@ nI,1 SAY RIGHT(cTxt&cI., nJ)
	NEXT nI
	INKEY(.02)
NEXT nJ
INKEY(0)
RETURN NIL
//
STATIC FUNCTION Llenar(cTxt)
WHILE .T.
	nPos:= AT(';', cTxt)
	IF EMPTY(nPos)
		EXIT
	ENDIF
	AADD(acVector, LEFT(cTxt, (nPos - 1)))
	cTxt:= SUBS(cTxt, (nPos + 1))
ENDDO
AADD(acVector, cTxt)
cTxt:= acVector[1]
FOR nI:= 1 TO LEN(acVector)
	IF (LEN(acVector[nI]) > LEN(cTxt))
		cTxt:= acVector[nI]
	ENDIF
NEXT nI
FOR nI:= 1 TO LEN(acVector)
	cI:= STRZERO(nI+1, 2, 0)
	nLen:= LEN(acVector[nI])
	nMitad1:= ROUND(((LEN(cTxt) - nLen) / 2), 0)
	nMitad2:= ((LEN(cTxt) - nLen) - nMitad1)
	cTxt&cI:= ('³' + SPACE(nMitad1) + acVector[nI] + SPACE(nMitad2) + '³')
NEXT nI
cI:= STRZERO((VAL(cI) + 1), 2, 0)
cTxt01:= ('Ú' + REPL('Ä', LEN(cTxt)) + '¿')
cTxt&cI.:= ('À' + REPL('Ä', LEN(cTxt)) + 'Ù')
RETURN(LEN(cTxt)+2)
Saludos, desde Santa Cruz de la Sierra - Bolivia.

[ ] Adalberto
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

mensagens subindo e descendo

Mensagem por asimoes »

Acho que é isso que você quer.
Anexos
taskbar.zip
Exemplo de notificação taskbar
(554.1 KiB) Baixado 123 vezes
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

mensagens subindo e descendo

Mensagem por Abel »

asimoes, tentei baixar taskbar.zip , mas esta dando como corrompido.

Abraços,
Abel
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

mensagens subindo e descendo

Mensagem por asimoes »

Abel

Eu baixei o anexo sem problemas.

Pergunto para quem já baixou, teve problemas.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Responder