Gtk_Main_Quit

Outras bibliotecas visuais e IDEs para Harbour/xHarbour (xHGTK/HbWxW/GtWvT/GtWvW/WvWtools.etc)

Moderador: Moderadores

jamazevedo
Usuário Nível 3
Usuário Nível 3
Mensagens: 122
Registrado em: 29 Dez 2005 16:50
Localização: Manaus - AM

Gtk_Main_Quit

Mensagem por jamazevedo »

Código: Selecionar todos

...
Gtk_Init()

oWindow := Gtk_Window_New( GTK_WINDOW_TOPLEVEL )

...
Gtk_Signal_Connect( oWindow    , "destroy"   , { || Gtk_Main_Quit() } )

Gtk_Signal_Connect( oCadastro  , "activate"  , { || Cadastro() } )

Gtk_Signal_Connect( oConsulta  , "activate"  , { || Consulta() } )

...
Gtk_Widget_Show_All( oWindow )

Gtk_Main()

No exemplo acima ao selecionar a opção "Cadastro" ou "Consulta" o controle do pragrama irá para uma das rotinas selecionadas. Nessa rotinas aparece o seguinte:

Código: Selecionar todos

...
Gtk_Init()

oWinCadastro := Gtk_Window_New( GTK_WINDOW_TOPLEVEL )

...
Gtk_Signal_Connect( oWinCadastro , "destroy" , { || Gtk_Main_Quit() } )

Gtk_Widget_Show_All( oWinCadastro )

Gtk_Main_Iteration()
                             // Ja testei com Gtk_Main() não entendi a diferença
Quando é fechada a janela atual (oWinCadastro) é fechada automaticamente a janela principal (oWindow). Como faço para fechar a janela atual (oWinCadastro) e retornar para janela anterior (oWindow).

Li e entendi em outro tópico que não deveria fechar a janela atual (oWinCadastro) e sim "escondela" e retornar para janela anterior (oWindow). Isso procede ?? E se procede, não seria melhor fechar uma janela que não esta sendo usada ao invés de escondê-la. ??
______________________________________________________
Usando: Linux Ubuntu 18.04, Harbour 3.2.0dev r1811161533
______________________________________________________
José Airton de Menezes Azevedo
Manaus - AM
marcosgambeta
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 16 Jun 2005 22:53

Re: Gtk_Main_Quit

Mensagem por marcosgambeta »

A função gtk_init serve para inicializar a gtk+. Use somente no início do programa (função main).

A função gtk_main inicia o "loop" de eventos. Neste ponto, torna-se possível interagir com os widgets e as ações definidas são acionadas conforme os eventos ocorrem. Chame esta função depois de criar a janela principal. Não é necessário chamá-la em outros pontos. Uma vez iniciado o loop, basta criar uma janela ou exibir uma já criada para ser possível interagir com ela.

Para destruir janelas filhas, use a função gtk_widget_destroy. Pode-se também torná-las invisíveis. Neste ponto, acho que convém analisar a estrutura do programa para decidir o que é melhor. Há desenvolvedores que preferem criar todas as janelas no início da aplicação e ir exibindo e escondendo as janelas conforme o uso. Vamos deixar este assunto pendente para discussão, pois é algo que tenho visto em outra linguagens também.

O exemplo abaixo demonstra a criação da janela principal e de 'n' janelas filhas.

Código: Selecionar todos

#include "gtk.ch"

