GUI con aspa de cierre pero sin icono

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

GUI con aspa de cierre pero sin icono

Mensaje por Ximorro »

¿Cómo se puede crear este tipo de GUI desde AutoIT? Vaya, se trata de hacer una ventana tipo diálogo:
mensajeMSG.PNG
mensajeMSG.PNG (3.49 KiB) Visto 2542 veces
Es parecido a un MsgBox, pero no soy capaz de darle esa apariencia con GUICreate.
La primera cuestión es que sólo sé poner el aspa de cierre con $WS_SYSMENU, pero entonces sale el icono de la aplicación al lado del título, lógicamente es el menú del sistema, por eso sale, para eso es el flag. ¡Pero yo no quiero el menú, quiero solo el botoncito de la derecha!
¿Se puede quitar el icono? ¿Se puede poner la X de cierre de otra manera?

Quiero hacerlo más "tipo diálogo", con el borde como ese de arriba. Se supone que lo más parecido sería el estilo $WS_DLGFRAME, que precisamente pone el borde de los diálogos, así:
Captura2.PNG
Captura2.PNG (3.17 KiB) Visto 2542 veces
pero mira por donde si quiero barra de título hay que poner $WS_CAPTION... ¡pero eso incluye $WS_BORDER, con lo que anula el borde de $WS_DLGFRAME:
Captura3.PNG
Captura3.PNG (6.49 KiB) Visto 2542 veces
Así que esa es la segunda pregunta ¿cómo diablos ponen una barra de título pero el borde del diálogo?

Lo más cercano es el estilo extendido $WS_EX_TOOLWINDOW, así no saca el icono, pero la barra de título es más pequeña, y quiero una ventana normal, además como también hay que usar $WS_CAPTION, también queda anulado el borde $WS_DLGFRAME. Además tiene efectos secundarios, como que no sale en la barra de tareas. En fin, que es lo que más se parece pero tampoco es lo que quiero:
Captura4.PNG
Captura4.PNG (6.03 KiB) Visto 2540 veces
¿Nos faltan estilos desde AutoIt con GUICreate o es que no encuentro los adecuados?
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
ms999
Hacker del Foro
Mensajes: 116
Registrado: 26 Ene 2011, 06:13

Re: GUI con aspa de cierre pero sin icono

Mensaje por ms999 »

para lograr esa ventana deveras deshabilitar el tema de windows para esa ventana.

Código: Seleccionar todo

#Include <APIConstants.au3>

$Theme = _WinAPI_GetThemeAppProperties() ; opcional
_WinAPI_SetThemeAppProperties($STAP_ALLOW_WEBCONTENT)
$hGui = GuiCreate("Ventana sin Tema",240,80)
GuiCtrlCreateLabel("Un botón tiene el Tema activado y el otro no",10,10,380,20)
GuictrlCreateButton("Boton 1", 10,40,100,30)
_WinAPI_SetThemeAppProperties($Theme)
GuictrlCreateButton("Boton 2", 130,40,100,30)
GuiSetState()

Do

Until GuiGetMsg() = -3

Func _WinAPI_GetThemeAppProperties()
	Local $Ret = DllCall('uxtheme.dll', 'int', 'GetThemeAppProperties')
	If @error Then
		Return SetError(1, 0, 0)
	EndIf
	Return $Ret[0]
EndFunc   ;==>_WinAPI_GetThemeAppProperties

Func _WinAPI_SetThemeAppProperties($iFlags)
	DllCall('uxtheme.dll', 'none', 'SetThemeAppProperties', 'dword', $iFlags)
	If @error Then
		Return SetError(1, 0, 0)
	EndIf
	Return 1
EndFunc   ;==>_WinAPI_SetThemeAppProperties
Si quieres tener estas funciones y mas en una UDF, quizas deberias bajarte la UDF WinAPIEx del foro de AutoIt en ingles, esta muy buena con un montonazo de funciones de las API de windows y tambien viene con un archivo de ayuda y ejemplos para ver sus aplicaciones.

Link de la UDF WinAPIEx.au3 UDF by Yashied
Última edición por ms999 el 08 Sep 2011, 17:40, editado 1 vez en total.
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: GUI con aspa de cierre pero sin icono

Mensaje por Ximorro »

¡Muy interesante! No me funciona en la versión 3.3.0 pero lo adaptaré. Tengo la 3.3.6 en versión portable pero uso normalmente la otra.
Pues no se me había ocurrido que ese aspecto era el que se conseguía sin los estilos visuales. Y no sabía que se podía activar o desactivar el tema para ventanas independientes... ¡qué digo ventanas! ¡¡para diferentes controles dentro de una ventana!! Me has dejado alucinado.

Esto nunca se me habría ocurrido, la API de Windows es gigantesca y como para adivinar que se podía hacer de esa manera. Además anda que es poco intuitivo que para quitar el tema XP tienes que poner el flag $STAP_ALLOW_WEBCONTENT, que según veo en la MSDN es para poner los estilos visuales al contenido web, ¿y eso quita el de la ventana? ¡como para adivinarlo! :smt017

