Autor Tema: SetParent control en otro form no funcionan los eventos  (Leído 5067 veces)

0 Usuarios y 1 Visitante están viendo este tema.

yokesee

  • Bytes
  • *
  • Mensajes: 35
  • Reputación: +1/-0
    • Ver Perfil
SetParent control en otro form no funcionan los eventos
« en: Marzo 03, 2017, 10:14:07 am »
Hola a todos
tengo un dll del que obtengo un form y lo meto dentro de un PictureBox y también desactivo el foco para que no parpadee la ventana al cambiar el foco y funciona todo bien.
Yo quería usar lo pero para controles sueltos e conseguido instanciar lo en donde yo quiero pero dejan de funcionar los eventos.
lo probé con un simple botón con un MsgBox simple que al dar le click y al instanciar lo por suelto no funciona el evento.
Es una prueba seria también para controles personalizados.
Como podría recibir los eventos.
Un saludo y gracias


código que uso para instanciar la ventana dentro del PictureBox .
Código: [Seleccionar]
Public Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function CloseWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long

Private Const WM_DESTROY = &H2
Private Const WM_CLOSE = &H10
Const SHOWMAXIMIZED_eSW = 3&
Const WS_HIDE = 0
Const WS_NORMAL = 1
Const GWL_STYLE = (-16)
Const WS_CHILD = &H40000000
Const WS_EX_CLIENTEDGE = &H200

Public Sub MoveWindowInPictureBox_expecifico(formmover As Form, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long)
'    MsgBox formmover.hwnd
    MoveWindow formmover.hwnd, x, y, nWidth, nHeight, 1
End Sub
Public Sub MoveWindowInPictureBox_cero(formmover As Form)
'    MsgBox formmover.hwnd
    MoveWindowInPictureBox formmover, 0, 0
End Sub
Public Sub MoveWindowInPictureBox(formmover As Form, ByVal x As Long, ByVal y As Long)
'    MsgBox formmover.hwnd
    MoveWindow formmover.hwnd, x, y, formmover.Width, formmover.Height, 1
End Sub
Public Sub SetParentToPictureBox(hwndwindow As Long, hwndPictureBox As Long)
    Call SetParent(hwndwindow, hwndPictureBox)
    SetWindowLong hwndwindow, GWL_STYLE, GetWindowLong(hwndwindow, GWL_STYLE) Or WS_CHILD
End Sub

Public Sub ShowWindowInPictureBox_NORMAL(hwndwindow As Long)
    Call ShowWindow(hwndwindow, WS_NORMAL)
End Sub
Public Sub ShowWindowInPictureBox_MAXIMIZE(hwndwindow As Long)
    Call ShowWindow(hwndwindow, SHOWMAXIMIZED_eSW)
End Sub
Public Sub HideWindowInPictureBox(hwndwindow As Long)
    Call ShowWindow(hwndwindow, WS_HIDE)
End Sub
Public Sub CloseWindowInPictureBox(hwndwindow As Long)
    SendMessage hwndwindow, WM_CLOSE, 0, 0
End Sub
Public Sub ResetParentToPictureBox(hwndwindow As Long)
    Call SetParent(hwndwindow, 0)
End Sub


NEBIRE

  • Kilobyte
  • **
  • Mensajes: 57
  • Reputación: +7/-1
    • Ver Perfil
Re:SetParent control en otro form no funcionan los eventos
« Respuesta #1 en: Marzo 03, 2017, 10:07:58 pm »
Lo complicas mucho...

Te mando un proyecto simplificado...
Tiene 2 formularios. En uno de ellos hay montado un Usercontrol.
El Usercontrol solo tiene la propiedad get para el hWnd y el evento MouseDown.
La interfaz del formulario principal, son 4 botones, 1 picturebox y 3 options
----> 2 botones para meter y liberar el formulario2 en el picturebox del formulario 1
----> 2 botones para meter y liberar el Usercontrol del form2 en el mismo picturebox del form1
----> 3 Botones options, para elegir el 'modo' en que quieres alojar el objeto en el picturebox: Maximizado, minimizado o a su tamaño actual (normal).

Verás que los eventos funcionan bien, una vez dentro del picturebox, o fuera... Tanto el Usercontrol, como el form2, muestran un mensaje en su evento MouseDown...

