MDI (multiples ventanas). Win hijas: consola,paint,notepad.
Publicado: 16 Dic 2009, 23:32
Respondiendo a una cuestión del compañero xapu puesta en el post http://www.emesn.com/autoitforum/viewto ... 1874#p6786, he decido contestar en otro post independiente ya que veo que es un tema interesente, que no tiene que ver nada con el tema donde realizó la pregunta, y que además no debe estar en ese subforo ya que veo que es un poco complicado para el foro de "Preguntas sencillas". Aquí va mi respuesta a su post:
En AutoIt se puede hacer casi de todo
.
.
AutoIt tiene una propiedad para hacer MDI ($WS_EX_MDICHILD), pero como bien dice AutoIt, es una simulación no real de esta situación. Esto no me gusta.
Solución....utilizar alguna que otra api de win, como siempre
.
Con el código que he puesto, no solo he metido una ventana consola, sino que también he metido un paint y un notepad
. Con esto queda demostrado que autoit puede manejar ventanas MDI
.
Espero que os guste.
Saludos
.
En AutoIt se puede hacer casi de todo

Mmmmm......interesante pregunta. Me ha hecho pensar un poco esto y me he animado para intentar hacerloxapu escribió:y si por ejemplo quisiera meter la ventana del cmd dentro de un formulario? se podria?
i si puedes.. como seria XD

AutoIt tiene una propiedad para hacer MDI ($WS_EX_MDICHILD), pero como bien dice AutoIt, es una simulación no real de esta situación. Esto no me gusta.
Solución....utilizar alguna que otra api de win, como siempre

Con el código que he puesto, no solo he metido una ventana consola, sino que también he metido un paint y un notepad


Espero que os guste.
Código: Seleccionar todo
;Ejemplo MDI con tres ventanas hijas (consola, paint, notepad) por chefito ;).
#include <WindowsConstants.au3>
#Include <WinAPI.au3>
;#include <Constants.au3>
#include <GUIConstantsEx.au3>
$gui = GUICreate("Ventana padre",700,600,100,100) ;creo la ventana padre.
GUISetBkColor(100) ;color azul de fondo.
;cargo los tres programas ocultos (consola, paint, notepad).
$pidCmd=Run(@ComSpec , "",@SW_HIDE)
$pidPaint=Run("mspaint.exe", "",@SW_HIDE)
$pidNotepad=Run("notepad.exe", "",@SW_HIDE)
;no sale de este bucle hasta que me de el handle de las tres ventanas.
Do
Sleep(50)
$hCmd=WinGetHandle("[CLASS:ConsoleWindowClass]")
$hPaint=WinGetHandle("[CLASS:MSPaintApp]")
$hNotepad=WinGetHandle("[CLASS:Notepad]")
Until ($hCmd And $hPaint And $hnotepad)<>0
;hago estas tres ventanas hijas de la ventana principal $gui, la cual es su padre.
_WinAPI_SetParent($hCmd,$gui)
_WinAPI_SetParent($hPaint,$gui)
_WinAPI_SetParent($hNotepad,$gui)
;posiciono las tres ventanas dentro de la ventana padre.
WinMove($hCmd,"",0,0)
WinMove($hPaint,"",100,100)
WinMove($hNotepad,"",200,300)
;muestro las tres ventanas hijas.
WinSetState($hCmd,"",@SW_SHOW)
WinSetState($hPaint,"",@SW_SHOW)
WinSetState($hNotepad,"",@SW_SHOW)
;capturo los eventos cuando se tiene que repintar la ventana.
GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")
GUISetState(@SW_SHOW)
while 1
Sleep(10)
$msg=GUIGetMsg()
If $msg= -3 Then
Switch $msg
Case -3 ;cuando cierro la ventana padre, escondo la ventana padre, destruyo las hijas y salgo del programa.
GUISetState(@SW_HIDE)
WinKill($hCmd)
WinKill($hPaint)
WinKill($hNotepad)
Exit
EndSwitch
EndIf
WEnd
Func MY_WM_PAINT($hWnd, $Msg, $wParam, $lParam)
;redibujo las ventanas hijas.
_WinAPI_RedrawWindow($hCmd,0,0,BitOR($RDW_ERASE,$RDW_INVALIDATE,$RDW_UPDATENOW,$RDW_FRAME,$RDW_ALLCHILDREN))
_WinAPI_RedrawWindow($hPaint,0,0,BitOR($RDW_ERASE,$RDW_INVALIDATE,$RDW_UPDATENOW,$RDW_FRAME,$RDW_ALLCHILDREN))
_WinAPI_RedrawWindow($hNotepad,0,0,BitOR($RDW_ERASE,$RDW_INVALIDATE,$RDW_UPDATENOW,$RDW_FRAME,$RDW_ALLCHILDREN))
Return $GUI_RUNDEFMSG
EndFunc
