Página 1 de 1

MDI (multiples ventanas). Win hijas: consola,paint,notepad.

Publicado: 16 Dic 2009, 23:32
por Chefito
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 :smt003 .
xapu escribió:y si por ejemplo quisiera meter la ventana del cmd dentro de un formulario? se podria?
i si puedes.. como seria XD
Mmmmm......interesante pregunta. Me ha hecho pensar un poco esto y me he animado para intentar hacerlo :smt005 .
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 :smt003 .
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 :smt005 . Con esto queda demostrado que autoit puede manejar ventanas MDI :smt023 .
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
Saludos :smt026 .

Re: MDI (multiples ventanas). Win hijas: consola,paint,notepad.

Publicado: 17 Dic 2009, 05:04
por gna08
mmmmmmmm :smt003 :smt003 verdaderamente interesante.. me trae varias ideas... :smt026 jojo, k divertido.. gracias por el aporte :smt023 :smt023 :smt023

Re: MDI (multiples ventanas). Win hijas: consola,paint,notepad.

Publicado: 17 Dic 2009, 10:07
por Ximorro
¡ANDA YA! ¡MUY BUENO!

No sabía que podías crear un MDI de cualquier programa, muy interesante.

¿El hecho de tener esos programas como hijos nos da algún control especial?
Como evidente la gestión de ventanas, se maximiza a la nuestra, se minimiza dentro de la nuestra, etc..., la pregunta es ¿se puede hacer algo más con ellas que no se pueda hacer si son independientes?

Re: MDI (multiples ventanas). Win hijas: consola,paint,notepad.

Publicado: 17 Dic 2009, 16:07
por Chefito
Limitación?? Pues no se. Supongo que ninguna. Es como una ventana normal, pero en vez de mostrada en los límites del escritorio (recuerda que es como una ventana especial....tiene su handle), pues se muestra en los de una ventana la cual le has dicho que es su padre :smt002 .
Respecto a si se puede hacer algo más con ellas....supongo que lo mismo :smt001 . Lo único que hay que recordar es que estas ventanas son hijas (children) de una ventana padre. Tienen esa propiedad. Lo digo por si quereis enumerarlas, minimizarlas, maximizarlas, cerrarlas, posicionarlas, redimensionarlas, etc etc.

Aunque si os poneis a pensar un poco, es totalmente innecesario tratar de buscar estas ventanas para interactuar con ellas, ya que sabemos sus handles no? :smt005 .

Saludos.

Re: MDI (multiples ventanas). Win hijas: consola,paint,notepad.

Publicado: 17 Dic 2009, 19:33
por XPyro
Buen Script Chefito felicidades, siempre se aprenden cosas nuevas :smt003

Re: MDI (multiples ventanas). Win hijas: consola,paint,notepad.

Publicado: 20 Dic 2009, 03:36
por Nahuel
Genial, muy útil! :smt024

Re: MDI (multiples ventanas). Win hijas: consola,paint,notepad.

Publicado: 31 Dic 2009, 04:51
por Rupert.25
Muy buen ejemplo, se me ocurren varias cosas interesantes....

A ver que tranza hacemos :D


Gracias por el ejemplo!