X da janela é um Evento?

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

Moderador: Moderadores

Maurício Elias
Usuário Nível 3
Usuário Nível 3
Mensagens: 304
Registrado em: 12 Mai 2005 08:48

X da janela é um Evento?

Mensagem por Maurício Elias »

Olá, boa tarde pessoal.
Tem como tratar o X da janela do Sistema (HB32 Console) um Evento e fazer com que ele execute o "Close Data" ao clicarem ?
Obrigado.
Abraços.
_______
Maurício
Avatar do usuário
zazibr
Usuário Nível 2
Usuário Nível 2
Mensagens: 72
Registrado em: 11 Set 2004 17:07
Localização: Campo Grande/MS

X da janela é um Evento?

Mensagem por zazibr »

se vc nao usa nenhum modo grafico gtwvw ou gtwvh nao vai conseguir tratar isso
Maurício Elias
Usuário Nível 3
Usuário Nível 3
Mensagens: 304
Registrado em: 12 Mai 2005 08:48

X da janela é um Evento?

Mensagem por Maurício Elias »

... é, ainda não uso não.
O jeito vai ser esperar a vez então !!!
Valew colega.
Abraços.
_______
Maurício
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

X da janela é um Evento?

Mensagem por bencz »

Bom, é possivel sim, como a idéa principal do windows é, ser sempre orientado a eventos... entao, é simplesmente possivel, e não é complexo de se fazer...
bastando conhecer algumas coisas basicas da API do windows teremos algumas funções como:

Código: Selecionar todos

HandlerRoutine

Código: Selecionar todos

SetConsoleCtrlHandler
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
http://msdn.microsoft.com/query/dev10.q ... 29&rd=true

Bastando implementar as funções, da forma correta no

Código: Selecionar todos

#pragma
do seu codigo em hb, e pronto, tudo vai funcionar como vc deseja!

http://www.codeproject.com/Articles/235 ... t-Handling

--------------------------------------------------
Veja este código de exemplo:

Código: Selecionar todos

#include <stdio.h>
#include <windows.h>

BOOL WINAPI closeHandler(DWORD Evento)
{
	switch (Evento)
	{
	case CTRL_CLOSE_EVENT:
		MessageBox(NULL, "Vc clicou no X", "Eba Oba!!", MB_OK);
		break;
	}
	return TRUE;
}

int main()
{
	int counter = 0;
	SetConsoleCtrlHandler(closeHandler, true);

	for (;;)
	{
		printf("oi %d\n", counter);
		counter++;
	}
}
--------------------------------------------------------------------------------------------------
Uma implementação aproximada no Harbour

Código: Selecionar todos

function start()
  CTRL_HANDLE_CONSOLE()
  
  for i:=1 to 1000000000
    ? "oi"
  next
return nil

#pragma BEGINDUMP

#include "hbapi.h"
#include <windows.h>

int WINAPI closeHandler(DWORD Evento)
{
	switch (Evento)
	{
	case CTRL_CLOSE_EVENT:
    MessageBox(NULL, "Vc clicou no X", "Eba Oba!!", MB_OK);
		return 0;
		break;
	}
	return 1;
}

HB_FUNC( CTRL_HANDLE_CONSOLE )
{
  SetConsoleCtrlHandler(closeHandler, 1);
}

#pragma ENDDUMP
Imagem
Maurício Elias
Usuário Nível 3
Usuário Nível 3
Mensagens: 304
Registrado em: 12 Mai 2005 08:48

X da janela é um Evento?

Mensagem por Maurício Elias »

Olá Bencz, boa tarde. Obrigado pela ajuda.
Estou saindo agora do Dosão, nunca tive contato com uma API. Olhei os Links, entendi que HandlerRoutine e SetConsoleCtrlHandler seriam 2 APIs, certo ?
#pragma ??? Não consegui entender.
BOOL WINAPI closeHandler () executa a API, é isso ?
Depois vem Int Main(). Seria meu Function Main ?
Vou tentar, mas sei não se dou conta... E tudo em inglês!
Valew...
Abraços.
_______
Maurício
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

X da janela é um Evento?

Mensagem por bencz »

andlerRoutine e SetConsoleCtrlHandler seriam 2 APIs, certo ?
Sim, eles pertencem a API( application programming interface ) do windows.
O comando #pragma permite que o programador diga ao compilador para fazer certas coisas. Uma vez que o comando #pragma é específico da implementação, os seus usos variam de compilador para compilador. Uma opção possível é traçar a execução do programa.
http://pt.cppreference.com/w/cpp/preprocessor/pragma
No caso, utilizo o comando de pre-processamento, #pragma, para dizer ao compilador que daquele ponto, #pragma begindump até o #pragma enddump vai ser código nativo C
BOOL WINAPI closeHandler () executa a API, é isso ?
está é uma função que é executada a cada evento que ocorrer no console, eu poderia ter dado qualquer nome a ela...
Depois vem Int Main(). Seria meu Function Main ?
Sim, essa é a entrada do programa.
Imagem
Maurício Elias
Usuário Nível 3
Usuário Nível 3
Mensagens: 304
Registrado em: 12 Mai 2005 08:48

X da janela é um Evento?

Mensagem por Maurício Elias »

Cara, que loucura, C nativo no HB32 ???
Vou tentar implementar a noite.
Mas em qual linha é acionada qual função no Clique do X do Windows?
Abraços.
_______
Maurício
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

X da janela é um Evento?

Mensagem por bencz »

Utilizar C com Hb não é nada de mais, pois o processo de compilação do harbour, simplesmente converte o seu código xBase em C, e depois chama um compilador em C para compilar o código gerado pelo compilador Harbour.
Mas em qual linha é acionada qual função no Clique do X do Windows?
Neste trecho do código, dentro do case...

