Janela sempre visível

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Janela sempre visível

Mensagem por Pablo César »

Decidí disponibilizar este exemplo feito em HMG para janelas que não permitem sair do focus dela. Talvez exista uma forma melhor, mas esta foi a que eu achei e funciona !Eis o código (reditado):

Código: Selecionar todos

#include "minigui.ch"

Function Main ()
   DEFINE WINDOW Form_1 ;
      AT 0,0 ;
      WIDTH 320 ;
      HEIGHT 240 ;
      TITLE "Janela sempre visível" ;
      MAIN ;
	  TOPMOST ;
	  NOMINIMIZE NOMAXIMIZE NOSIZE;
	  ON INTERACTIVECLOSE NAO_SAI();
	  ON LOSTFOCUS NAO_PERDE_FOCO()
	  
	  @ 10,10 TEXTBOX Text_1 VALUE ""       
 	  
	  DEFINE BUTTON Button_1
		ROW	148
		COL	140
		CAPTION '&Sair'
		WIDTH	74
		HEIGHT  23
		ACTION  ThisWindow.Release
		FONTNAME 'MS Sans Serif'
		FONTSIZE 9
	  END BUTTON

   END WINDOW
   CENTER WINDOW Form_1
   ACTIVATE WINDOW Form_1
Return Nil

Function NAO_SAI()
PlayAsterisk()
// MsgInfo("Não pode sair clicando no X")
Return .F.

Function NAO_PERDE_FOCO()
PlayAsterisk()
hWnd := FindWindow( "Janela sempre visível" )
Minimize( hWnd )
IF hWnd > 0
   IF IsIconic( hWnd )
      Restore( hWnd )
   ELSE
   	  SetForeGroundWindow( hWnd )
   ENDIF
ENDIF
SetCursorPos( 15+Form_1.Col+GetBorderWidth(), 20+Form_1.Row+GetTitleHeight()+GetBorderHeight() )
PressMouse(.t.)
Return .F.

#pragma BEGINDUMP

#define HB_OS_WIN_USED
#define _WIN32_WINNT 0x0400

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

HB_FUNC( ISICONIC )
{
   hb_retl( IsIconic( ( HWND ) hb_parnl( 1 ) ) );
}

HB_FUNC ( FINDWINDOW )
{
   hb_retnl( ( LONG ) FindWindow( 0, hb_parc( 1 ) ) );
}

HB_FUNC( PRESSMOUSE )
/* 
Simula pressionamento dos botäes do mouse:
                                          .T. - Esquerdo
                                          .F. - Direito
*/ 
{ 
if ( hb_parl(1) )
   {
       mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) ;
       mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) ;
   }
else
   {
       mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0) ;
       mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0) ;
   }
}

#pragma ENDDUMP
Anexei o executável para que você veja o resultado na prática.

Fiz uma jogada um tanto pouco ortodoxa... rsrsrs mas que deu um resultado bem parecido. Posicionei o cursor e simulei um click dentro da janela quando for clicado fora da janela. Experimente e me diga.
Anexos
SempreVisivel.rar
(652.7 KiB) Baixado 242 vezes
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Janela sempre visível

Mensagem por cjp »

Pelo que eu entendi da sua função, a janela vai ficar sempre no topo, mas daí o usuário não vai poder usar outra coisa. Ainda não é isso que eu precisava. Preciso que a janela venha ao topo apenas quando o programa requer uma intervenção do usuário.

De qualquer forma, agradeço a sua ajuda até aqui.
Inacio de Carvalho Neto
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Janela sempre visível

Mensagem por Pablo César »

Como eu não acostumo desistir tão facilmente... continuei procurando e acho que você vai gostar. Desta vez achei uma forma que poderíamos dizer que é mais canônica (como acostuma dizer o mestre Maligno, rsrs) do que os meus exemplos anteriores. Olhe como ficou o exemplo:

Código: Selecionar todos

#include <hmg.ch>
#xtranslate VALID <condition> [ MESSAGE <message> ] => ON LOSTFOCUS _DoValid ( <condition> , <message> )

Memvar _HMG_IsValidInProgress

Function Main ()
Public _HMG_IsValidInProgress := .F.
DEFINE WINDOW Form_1 ;
   AT 0,0 ;
   WIDTH getdesktopwidth() ;
   HEIGHT getdesktopheight() ;
   TITLE "Janela principal" ;
   MAIN ;
  TOPMOST
  
  DEFINE BUTTON Button_2
	ROW	248
	COL	140
	CAPTION '&Outra janela'
	WIDTH	174
	HEIGHT  23
	ACTION  Chama_Nova()
	FONTNAME 'MS Sans Serif'
	FONTSIZE 9
  END BUTTON
