Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: pedroesca en Agosto 27, 2015, 08:35:53 pm
-
Buenas y santas para todos! tengo un inconveniente que supongo es una cosa básica, pero me está dando dolor de cabeza. Tengo un usercontrol en un form hijo (está dentro de un mdi y maximizado ambos), hago click en dicho usercontrol y llamo a otro form (no child), al cual le digo que se ubique debajo del usercontrol, es decir, le paso los siguientes parámetros:
formu.top=usercontrol.top + usercontrol.height
formu.left=usercontrol.lefty el problema está en que dicho formulario se ubica mucho mas arriba del user control y mucho mas a la izquierda.
Alguien sabe??? debería usar apis para obtener las coordenadas de la pantalla directamente???
-
Estimado pedroesca:
Prueba con este usercontrol: http://leandroascierto.com/foro/index.php?topic=2494.msg13400#msg13400 (http://leandroascierto.com/foro/index.php?topic=2494.msg13400#msg13400)
hace el efecto que quieres dar sin tanto jaleo por la posicion, pero usa el usercontrol dentro de tu proyecto, no uses el OCX.
Saludos Cordiales
-
Hola yo con este codigo hago para centrar cualquier form o un picture y darle la posicion donde tiene que quedar con el xTop
Private Sub Form_Load()
Call CENTRAR_VENTANAS(Me, 10000, 5000, -1500)
End Sub
En un Modulo
Public Sub CENTRAR_VENTANAS(frm As Form, Width As Long, Heigth As Long, xTop As Long)
frm.Width = Width
frm.Height = Heigth
isq = (MDIForm1.Width - frm.Width) / 2
If isq < 0 Then isq = 0
arr = (MDIForm1.Height - frm.Height) / 2
If arr < 0 Then arr = 0
frm.Left = isq - 150
frm.Top = arr - xTop
End Sub
-
Hola Pedro el motivo por el cual te lo pone mas arriva es porque tenes que tener en cuenta el borde del mdi, cuando vos consultas el formu.top te devuelve = 0 ya que en su ventana padre(mdi) esta en 0 despues el usercontrol tiene un valor en base a su padre ahora el nuevo formulario a mostrar se rige en vase a la pantalla en general poreso te aparece mas arriva, no se si me explico, bien ahora como se resuelve esto, sumar el borde del mdi no siempre es la solucion menos haciendo a ojo porque segun la configuracion local hay cambios despues puede haber o no un menu y si mostrars una barra de herramienta tambien varia el resultado
asi que resumiendo yo utlizaria el api GetWindowRect y le pondria una propiedad hwnd al usercontrol y te ahoras muchos dolores de cabeza esa te tira la posta de la posición del usercontrol con respecto a la pantalla.
PD no tengo el visual, espero no confundirme.
-
Hola a todos! gracias por las sugerencia, pero Leandro tiene razón, implementé tal cual como lo dice:
en el usercontrol le agregué la propiedad "hwnd" y la rutina para ubicar el form es la siguiente
Public Sub UbicarFORM(ByVal hWndRelativeTo As Long, ByVal X As Long, ByVal y As Long)
Dim rc As RECT, rcBt As RECT
If m_fbt_hWnd > 0 Then Exit Sub
With Me
m_hWndRelativeTo = hWndRelativeTo
m_fbt_hWnd = .hWnd
GetWindowRect hWndRelativeTo, rc
GetWindowRect m_fbt_hWnd, rcBt
If (rc.Left * Screen.TwipsPerPixelX) + X + 45 > Screen.Width Then
X = X - (((rc.Left * Screen.TwipsPerPixelX) + X + 45) - Screen.Width)
End If
If (rc.Top * Screen.TwipsPerPixelY) + y + .Height + 45 > Screen.Height Then
y = y - (((rc.Top * Screen.TwipsPerPixelY) + y + .Height + 45) - Screen.Height)
End If
.Move (rc.Left * Screen.TwipsPerPixelX) + X, (rc.Top * Screen.TwipsPerPixelY) + y
SetWindowPos .hWnd, HWND_TOPMOST, core_HOME.UcSCaption.Left, 0, 0, 0, _
SWP_NOACTIVATE Or _
SWP_NOMOVE Or _
SWP_NOSIZE Or _
SWP_SHOWWINDOW Or _
SWP_NOOWNERZORDER
End With
End Sub
----
'LA LLAMO ASÍ
ubicarFORM UC.hWnd, UC.Width - UC.Width, UC.Height