Bien, aplicando eso a un MsgBox, problema solucionado, pues sale sin borde y sin icono, pero con aspa de cierre. :smt007

Pero queda abierta la pregunta para los gurús de los GUI:
¿Se puede tener una barra de título con botón de cierre pero sin icono de aplicación?
¿Se puede tener una ventana con barra de título pero sin borde (como con $WS_DLGFRAME)?
Dicho de otra manera: ¿se puede crear una ventana tipo diálogo con GUICreate?


¡Gracias ms999! Ya tengo copiada la udf...
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
ms999
Hacker del Foro
Mensajes: 116
Registrado: 26 Ene 2011, 06:13

Re: GUI con aspa de cierre pero sin icono

Mensaje por ms999 »

El comportamiento de las flags de esa funcion, creo que en realidad es el siguente...

FLAG = 0 Deshabilita estilos visuales a la ventana y sus controles.
FLAG = 1 Deshabilita estilos visuales a los controles.
FLAG = 2 Deshabilita estilos visuales a la ventana.
FLAG = 3 Habilita estilos visuales a todo.

No he encontrado una forma de lograr sacar el icono de alli

con esto saque los botones maximizar y minimizar sin tener que agregarle el estilo WS_SYSMENU

Código: Seleccionar todo

    #Include <winapiEX.au3>
	#Include <WindowsConstants.au3>
	#Include <Constants.au3>
	#Include <SendMessage.au3>

    $Theme = _WinAPI_GetThemeAppProperties() ; opcional
    _WinAPI_SetThemeAppProperties(0)
    $hGui = GuiCreate("Ventana sin Tema",240,100,-1,-1)
	$WinStyle = _winapi_getwindowlong($hGui, $GWL_STYLE)
	_WinAPI_SetWindowLong($hGui, $GWL_STYLE, BitXor($WinStyle, $WS_MINIMIZEBOX))
    GuiCtrlCreateLabel("Un botón tiene el Tema activado y el otro no",10,10,380,20)
    GuictrlCreateButton("Boton 1", 10,40,100,30)
    _WinAPI_SetThemeAppProperties($Theme)
    GuictrlCreateButton("Boton 2", 130,40,100,30)
    GuiSetState()

    Do

    Until GuiGetMsg() = -3
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: GUI con aspa de cierre pero sin icono

Mensaje por Chefito »

Muy interesante la api _WinAPI_SetThemeAppProperties. No la conocía. Pero como dice Ximorro, el mundo de las apis es enoooorrrrmeeee :smt001 .

Ximorro, puedes probar el script que hice para saber los estilos de una ventana, a ver que estilos te da esa y si son los buenos que debes poner.

Otra solución es hacerte tu propia ventana a tu gusto con la api CreateWindowEx. Está implementada en la udf winapi.au3 que lleva autoit. Es _WinAPI_CreateWindowEx. Tiene parámetros muy interesantes como $sClass.

Mira en el msdn: http://msdn.microsoft.com/en-us/library ... S.85).aspx

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: GUI con aspa de cierre pero sin icono

Mensaje por Ximorro »

ms999, piensa que sí tienes el estilo WS_SYSMENU porque GuiCreate se lo pone por defecto, cuando tomas su estilo con GetWindowLong ya estás tomando esa base.

Chefito, intento simular una ventana de tipo diálogo con un GUI normal, creía que serían normales y que se harían a base de cambiar estilos, pero estoy empezando a pensar que no. Tomando los estilos tal como veo en tu analizador, y poniendo lo mismo, ¡y estaba a mitad y se me ha ocurrido copiarlo desde Au3Info! pues pasa lo mismo, queda parecido pero sale el icono de aplicación. Y sin lo del tema igual sale el borde.

Por cierto, podrías añadir eso al programita de ventanas, que te ponga los estilos para que puedas copiarlos y meterlos en tus propios GUI sin tener que ir opción por opción. Vaya, dos editboxes con esto:

Código: Seleccionar todo

Style     0x94C803C5
ExStyle   0x00010101
O sea, que creo que no se puede hacer con GUICreate, habrá que mirar si lo de la clase de _WinAPI_CreateWindowEx que comentas es sólo para especificar tu nombre de clase personalizado o realmente puedes crear una clase derivada de otra. En ese caso sí se podría hacer heredando de la clase "diálogo", que es la #32770, una de esas especiales del sistema...

