Autor Tema: Cerrar todos los Formularios dentro de un picture  (Leído 1410 veces)

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

aedEric

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +20/-0
    • Ver Perfil
Cerrar todos los Formularios dentro de un picture
« en: Marzo 26, 2015, 10:19:04 pm »
 :( hola buenas tardes a todos Foristas, tengo una duda o mas bien curiosidad es posible cerrar todos los formularios que se han cargado dentro de un Picture box, para cargar los forms dentro de un picture ocupe
http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/46.htm
Código: [Seleccionar]
Option Explicit


' Declaración de la función Api SetParent
Private Declare Function SetParent Lib "user32" ( _
    ByVal hWndChild As Long, _
    ByVal hWndParent As Long) As Long

' Declaración de la función Api ShowWindow
Private Declare Function ShowWindow Lib "user32" ( _
    ByVal hwnd As Long, _
    ByVal nCmdShow As Long) As Long


'Constante que le indica que es para maximizar la ventana
Const SHOWMAXIMIZED_eSW = 3&


Sub Incrustar_Formulario(El_Formulario As Form, El_PictureBox As PictureBox)

    Dim Ret As Long

    'Mostramos el Form2
    Form2.Show

    'Lo metemos dentro del Picture1
    Call SetParent(El_Formulario.hwnd, El_PictureBox.hwnd)

    'Maximizamos el Formualrio incrustado dentro del Picture, mediante el _
    Api showWindow, pasándole la constante SHOWMAXIMIZED_eSW

    Ret = ShowWindow(El_Formulario.hwnd, SHOWMAXIMIZED_eSW)

End Sub


Sub Liberar_Formulario(El_Formulario As Form)
    ' Libera el formulario, pasándole en el segundo parámetro el valor 0
    Call SetParent(El_Formulario.hwnd, 0)

End Sub

'Incrusta el form

Private Sub Command1_Click()
    Call Incrustar_Formulario(Form2, Picture1)
End Sub

'Libera
Private Sub Command2_Click()
    Call Liberar_Formulario(Form2)
End Sub

Private Sub Form_Load()

    Me.Caption = " Ejemplo del Api SetParent para incrustar y liberar formularios"
    Command1.Caption = " Incrustar "
    Command2.Caption = " Liberar "

End Sub

Private Sub Form_Unload(Cancel As Integer)
    End
End Sub

se que se puede liberar el form del picture pero no se si se pueda cerrar  todos los formularios que estan cargados dentro del picture, de antemano agradezco sus opiniones y sugerencias gracias
« última modificación: Mayo 18, 2015, 09:12:41 pm por aedEric »
No he fracasado. He encontrado 10000 soluciones que no funcionan.

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
Re:Cerrar todos los Formularios dentro de un picture
« Respuesta #1 en: Marzo 27, 2015, 09:27:14 am »
Hola, aca te hice un proyecto de ejemplo. De paso meti todo lo referente a meter forms en containers en un modulo. Me tomé la libertad de modificarlo un poco, particularmente para que el form no "parpadee" apareciendo normal y poniendose como pariente en el picture (ahora solamente aparece en el picture sin mostrarse previamente).
Agregué la funcion que se llama CloseAllForms que requiere saber el picture container, y va a cerrar todos los picture childs.
Como al cambiar el parent via api, no se actualiza el objeto Form.Parent, es necesario enumerar las ventanas, y chequear cual corresponde a un form, para luego cerrarlo.
EjemploContainers.zip

Saludos
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

aedEric

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +20/-0
    • Ver Perfil
Re:(SOLUCIONADO) Cerrar todos los Formularios dentro de un picture
« Respuesta #2 en: Marzo 27, 2015, 10:57:16 am »
 ;D hola Coco Genial muchas gracias te agradezco quedo super TEMA solucionado
Saludos desde Mexico
No he fracasado. He encontrado 10000 soluciones que no funcionan.

aedEric

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +20/-0
    • Ver Perfil
Re: Cerrar todos los Formularios dentro de un picture
« Respuesta #3 en: Mayo 18, 2015, 09:20:25 pm »
hola amigos perdon por revivir un tema de hace dos meses tengo una duda coco me hizo el grandisimo favor modificar el codigo para incrustar  un form en picturebox y realizo el de limpiar dicho picture de los form incrustados, todo quedo perfecto, ahora tengo una duda es posible incrustar un form en el picturebox cuando desde el form desde donde se desea realizar dicha incrustacion ha sido mostrado en forma modal. agradecere cualquier opinion o sugerencias gracias de antemano saludos

Código: (VB) [Seleccionar]
Option Explicit


Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndParent As Long) As Long
Private Declare Function GetParent Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function SetPropA Lib "user32.dll" (ByVal hwnd As Long, ByVal lpString As String, ByVal hData As Long) As Long
Private Declare Function GetPropA Lib "user32.dll" (ByVal hwnd As Long, ByVal lpString As String) As Long
Private Declare Sub CopyMemory Lib "Kernel32" Alias "RtlMoveMemory" (dest As Any, Source As Any, ByVal bytes As Long)


Declare Function EnumChildWindows Lib "user32.dll" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

Private Function ObjFromPtr(ByVal pObj As Long) As Object
    Dim obj As Object
    ' force the value of the pointer into the temporary object variable
    CopyMemory obj, pObj, 4
    ' assign to the result (this increments the ref counter)
    Set ObjFromPtr = obj
    ' manually destroy the temporary object variable
    ' (if you omit this step you'll get a GPF!)
    CopyMemory obj, 0&, 4
End Function

Public Sub EmbeddForm(ByRef frmChild As Form, ByRef El_PictureBox As PictureBox)
    With frmChild
   
        Call SetPropA(.hwnd, "OldParent", GetParent(.hwnd))
       
        'Lo metemos dentro del Picture1
        Call SetParent(.hwnd, El_PictureBox.hwnd)
       
        'Mostramos el Form2
        Call .Show
       
        'Maximizamos el Formualrio incrustado dentro del Picture
        .WindowState = vbMaximized
    End With
End Sub

Public Sub ReleaseForm(ByRef El_Formulario As Form)
    Call SetParent(El_Formulario.hwnd, _
                   GetPropA(El_Formulario.hwnd, "OldParent"))
End Sub


Public Sub CloseAllForms(ByRef picContainer As PictureBox)
    Call EnumChildWindows(picContainer.hwnd, _
                          AddressOf EnumChildProc, _
                          ObjPtr(picContainer))
End Sub

Private Function GetFormFromhWnd(ByVal lhWnd As Long, _
                                 ByRef frmRes As Form) As Boolean
    For Each frmRes In VB.Forms
        If frmRes.hwnd = lhWnd Then
            GetFormFromhWnd = True
            Exit Function
        End If
    Next
End Function


Private Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
    Dim frmChild        As Form
   
    If GetFormFromhWnd(hwnd, frmChild) Then
        Unload frmChild
    End If
End Function
No he fracasado. He encontrado 10000 soluciones que no funcionan.