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.
Abrir tela modal em duas telas
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.
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
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.