mmmm... no he probado si tras compilarlo en una librería, al instanciarla ver si luego siguen funcionando. En principio, no debiera dar problemas... yo tengo proyectos compilados en esa manera, y funcionan sin problemas.

Para terminar, si lo vas a meter en una librería, sería acorde que sea la propia librería quien realice toda la labor... Prueba simplicando tu código, tal como yo te lo he puesto. Si a pesar de ello, tienes problemas avisa de nuevo y veo de montarlo en la forma que tu puedas tenerlo y te sea más útil...

Enlace de descarga del proyecto de prueba:
http://workupload.com/file/htVYvqv 5Kb.
« última modificación: Marzo 03, 2017, 10:11:39 pm por NEBIRE »

yokesee

  • Bytes
  • *
  • Mensajes: 35
  • Reputación: +1/-0
    • Ver Perfil
Re:SetParent control en otro form no funcionan los eventos
« Respuesta #2 en: Marzo 03, 2017, 11:41:13 pm »
Hola muchas gracias por contestar
si mi código estaba un poco desordenado pero era por que estuve haciendo pruebas cuando funciona luego todo lo suelo optimizar un poco mas.

me funciono perfectamente con el ctl lo que no entiendo es por que no funciona con un simple botón me importaba que funcionara con el ctl ya que lo del botón era a modo de prueba un botón se puede instanciar sin ningún problema.

es que uso una clase para cargar las dll sin necesidad de registrar a modo de plugins y como no se puede hacer los mismo con los controles de usuario ocx y necesito de unos pocos pues con este sistema me sale un poco del paso.
http://www.vbforums.com/showthread.php?782719-VB6-Regfree-Usage-of-your-own-VB-and-other-COM-Dlls-per-DirectCOM-Helper
uso esa por si a alguien le interesa.

un saludo y muchas gracias

NEBIRE

  • Kilobyte
  • **
  • Mensajes: 57
  • Reputación: +7/-1
    • Ver Perfil
Re:SetParent control en otro form no funcionan los eventos
« Respuesta #3 en: Marzo 04, 2017, 02:51:50 pm »
A ver... si lo que necesitas es instanciar controles sin registrarlos en el equipo huésped, puedes hacerlo sin registrarlos. A cambio deben ir en el código fuente en TU proyecto... no en otro proyecto, porque eso fuerza a compilarlo como OCX.
Así, los controles se compilan JUNTO A la aplicación y no de forma independiente.

La página de VBForum, creo que desapareció hace ya algunos meses... no puedo ver a qué te refieres exactamente.

yokesee

  • Bytes
  • *
  • Mensajes: 35
  • Reputación: +1/-0
    • Ver Perfil
Re:SetParent control en otro form no funcionan los eventos
« Respuesta #4 en: Marzo 04, 2017, 06:21:02 pm »
ya es que en el programa principal no le quería cargar de muchas cosas y tener lo todo mas modular con plugins.
pues la pagina funciona perfectamente creo que es problema tuyo entro muy a menudo en ella incluso hace menos de un mes me resolvieron una duda.

NEBIRE

  • Kilobyte
  • **
  • Mensajes: 57
  • Reputación: +7/-1
    • Ver Perfil
Re:SetParent control en otro form no funcionan los eventos
« Respuesta #5 en: Marzo 04, 2017, 11:47:45 pm »
Bien... si prefieres seguir como lo tienes, puedes ver que l proyecto que te he puesto, porta el usercontrol en el propio proyecto, y puedes hacer Setparent sobre él y sobre el form2 y sus eventos funcionan correctamente.

Sin más detalles, me pregunto , si el problema no estará en el propio formulario. Ten en cuenta que si no cargas el formulario, tampoco se cargan sus controles.

Piensa que aunque un proyecto sea grande y extenso, no necesitas cargar todos los formularios en memoria, creas y destruyes formularios según los necesites:
Código: [Seleccionar]
' en vez de hacer
call form2.show(1)
' puedes hacer:
dim f as form
set f=new form2
call f.show (1)
set f=nothing

' de este modo, form2 nunca está cargado, pero creas instancias de él, que luego destruyes cuando ya no los necesites. Así mantienes a raya los recursos que utiliza tu programa, aunque sea un proyecto grande....