Procedure Main()

   local pWindow
   local pVBox
   local pMenuBar
   local pMenuOpcoes
   local pOpcoes
   local pOpcaoNovaJanela

   // inicializa a gtk+
   Gtk_Init()
   // cria janela principal (main)
   pWindow := Gtk_Window_New( GTK_WINDOW_TOPLEVEL )
   Gtk_Widget_Set_Size_Request( pWindow , 640 , 480 )
   Gtk_Window_Set_Title( pWindow , "Janela MAIN" )
   Gtk_Window_Set_Position( pWindow , GTK_WIN_POS_CENTER )
   // cria menu
   pVBox := Gtk_VBox_New( .F. , 0 )
   Gtk_Container_Add( pWindow , pVBox )
   pMenuBar := Gtk_Menu_Bar_New()
   pMenuOpcoes := Gtk_Menu_New()
   pOpcoes := Gtk_Menu_Item_New_With_mnemonic( "_Opcoes" )
   pOpcaoNovaJanela := Gtk_Menu_Item_New_With_mnemonic( "_Nova janela" )
   Gtk_Menu_Item_Set_SubMenu( pOpcoes , pMenuOpcoes )
   Gtk_Menu_Shell_Append( pMenuOpcoes , pOpcaoNovaJanela )
   Gtk_Menu_Shell_Append( pMenuBar , pOpcoes )
   Gtk_Box_Pack_Start( pVBox , pMenuBar , .F. , .F. , 3 )
   // termina programa quando janela principal for destruida
   Gtk_Signal_Connect( pWindow , "destroy" , { || Gtk_Main_Quit() } )
   // chama rotina de criacao de janelas filhas (child)
   Gtk_Signal_Connect( pOpcaoNovaJanela , "activate" , { || Nova_Janela() } )
   // mostra janela principal
   Gtk_Widget_Show_All( pWindow )
   // inicia processamento dos eventos
   Gtk_Main()

Return

Function Nova_Janela ()

   Local pWindow
   Static nCount := 0

   ++nCount
   pWindow := Gtk_Window_New( GTK_WINDOW_TOPLEVEL )
   Gtk_Widget_Set_Size_Request( pWindow , 320 , 240 )
   Gtk_Window_Set_Title( pWindow , "Janela CHILD "+strzero(nCount,2) )
   //Gtk_Window_Set_Position( pWindow , GTK_WIN_POS_CENTER )
   Gtk_Signal_Connect( pWindow , "destroy" , { || Gtk_Widget_Destroy(pWindow) } )
   Gtk_Widget_Show_All( pWindow )

Return Nil
Atenciosamente,
Marcos Antonio Gambeta
jamazevedo
Usuário Nível 3
Usuário Nível 3
Mensagens: 122
Registrado em: 29 Dez 2005 16:50
Localização: Manaus - AM

Re: Gtk_Main_Quit

Mensagem por jamazevedo »

Funcionou apenas tive que fazer uma adaptação em vez de usar Gtk_Widget_Destroy( pWindow ) substitui por Gtk_Widget_Hide( pWindow ), pois a Gtk_Widget_Destroy( pWindow ) fecha o loop principal.

Só percebi um incoveniente, quando chamo a Nova_Janela() o é apresentada uma nova janela e gostaria que fosse mostrada na janela atual.
______________________________________________________
Usando: Linux Ubuntu 18.04, Harbour 3.2.0dev r1811161533
______________________________________________________
José Airton de Menezes Azevedo
Manaus - AM
marcosgambeta
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 16 Jun 2005 22:53

Re: Gtk_Main_Quit

Mensagem por marcosgambeta »

jamazevedo escreveu:Só percebi um incoveniente, quando chamo a Nova_Janela() o é apresentada uma nova janela e gostaria que fosse mostrada na janela atual.
Preparei um novo exemplo. Acho que este ilustrará melhor o que você deseja.

Código: Selecionar todos

#include "gtk.ch"

