Página 1 de 1

Janela sempre visível

Enviado: 22 Nov 2011 04:35
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.

Janela sempre visível

Enviado: 23 Nov 2011 03:53
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.

Janela sempre visível

Enviado: 24 Nov 2011 01:11
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.

Janela sempre visível

Enviado: 25 Nov 2011 11:40
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

Janela sempre visível

Enviado: 25 Nov 2011 11:45
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...

Janela sempre visível

Enviado: 11 Dez 2011 13:30
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.

Janela sempre visível

Enviado: 11 Dez 2011 20:02
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...

Janela sempre visível

Enviado: 16 Jan 2012 23:31
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.