A ver si me aclaro con esa llamada, porque en al ayuda de la API no viene ningún ejemplo... :-(
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: GUI con aspa de cierre pero sin icono

Mensaje por Ximorro »

Estooooo, pues sí, las buenas noticias es que se puede crear una ventana tipo diálogo con CreateWindowEx ¡Bieeeeeeeeen! :smt026
La mala noticia es que manejar eso ¡será poco menos que una pesadilla! :smt010 :smt024

Así creo una:

Código: Seleccionar todo

#Include <WinAPI.au3>

HotKeySet("{ESC}", "_Salir")
$Clase = "#32770" ;Diálogo de Windows
;$Clase = "AutoIt v3 GUI" ;Ventana creada por AutoIt... pero al crearla de forma especial no capturamos eventos

;_WinAPI_CreateWindowEx($iExStyle, $sClass, $sName, $iStyle, $iX,$iY, $iWidth,$iHeight, $hParent[, $hMenu, $hInstance, $pParam])
$hWnd = _WinAPI_CreateWindowEx(0x00010101, $Clase, "Mi ventana", 0x94C803C5, 810,360, 300,140, 0)
_WinAPI_ShowWindow($hWnd)

While 1
	$m = GuiGetMsg()
	If $m <> 0 Then ConsoleWrite($m & @CRLF)
	;Sleep(1000) ;Si quitamos el GuiGetMsg() mejor ponemos un Sleep para liberar la CPU
WEnd

Func _Salir()
	_WinAPI_DestroyWindow($hWnd)
	Exit
EndFunc
Los estilos son los mismos que tiene una ventana creada con MsgBox. Efectivamente me crea una ventana con aspa pero sin icono de sistema, y si quito lo del tema de XP pues también sin borde.

El problema es que esto está creado "a mano", por lo tanto sin soporte AutoIt para manejar GUIs. Para empezar olvídate del GUISetState(), esto hay que mostrarlo con _WinAPI_ShowWindow(). Pero es que imaginaos la que hay que montar para meter controles en esa ventana, porque ya os podéis olvidar también de las GuiCtrlCreate...(), creo que esos controles habrá que crearlos también con CreateWindowEx().
Por supuesto cuando acabemos con todas esas ventanas hay que destruirlas con _WinAPI_DestroyWindow(), que no sé si destruyendo una ventana destruye también las hijas, o hay que eliminar primero los controles uno a uno...

Pero todo eso es un paseo al lado de lo que habrá que hacer para manejar eventos, tanto de la ventana como de sus controles... ¿Cómo se hará? Sospecho que a base de monitorizar un montón de mensajes a base de algo parecido a GUIRegisterMsg... ¡sólo que no podemos usar GUIRegisterMsg porque esto no es un GUI de AutoIt!

Como veis en el bucle he puesto un monitoreo de los mensajes que puedan llegar a GuiGetMsg(). Sí, tenía claro que para un diálogo iba a ser que no porque no es una ventana AutoIt. ¿Pero y si hacemos una ventana AutoIt? La clase es "AutoIt v3 GUI", está comentada en el código. Si creáis una de esas efectivamente vuelve a aparecer el icono de aplicación, pero a pesar de ser una ventana normal de AutoIT, al no estar creada con GuiCreate() ¡tampoco sirven las funciones GUI...() con lo que tampoco se pueden tomar los eventos.

¿Cómo miramos los eventos de estas ventanas? ¿Los controles también hay que crearlos con CreateWindowEx?
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
ms999
Hacker del Foro
Mensajes: 116
Registrado: 26 Ene 2011, 06:13

Re: GUI con aspa de cierre pero sin icono

Mensaje por ms999 »

Los controles los podes crear con las funciones _GuiCtrl....button, listview, o lo ue sea... igualmente debe haber un modo mas facil de lograr esto. seguire buscando, creo que vi algo parecido en el foro en ingles, pero no estoy seguro, solo me acuerdo que la solucion la dio el usuario UEZ. Quiza me equivoque y lo buscado en ese topico era otro estilo, pero vale la pena buscar.
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: GUI con aspa de cierre pero sin icono

Mensaje por Ximorro »

Pues efectivamente esas udf usan también CreateWindowEx. Gracias por la pista.

Y efectivamente en el ejemplo de _GUICtrlButton_Create veo que los eventos los controlan a base de los mensajes WM_NOTIFY y WM_COMMAND. De acuerdo, solución hay, pero es tan laborioso que creo que voy a pasar de hacer diálogos... :-(
Que tampoco lo tengo del todo claro, en el ejemplo usan GUIRegisterMsg porque los controles son especiales, ¡pero la ventana es un GUI! Si acaso lo pruebo luego pero si la ventana principal también está hecha con CreateWindowEx puede que GUIRegisterMsg no funcione...

¡Si sólo se pudiera quitar el iconito a una ventana normal!

Editado: Comprobado, si creo ventana y controles con CreateWindowEx efectivamente los controles aparecen en la ventana, pero no puedo capturar los eventos con GUIRegisterMsg, ni siquiera creando una ventana de clase "AutoIt v3 GUI". Así que no sé cómo habrá que mirar los eventos, es que no puedo ni cerrar la ventana con la famosa aspa de la barra de título.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Responder