Procedure Main()

   local pWindow
   local pVBox
   local pMenuBar
   local pMenuOpcoes
   local pOpcoes
   local pOpcao1
   local pOpcao2
   local pOpcao3

   // inicializa a gtk+
   Gtk_Init()
   // cria janela principal (main)
   pWindow := Gtk_Window_New( GTK_WINDOW_TOPLEVEL )
   Gtk_Widget_Set_Size_Request( pWindow , 640 , 480 )
   Gtk_Window_Set_Title( pWindow , "Janela MAIN" )
   Gtk_Window_Set_Position( pWindow , GTK_WIN_POS_CENTER )
   // cria menu
   pVBox := Gtk_VBox_New( .F. , 0 )
   Gtk_Container_Add( pWindow , pVBox )
   pMenuBar := Gtk_Menu_Bar_New()
   pMenuOpcoes := Gtk_Menu_New()
   pOpcoes := Gtk_Menu_Item_New_With_mnemonic( "_Cadastros" )
   pOpcao1 := Gtk_Menu_Item_New_With_mnemonic( "_Clientes" )
   pOpcao2 := Gtk_Menu_Item_New_With_mnemonic( "_Produtos" )
   pOpcao3 := Gtk_Menu_Item_New_With_mnemonic( "_Servicos" )
   Gtk_Menu_Item_Set_SubMenu( pOpcoes , pMenuOpcoes )
   Gtk_Menu_Shell_Append( pMenuOpcoes , pOpcao1 )
   Gtk_Menu_Shell_Append( pMenuOpcoes , pOpcao2 )
   Gtk_Menu_Shell_Append( pMenuOpcoes , pOpcao3 )
   Gtk_Menu_Shell_Append( pMenuBar , pOpcoes )
   Gtk_Box_Pack_Start( pVBox , pMenuBar , .F. , .F. , 3 )
   // termina programa quando janela principal for destruida
   Gtk_Signal_Connect( pWindow , "destroy" , { || Gtk_Main_Quit() } )
   // conecta opções dos menu com funções
   Gtk_Signal_Connect( pOpcao1 , "activate" , { || Clientes() } )
   Gtk_Signal_Connect( pOpcao2 , "activate" , { || Produtos() } )
   Gtk_Signal_Connect( pOpcao3 , "activate" , { || Servicos() } )
   // mostra janela principal
   Gtk_Widget_Show_All( pWindow )
   // inicia processamento dos eventos
   Gtk_Main()

Return

Function Clientes ()

   Static pWindow

   if pWindow == Nil
      // cria janela
      pWindow := Gtk_Window_New( GTK_WINDOW_TOPLEVEL )
      Gtk_Widget_Set_Size_Request( pWindow , 320 , 240 )
      Gtk_Window_Set_Title( pWindow , "Clientes" )
      Gtk_Signal_Connect( pWindow , "delete-event" , { || Gtk_Widget_Hide_On_Delete(pWindow) } )
      Gtk_Widget_Show_All( pWindow )
   else
      // mostra janela
      Gtk_Window_Present(pWindow)
   endif

Return Nil

Function Produtos ()

   Static pWindow

   if pWindow == Nil
      // cria janela
      pWindow := Gtk_Window_New( GTK_WINDOW_TOPLEVEL )
      Gtk_Widget_Set_Size_Request( pWindow , 320 , 240 )
      Gtk_Window_Set_Title( pWindow , "Produtos" )
      Gtk_Signal_Connect( pWindow , "delete-event" , { || Gtk_Widget_Hide_On_Delete(pWindow) } )
      Gtk_Widget_Show_All( pWindow )
   else
      // mostra janela
      Gtk_Window_Present(pWindow)
   endif

Return Nil

Function Servicos ()

   Static pWindow

   if pWindow == Nil
      // cria janela
      pWindow := Gtk_Window_New( GTK_WINDOW_TOPLEVEL )
      Gtk_Widget_Set_Size_Request( pWindow , 320 , 240 )
      Gtk_Window_Set_Title( pWindow , "Servicos" )
      Gtk_Signal_Connect( pWindow , "delete-event" , { || Gtk_Widget_Hide_On_Delete(pWindow) } )
      Gtk_Widget_Show_All( pWindow )
   else
      // mostra janela
      Gtk_Window_Present(pWindow)
   endif

Return Nil
Cada uma das três rotinas (clientes, produtos e servicos) segue o mesmo procedimento: criam a janela caso não tenha sido criada ainda (pWindow=Nil) ou apresentam a janela (pWindow<>Nil).

Temos duas novas funções neste exemplo:

Gtk_Widget_Hide_On_Delete: conectada ao sinal "delete-event", esconde a janela (hide) quando o usuário tentar fechá-la. A janela continuará criada, mas invisível.

Gtk_Window_Present: apresenta a janela, quer ela esteja invisivel, minimizada ou escondida atrás de outra janela.
Atenciosamente,
Marcos Antonio Gambeta
jamazevedo
Usuário Nível 3
Usuário Nível 3
Mensagens: 122
Registrado em: 29 Dez 2005 16:50
Localização: Manaus - AM

Re: Gtk_Main_Quit

Mensagem por jamazevedo »

Ok. Muito obrigado!
______________________________________________________
Usando: Linux Ubuntu 18.04, Harbour 3.2.0dev r1811161533
______________________________________________________
José Airton de Menezes Azevedo
Manaus - AM
Responder