Abrir tela modal em duas telas

Estou tentando fazer o supervisório rodar em duas telas ao mesmo tempo, onde a aplicação possui algumas popup, ao abrir na tela do monitor 2 ela sempre é jogada para a tela do monitor 1. Alguém saberia me dizer como posso solucionar esse problema, para que tela popup seja aberta em seu respectivo monitor centralizada.

Bom dia, pode usar o método MoveFrame.
Faça no evento click do seu objeto que irá abrir a tela o seguinte script:

Application.GetFrame(Name).OpenScreen(“Tela1”), Frame.Name

onde Tela1 é o nome da tela modal que deseja abrir e Frame.Name será o nome do quadro que tu irá passar como parâmetro.

No evento OnPreShow da tua tela use o script :

Dim Quadro 
Quadro = Arg 

'Configurar o título do frame na janela e o estilo da janela
Frame.SetFrameOptions “Tela1”, 1+2
'Move e redimensiona um frame
if Quadro = “Principal1” then
Frame.MoveFrame 760, 300, 400, 400
'MsgBox Arg
else
Frame.MoveFrame 2700, 300, 400, 400
end if

Isso abrir a tela centralizada numa tela 1920 x 1080 , mais precisa adaptar a tua tela. E se o objeto estiver no Quadro Principal 2 irá deslocar a tela por isso os 2700 abrindo em outro monitor.

1 Like
Sub btnOpenPopup_Click()
	Dim lHorizontalRes, lVerticalRes
	Dim lMonitorX, lMonitorY
	Dim lMousePosX, lMousePosY
	Dim lPosX, lPosY
	Dim lWidth, lHeight
	Dim objFrame
	Dim sFrameName
	Dim sPopupName

	' Nome da popup
	sPopupName = "NomeDaPopup"
	
	' Resolucao do monitor
	GetCurrentResolution lHorizontalRes, lVerticalRes
	
	' Posicao X e Y do mouse em px.
	lMousePosX = Application.GetMouseX()
	lMousePosY = Application.GetMouseY()
	
	Set objPopup = Application.GetScreen(sPopupName)
	
	' Largura e altura da popup
	lWidth = HmToPx(objPopup.Width)
	lHeight = HmToPx(objPopup.Height)

	' 0-Monitor 1; 1-Monitor 2
	lMonitorX = lMousePosX \ lHorizontalRes
	lMonitorY = lMousePosY \ lVerticalRes
	
	' Calculo da posicao X e Y para centralizar a popup
	lPosX = (lMonitorX * lHorizontalRes) + ((lHorizontalRes - lWidth)/2)
	lPosY = (lMonitorY * lVerticalRes) + ((lVerticalRes - lHeight)/2)
	
	' TODO: Se deseja abrir mais de um instancia da mesma popup
	' deve-se gerar nome unico para o frame.
	sFrameName = objPopup.Name

	Set objFrame = Application.GetFrame(sFrameName, True)	
	objFrame.MoveFrame lPosX, lPosY, lWidth, lHeight
	objFrame.SetFrameOptions "",1+2+16+64+256
	objFrame.ShowScreen objPopup, 0, False, ""
End Sub

Private Function HmToPx( hm )
	HmToPx = hm * 96 / 2540
End Function

Private Sub GetCurrentResolution( ByRef lHorizontalRes _
								, ByRef lVerticalRes )
	Dim colItems
	Dim objItem
	Dim objWMIService
	' Inicializa como FullHD (resolucao mais comum)
	lHorizontalRes = 1920
	lVerticalRes = 1080
	
	Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
	Set colItems = objWMIService.ExecQuery( _
			"Select * from Win32_VideoController",,48)
	
	For Each objItem in colItems
    	lHorizontalRes = objItem.CurrentHorizontalResolution
    	lVerticalRes = objItem.CurrentVerticalResolution
	Next
End Sub
1 Like

Bom dia, ao fazer a parte do evento no OnPreShow, ele gera erro na linha “Frame.SetFrameOptions “Tela1”, 1+2”

Tem que verificar o nome do sua tela e o nome do seu quadro que deseja abrir. Ali no meu caso o nome da tela é Tela1 e o nome dos meus quadros Principal1 e Principal2.

Muito obrigada Jonathan, com seu script consegui abrir as telas modal em ambos monitores.