Código: Selecionar todos

04	BOOL WINAPI closeHandler(DWORD Evento)
05	{
06	   switch (Evento)
07	   {
08	   case CTRL_CLOSE_EVENT:
09	      MessageBox(NULL, "Vc clicou no X", "Eba Oba!!", MB_OK);
10	      break;
11	   }
12	   return TRUE;
13	}
Imagem
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

X da janela é um Evento?

Mensagem por cjp »

Que excelente solução. Meus parabéns.

Faço duas perguntas:

1) É possível também impedir o fechamento no X? Sei de função que desabilita o X da janela, mas ela não impede que o usuário clique na opção de fechar a janela na própria barra de tarefas.

2) Tem como executar uma função normal do Harbour de dentro da função C compilada junto? Estou tentando simplesmente chamar a função assim: minha_função(), mas dá erro na compilação
Inacio de Carvalho Neto
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

X da janela é um Evento?

Mensagem por bencz »

1) É possível também impedir o fechamento no X? Sei de função que desabilita o X da janela, mas ela não impede que o usuário clique na opção de fechar a janela na própria barra de tarefas.
Até onde eu saiba, não tem como....
2) Tem como executar uma função normal do Harbour de dentro da função C compilada junto? Estou tentando simplesmente chamar a função assim: minha_função(), mas dá erro na compilação
Tem sim, é muito simples, veja o anexo.
Anexos
Desktop.zip
(733 Bytes) Baixado 118 vezes
Imagem
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

X da janela é um Evento?

Mensagem por Nascimento »

amiguinho a pergunta

1º se for em modo console faz facilmente com a gtwvt
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

X da janela é um Evento?

Mensagem por bencz »

para esclarecer melhor...
Veja o código abaixo...

Código: Selecionar todos

function start()
  CTRL_HANDLE_CONSOLE()
  
  inkey(10)
  
  for i:=1 to 1000000000
    ? "oi"
  next
return nil

function minha_funcao()
  QOut("Ola mundo, da minha funcao")
return nil

#pragma BEGINDUMP

#include "hbapi.h"
#include "hbinit.h"
#include "hbvm.h"
#include <windows.h>

HB_FUNC_EXTERN( MINHA_FUNCAO );  // define como função externa

int WINAPI closeHandler(DWORD Evento)
{
	switch (Evento)
	{
	case CTRL_CLOSE_EVENT:
    MessageBox(NULL, "Vc clicou no X", "Eba Oba!!", MB_OK);
		return 0;
	}
	return 1;
}

HB_FUNC( CTRL_HANDLE_CONSOLE )
{
  HB_FUNC_EXEC( MINHA_FUNCAO );   // chamada da função HARBOUR
  SetConsoleCtrlHandler(closeHandler, 1);
}

#pragma ENDDUMP
Imagem
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

X da janela é um Evento?

Mensagem por cjp »

Bencz, salvo se eu estiver fazendo algo errado, creio que não funcionou como eu imaginava. Ele está executando a minha_funcao no início do programa, mas não quando clico no X.

Josivan, sim, eu uso apenas modo console. Como fazer isso com gtwvt?
Inacio de Carvalho Neto
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

X da janela é um Evento?

Mensagem por Nascimento »

Fiz um mini exemplo mais da pra vc entender
segue o codigo abaixo

Código: Selecionar todos

/* 
TESTE DE USO SIMPLES DE ATIVAR OU DESATIVAR O X DA JANELA
COMPILAR COM HBMK2 DEMO.PRG -GUI -GTWVT
*/

#include 'inkey.ch'
#include 'hbgtinfo.ch'


function main()

hb_gtInfo( HB_GTI_CLOSABLE,.f.) // inibe o fechamento no X da janela
setcursor(0)
cls
?'TESTE PARA FECHAMENTO DE JANELA'
while .t.

 tk:= inkey(0,128 + HB_INKEY_GTEVENT) 
  
  if (lastkey() == HB_K_CLOSE)
    if alert('Deseja fechar o sistema ? ',{'Sim','Nao'}) == 1
      exit
    endif
  endif
end   
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

X da janela é um Evento?

Mensagem por bencz »

vc está fazendo errado, preste mais atenção no meu código...., veja o meu exemplo...

Código: Selecionar todos

#include "inkey.ch"

function main()
  CTRL_HANDLE_CONSOLE()
  
  IF FILE("cliente.dbf") == .F.
    aDB := { { "Codigo", "N", 3, 0 }, { "Nome", "C", 50, 0 } }
    DbCreate( "clientes", aDB )
  ENDIF
  
  USE Clientes EXCLUSIVE NEW
  
  while .t.
    tk := inkey(0,INKEY_ALL)
    if tk==27 .and. nextkey()==0
        minha_funcao()
    endif
  end
return nil

function minha_funcao()
  ? "Fechando tudoooo!!!"
  CLOSE ALL
  QUIT
return nil

#pragma BEGINDUMP

#include "hbapi.h"
#include "hbinit.h"
#include "hbvm.h"
#include <windows.h>

HB_FUNC_EXTERN( MINHA_FUNCAO );  // define como função externa

int WINAPI closeHandler(DWORD Evento)
{
	switch (Evento)
	{
	case CTRL_CLOSE_EVENT:
    MessageBox(NULL, "Vc clicou no X", "Eba Oba!!", MB_OK);
    HB_FUNC_EXEC( MINHA_FUNCAO );   // chamada da função HARBOUR
		return 0;
	}
	return 1;
}

HB_FUNC( CTRL_HANDLE_CONSOLE )
{
  SetConsoleCtrlHandler(closeHandler, 1);
}

#pragma ENDDUMP
Imagem
Responder