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 hacerlo .xapu 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 . Con esto queda demostrado que autoit puede manejar ventanas MDI .
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