Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: aedEric 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 (http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/46.htm)
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
-
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 (https://www.dropbox.com/s/eq9anwhlc89op9v/EjemploContainers.zip?dl=0)
Saludos
-
;D hola Coco Genial muchas gracias te agradezco quedo super TEMA solucionado
Saludos desde Mexico
-
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
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