END WINDOW
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1
Return Nil

Function Chama_Nova()
Local Validar:=.F.
DEFINE WINDOW Form_2 ;
      AT 10,10 ;
      WIDTH 232 ;
      HEIGHT 224 ;
      TITLE "Segunda Janela" ;
	  MODAL ;
	  NOSYSMENU
	  
	  @ 10, 10 TEXTBOX Text_1 ;
	    VALUE 0 ;
		NUMERIC ;
		VALID (If(Validar,This.Value > 0,.T.))
	  
	  @ 40, 15 CHECKBOX Check_1 ;
          OF Form_2;
          CAPTION "Validar campo" ;
          WIDTH 120 HEIGHT 30 ;
          VALUE .F. ;
		  ON GOTFOCUS Validar:=.F.;
		  ON CHANGE Validar:=This.Value
	  
	  @ 148,140 BUTTON Button_1 OF Form_2 ;
		CAPTION '&Ok' ;
		WIDTH	74 ;
		HEIGHT  23 ;
		ACTION  THISWINDOW.Release ;
		FONT 'MS Sans Serif' ;
		SIZE 9 
	  
END WINDOW
CENTER WINDOW Form_2
ACTIVATE WINDOW Form_2
Return nil

Function _DoValid ( Expression , Message )
If _HMG_IsValidInProgress
	Return Nil
Else
	If ValType ( Message ) = "U"
		Message := "Valor não aceitável"
	EndIf
	_HMG_IsValidInProgress := .T.
	If ( Expression , Nil , ( MsgStop ( Message, 'Erro' ) , This.SetFocus ) ) 
	_HMG_IsValidInProgress := .F.
EndIf
Return Nil
Não existe segredo na segunda janela, ela apenas é do tipo MODAL. Era isso que faltava definir uns dos tipos de janelas. Falta de conhecimento da minha parte. Bom espero que você tenha gostado.
Anexos
ObrigaResponder.rar
(654.45 KiB) Baixado 221 vezes
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Janela sempre visível

Mensagem por ANDRIL »

Janela sempre visível é uma coisa e MODAL é outra coisa, acho que os códigos acima exemplificam muito bem isso. Cada um utilize da maneira que seja mais conveniente. A primeira opção usaria para por exemplo, em um terminal onde não quero que o usuário use outros aplicativos juntamente com o meu.

Abraços
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Janela sempre visível

Mensagem por Pablo César »

Pois eu descobrí isso também. Acho que outra forma de limitar ao acesso a outras aplicações quando o programa está sendo executado: é limitar o deslocamento do cursor do mouse. Mas aí também teria que bloquear algumas teclas para que o programa seja deixado de lado...
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Janela sempre visível

Mensagem por Stanis Luksys »

Olá,

Se eu não me engano, esta nova versão da HMG, é baseada na Qt, não é?

A Qt disponibiliza uma forma de se fazer isso. Ao criar a Janela, você define a modalidade dela. Ela pode ser Window Modal, Application Modal ou System Modal.

A Window Modal, trava somente a janela que chamou esta. A Application Modal trava o programa todo, e a System Modal trava Sistema Operacional inteiro.

Esta última só existe em Linux. Mas eu sei que já é possível fazer isso no Windows em versões a partir do Vista. Mas não me agrada muito, fica igual aqueles avisos de segurança do Vista e do Seven.

Abraços.
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Janela sempre visível

Mensagem por Pablo César »

Se eu não me engano, esta nova versão da HMG, é baseada na Qt, não é?
Sim a nova versão da HMG é com QT mas eu fiz esses exemplos na versão 3. Ja existem há algum tempo, o ilustre colega esclarece em: https://pctoledo.org/forum/viewto ... 311#p57303

Mas é interessante o que a QT pode fazer. Eu gostaria muito poder aprender mais sobre QT...
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Janela sempre visível

Mensagem por Pablo César »

Na MiniGUI tem um exemplo de SYSTEM MODAL DIALOG em C:\MiniGUI\SAMPLES\BASIC\MsgBoxEx\Message.prg que utiliza-se da User32.Dll

Terceira opção do menu MessageBox ( 'Message Box with 2 Buttons: Retry and Cancel and Modal Dialog' )

Anexei o exemplo para apreciação. Tem outros muito interessantes.
Anexos
MsgBoxEx.rar
(465.79 KiB) Baixado 198 vezes
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Responder