Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Inicialización de ventana: Dimensiones de marco etc etc.

Iniciado por Manu343726, 16 de Diciembre de 2012, 09:55:53 PM

« anterior - próximo »

Manu343726

Buenas.

Estoy mirando el tema de dimensionar la ventana teniendo en cuenta el marco, para que la región de dibujo de la ventana salga con el tamaño que nosotros queremos. Es algo que [EX3] me comentó en el gamevelop de noviembre y que había dejado aparcado.

Creo que ya es hora.

La cosa es que he estado echando un ojo al código original, y he visto que primero llamas a SetWindowRegn() y luego a MoveWindow() para redimensionarla como querías.
Es necesario llamar primero a SetWindowRegn() ? No actualiza automáticamente el tamaño de la región de dibujo al redimensionar la ventana?

EDIT: Ahora que lo pienso, eso tiene sentido. Por eso el "escalado" que hace al redimensionar la ventana. La resolución de la región de dibujo sigue siendo la misma, me equivoco?

Sobre el resto creo que no tengo ninguna duda. Era por curiosidad.

[EX3]

Cita de: Manu343726 en 16 de Diciembre de 2012, 09:55:53 PM
Es necesario llamar primero a SetWindowRegn() ? No actualiza automáticamente el tamaño de la región de dibujo al redimensionar la ventana?

EDIT: Ahora que lo pienso, eso tiene sentido. Por eso el "escalado" que hace al redimensionar la ventana. La resolución de la región de dibujo sigue siendo la misma, me equivoco?
Antaño no tenia la buena costumbre de hoy dia de limpiar mi codigo despues de realizar pruebas, y este es un buen ejemplo creo.

En principio con MoveWindow() deberias poder redimensionar y ubicar la ventana sin problemas. Ahora mismo no recuerdo el por que estuve usando SetWindowRegn() pero puede que tenga que ver con su ultimo parametro que quizas forzara el redibujado de la ventana o algo por el estilo, ya que recuerdo haber tenido problemas raros con ello.


Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Manu343726

mmmm vale.

Solo una cosilla mas:

    ...
    BorderX = GetSystemMetrics(SM_CXBORDER)
    BorderY = GetSystemMetrics(SM_CYBORDER)
    EdgeX = GetSystemMetrics(SM_CXEDGE)
    EdgeY = GetSystemMetrics(SM_CYEDGE)
    CaptionY = GetSystemMetrics(SM_CYCAPTION)
   
    'Obtenemos el nuevo tamaño para la ventana y la centramos en pantalla:
    With WinRect
        .Right = Width + (BorderX * 2) + (EdgeX * 2)
        .bottom = Height + (BorderY * 2) + (EdgeY * 2) + CaptionY + MenuY
        .Left = GetSystemMetrics(SM_CXSCREEN) / 2 - (.Right / 2)
        .Top = GetSystemMetrics(SM_CYSCREEN) / 2 - (.bottom / 2)
    ...
    Call MoveWindow(hWnd, .Left, .Top, .Right, .bottom, True) ¿?
    ...


SM_CXBORDER, SM_CYBORDER, etc, son variables de configuración del sistema. Pero, en el caso de que tu ventana no fuera de estilo 3d, no deberías hacer esas sumas no?

Es decir, una ventana "flat" no tiene ni cuadro de texto, ni bordes 3d. Pero si no he entendido mal, tu lo sumas en todos los casos. Eso no es incorrecto?

Que igual me estoy haciendo un lio.....

Gracias por cierto.

PD: Supongo que es parte del código de depuración que hablábamos ayer, pero me ha entrado la curiosidad:

        If Windowed Then
            Call SetWindowRgn(hWnd, GetWindowRgn(hWnd, 0), False)
            Top = HWND_NOTOPMOST
           
            ' Recuperar barra de tareas:
            '...
       
        Else
            Call SetWindowRgn(hWnd, CreateRectRgn(0, 0, Width, Height), True)
            Top = HWND_TOPMOST
           
            ' Ocultar barra de tareas:
            '...
       
        End If