---------------------------------------
Respecto de VBForums:
Vaya. Y puedes entrar ahora?. A ver si mi ISP lo tuviera bloqueado... hace algunos meses, que esa web, siempre me aparece fuera de combate, incluso creo recordar que tiempo atrás lo miré en WHOIS, y ponía que el sitio había caducado (ahora me haces dudar y quizás fuera otra, pero si que sé que hace tiempo que no tengo acceso).

Me edito: He cambiado las DNS de mi ISP por otras y tampoco  tengo accso, quizás sea el sitio que tenga bloqueado un rango que incluya IPs de mi proveedor... lo miraré cuando acuda a casa de algún amigo o familiar que tenga otro proveedor, a ver si desde allí hay acceso...


yokesee

  • Bytes
  • *
  • Mensajes: 35
  • Reputación: +1/-0
    • Ver Perfil
Re:SetParent control en otro form no funcionan los eventos
« Respuesta #6 en: Marzo 05, 2017, 09:45:23 am »
Muchas gracias NEBIRE lo tendré en cuenta todos tus consejos.
Se que hay otros lenguajes que permiten todo esto de controles y crear plugin sin necesidad de registrar lo,
que posiblemente sean mas fáciles de usar.Pero me cuesta mucho despegarme de mi querido y ya un poco anticuado VB6.

Puedes probar con un VPN o alguna pagina que te redireccione allí con otra ip por que aquí en España por ejemplo si funciona perfectamente y en distintas ciudades.

un saludo

NEBIRE

  • Kilobyte
  • **
  • Mensajes: 57
  • Reputación: +7/-1
    • Ver Perfil
Re:SetParent control en otro form no funcionan los eventos
« Respuesta #7 en: Marzo 06, 2017, 09:38:40 pm »
Bien... he reactivado una extensión VPN y efectivamente VBForums sigue ahí... se ve que era un bloqueo geolocalizado que incluía mi IP...

Finalmente he podido leer la página a la que me derivabas. Y tras leer la funcionalidad, el propio  "Schmidt", aclara que no funciona con los OCX, sólo sirve para las librerías. Y alega que la razón, es que los OCX, requieren toda la implementación de: "OLEInPlaceSitting", que básicamene aloja el control en el contenedor.

En el mensaje nº7, lo explica en respuesta a alguien:
"From my point of view, yes - though OCXes are currently not supported by this method
(because there's a bit more complexity involved with them, due to "siting requirements".
For OCXes I'd use SxS-manifests, which should work from XP onwards too."

---------------
Sin embargo, no tienes que preocuparte demasiado del asunto. Si todavía pretendes no compilarlos en tu aplicación y no registrar tus controles OCX, es posible hacerlo. Hay sin embargo un requisito.
El OCX debe permanecer en la misma carpeta que la aplicación (no valen subcarpetas). Si es así, funciona correctamente aunque el control no esté registrado en el sistema.
Esto funciona debido a la forma en que Win2, trata a las librerías. Cuando una aplicación trata de obtener una instancia de un control, primero mira si la propia aplicación la incluye, si no es así, mira si en la carpeta donde yace la aplicación, existe dicho control, si tampoco es así, busca en la carpeta del sistema (...windows\system32\*.ocx), si no existe, busca si en el registro hay una entrada  para el mismo, y si sigue sin aparecer, es cuando te canta el error.

El caso para las DLLs, es igual, salvo que en ellas además puedes usar 'getobject', que exige la ruta explícitamente o 'CreateObject', que lo localiza directamente en el registro (en estos dos casos, se obvia la búsqueda anterior, ya que se proporciona un método implícito de localización, tal que si no se encuentra en esa localización marca error, sin buscar en parte alguna adicional...

La pega de este sistema (que tiene solución), es que si pretendes que tu control valga para muchos otros proyectos, no va a ser muy útil, hacer una copia del control en cada aplicación que generes. Entonces en ese caso, será adecuado moverlo a la carpeta del sistema...  y no hace falta registrarlo. Ahí está disponible para todas las aplicaciones que usen ese control
Si un cliente solo va a tener una aplicación que incluya tal o cual control, entonces es mejor que esté en la propia capeta del programa, y si va a tener varias aplicaciones que usan el mismo control es preferible ponerlo en la carpeta del sistema.
Fuera de esas dos ubicaciones (aparte de incorporarlo en la propia aplicación), es obligado registrarlo...
« última modificación: Marzo 06, 2017, 09:53:48 pm por NEBIRE »