Cuando windowed = false lo entiendo, pero el otro caso ???? Si no he entendido mal la documentación de Set/GetWindowRegn(), GetWindowRegn() tiene como parámetros el manejador de ventana y la región donde volcar los datos. Y devuelve el tipo de región (http://msdn.microsoft.com/en-us/library/windows/desktop/dd144950(v=vs.85).aspx)

En segundo lugar SetWindowRegn() tiene el manejador, la región que quieres a poner, y el flag para repintar (http://msdn.microsoft.com/en-us/library/windows/desktop/dd145102(v=vs.85).aspx)

Si eso es así, no entiendo lo que haces con Call SetWindowRgn(hWnd, GetWindowRgn(hWnd, 0), False) .... ¬¬ Lo que me sorprende es que la librería no explote XD

Por supuesto cuando haces MoveWindow() todo lo que has hecho de SetRgn() queda "descartado". Pero me sorprende que esa llamada a SetWindowRegn() no de errores... 

O yo estoy muy tonto y hay algo que  no veo o la dx_lib32 es mas maravillosa de lo que pensaba XD

[EX3]

Cita de: Manu343726 en 19 de Diciembre de 2012, 07:06:38 PM
SM_CXBORDER, SM_CYBORDER, etc, son variables de configuración del sistema. Pero, en el caso de que tu ventana no fuera de estilo 3d, no deberías hacer esas sumas no?

Es decir, una ventana "flat" no tiene ni cuadro de texto, ni bordes 3d. Pero si no he entendido mal, tu lo sumas en todos los casos. Eso no es incorrecto?

Que igual me estoy haciendo un lio.....
No se si lo indique en la documentacion de la libreria pero la idea es que siempre uses ventanas con borde por defecto y que no sean reescalables/maximizables, osea, borde fijo, sin florituras 3D ni nada. No me merecia mucho la pena hacer que el codigo detectase que tipo de ventana tienes y que calculos realizar segun dicha ventana para adaptarla y tal y tal, sinceramente, con una ventana normal y corriente te basta para trabajar con Direct3D, meterse a jugar con estilos raros de bordes y demas es tonteria :)

Cita de: Manu343726 en 19 de Diciembre de 2012, 07:06:38 PM
Cuando windowed = false lo entiendo, pero el otro caso ??? ? Si no he entendido mal la documentación de Set/GetWindowRegn(), GetWindowRegn() tiene como parámetros el manejador de ventana y la región donde volcar los datos. Y devuelve el tipo de región (http://msdn.microsoft.com/en-us/library/windows/desktop/dd144950(v=vs.85).aspx)

En segundo lugar SetWindowRegn() tiene el manejador, la región que quieres a poner, y el flag para repintar (http://msdn.microsoft.com/en-us/library/windows/desktop/dd145102(v=vs.85).aspx)

Si eso es así, no entiendo lo que haces con Call SetWindowRgn(hWnd, GetWindowRgn(hWnd, 0), False) .... ¬¬ Lo que me sorprende es que la librería no explote XD

Por supuesto cuando haces MoveWindow() todo lo que has hecho de SetRgn() queda "descartado". Pero me sorprende que esa llamada a SetWindowRegn() no de errores... 
Tio, estoy seguro que quitas el codigo a las llamadas de SetWindowRgn() y todo sigue funcionan igual de bien xD En serio, hay mucha mierda sin borrar en el codigo de la ventana por que fue una de las partes que más guerra me dio en su dia. Tarde mucho tiempo en lograr que funcionara correctamente y se ve que cuando logre que funcionase lo deje tal cual :P

Sobre que no de errores esa llamada, como tu dices, MoveWindow() descarta o se pasa por el forro todo lo que haga esa funcion ya que se ejecuta despues.

Parece que no pero el tema de gestion de ventanas en Windows dio giros muy raros entre Windows 98/XP/Vista, de ahi que esta parte del proyecto me diera tantos problemas.

Cita de: Manu343726 en 19 de Diciembre de 2012, 07:06:38 PM
O yo estoy muy tonto y hay algo que  no veo o la dx_lib32 es mas maravillosa de lo que pensaba XD
dx_lib32 es uno de esos proyectos en Visual Basic 6.0 que ni su autor sabe por que logra funcionar incluso hoy dia xD

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.