Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problemillas Con Changedisplaysettings()

Iniciado por _Grey, 08 de Mayo de 2006, 06:06:05 AM

« anterior - próximo »

_Grey

 Estoy usando ChangeDisplaySettings() para poner mi aplicación en pantalla completa, en un principio funciona bien, pero e detectado algunos problemas;

1º- Cuando pongo a pantalla completa se ve la barra de tareas durante un segundo aprox. y si el usuario es hábil puede situarse encima y clickar, haciendo perder el foco a la aplicación que entra en fullscreen.

2º- cuando  salgo de pantalla completa, las ventanas pueden haber cambiado de posición y de tamaño.

no se no se- Al salir de fullscreen, parece que el sistema tarda algo en reaccionar, sacar la barra de tareas si me coloco encima cuando esta oculta, por ejemplo, si bien este ultimo punto puede ser normal...

Alguien sabe como solucionar los 2 primeros puntos por lo menos!? Estoy en Win32Api "pelao".

Gracias,saludos.

zupervaca

 1- Quita toda la decoracion de la ventana antes de entrar en modo a pantalla completa, deja solo WS_POPUP | WS_VISIBLE, ademas hazla lo mas grande posible.
2- Esto no tiene solucion ya que es cosa del sistema, como mucho puedes poner la tuya donde quieras, suele pasar cuado pasas de una resolucion a pantalla completa mas pequeña a una de escritorio mas grande, incluso si estas con el visual c++ 6.0 puede que la ventana de este parezca que esta maximidad, pero realmente no lo esta, le das y se raya :P

_Grey

 1- La verdad es que lo hacia justo despues del ChangeDisplaySettings() y sin WS_VISIBLE, pero poniendo ese flag y haciendolo antes del ChangeDisplaySettings() sigue ocurriendo...y es una putada, por que la tengo programada para que si pierde el foco (ALt+Tab) quite el modo fullscreen :( , y me lo destrempa todo.

2-  (nooo)

Pongo el codigo por si fuera de utilidad; pertenece a una clase y usa variables miembro, pero se "ve" el funcionamiento....:

// Pone la ventana a pantalla completa (x,y,modo de color,Hz)
bool Window::SetFullScreen(int x,int y,ColorMode cm,int hz){

bool creada;
DEVMODE ModoPantalla;

// Si no esta creada, la crea
if(!GetProperty(CREATE)){
 Create(true);
 creada=true;
} else creada=false;

// Pone pantalla completa
ModoPantalla.dmSize   = sizeof(DEVMODE); // Tamaño de la estructura
ModoPantalla.dmBitsPerPel = (cm==COLOR8INDEX)?8:(cm==COLOR16RGB)?16:(cm==COLOR24RGB)?24:32;// Profundidad de color
ModoPantalla.dmPelsWidth = x;     // Ancho
ModoPantalla.dmPelsHeight = y;     // Alto
ModoPantalla.dmDisplayFrequency = hz;    // Refresco
ModoPantalla.dmFields  = DM_PELSWIDTH |  // VALORES A USAR DE LA ESTRUCTURA
        DM_PELSHEIGHT |
        DM_BITSPERPEL |
        DM_DISPLAYFREQUENCY;

// Pone pantalla completa
if(!(ChangeDisplaySettings(&ModoPantalla,0)==DISP_CHANGE_SUCCESSFUL)){
 // No pudo poner pantalla completa
 if(creada) // Se creo en la funcion, la destruye
  Destroy();
 return false;
}

// Fuerza estilo WS_POPUP, necesario para ventana a pantalla completa
m_bFullScreen=true;
SetWindowLong(m_hWnd,GWL_STYLE,WS_POPUP);
m_nXFullScreen=x;
m_nYFullScreen=y;
m_cmFullScreen=cm;
m_nHZ=hz;
SetWindowPos(m_hWnd,HWND_TOP,0,0,x,y,SWP_SHOWWINDOW); // Se asegura que sea la visible

return true;
}

// Sale de pantalla completa
void Window::FullScreenExit(){

DEVMODE ModoPantalla;

if(!m_bFullScreen) return;

// Coge modo de pantalla del systema
EnumDisplaySettings(NULL,ENUM_REGISTRY_SETTINGS,&ModoPantalla);

// y lo restaura
ChangeDisplaySettings(&ModoPantalla,0); // AQUI SE CAMBIAN LOS m_uWidth y m_uHeight

// Desactiva flag m_bFullScreen(para que funcionen SetSixe() y SetPosition())
m_bFullScreen=false;

// Restaura la ventana normalmente
if(GetProperty(CREATE)){
 // Restaura estilo,posicion y tamaño de ventana
 SetWindowLong(m_hWnd,GWL_STYLE,GetStyleWindow(m_wtWindowType));
 //SetWindowPos(m_hWnd,HWND_TOP,m_uX,m_uY,m_uWidth,m_uHeight,SWP_SHOWWINDOW); // Se asegura que sea la visible
 SetPosition(m_uX,m_uY);
 SetSize(m_uWidth,m_uHeight);
 //SetSize(m_uWidthAfterFS,m_uHeightAfterFS);
 //SetSize(w,h);
 ShowWindow(m_hWnd,true);
}

RedrawWindow(NULL,NULL,NULL,RDW_UPDATENOW);
InvalidateRect(NULL,NULL,true);
}


Uso Win32Api, nada de DirectX, asi que quiza no tenga mas que aguantarme con estos problemas, pero incluso una comfirmacion de lo peor seria de utilidad, le dejaria de dar vueltas y trataria de adaptarme.

Saludos y gracias.

fiero

 Hola _Grey,

Acabo de probar mi aplicación y me ha pasado eso de la barra mostrandose 1 seg al cambiar a completa, pero ahora llevo un rato probando y no me ha vuelto a pasar  :huh:

Para salir de dudas y ver que mi programa funciona igual que el tuyo entra en este ejemplo con mi plugin http://www.devalvr.com/paginas/soporte/cli...kablevideo.html (instala el plugin si te lo pide)

Selecciona en el menú del botón derecho "Debug->Usar superficies GDI". Si haces esto no utiliza nada de DX, solo funciones del Windows API, y cambia a pantalla comnpleta con ChangeDisplaySettings. Comprueba si funciona como tu programa. Puedes cambiar el modo pantalla completa desde el menú contextual.

un saludo
www.videopanoramas.com Videopanoramas 3D player

_Grey

 
CitarAcabo de probar mi aplicación y me ha pasado eso de la barra mostrandose 1 seg al cambiar a completa, pero ahora llevo un rato probando y no me ha vuelto a pasar huh.gif

Eso mismo es lo que hace, a veces parece que no ocurre y otras si. En tu aplicación e llegado a tener tiempo de situarme encima y clickar a otra tarea con la consiguiente salida al escritorio.

He estado trasteando con tu plugin, no me cambiaba las ventanas de lugar, pensé que seria por que usa la misma resolución que el escritorio, pero cambiándola tampoco afectaba a estas. He estado trasteando un poco y ya esta solucionado, no usaba el flag CDS_FULLSCREEN  (nooo) , que horror, casi me da vergüenza, lo dejaba a 0... como la mayoría de los ejemplos que la usan  :ph34r:

Eso si, el primer problema persiste, pero si también te pasa a ti, quizá sea algo normal a lo que haya que tenga que adaptarme  :(

gracias a todos.

fiero

 He descubierto una cosa curiosa. Todo esto en w2000

Entra en mi ejemplo otra vez y nada mas entrar, pincha en la pestaña de la esquina inferior-derecha del plugin para redimensionar la ventana. Arrastra la ventana hasta la barra de tareas de Windows, verás que la barra permanece por debajo de la ventana del plugin.

Ahora haz click en la pagina web donde se encuentra el plugin para que vuelva a su tamaño original y vuelve a hacer la misma operación. Ahora la ventana del plugin pasa por debajo de la barra de tareas. ¿Por qué esta diferencia? No tengo ni idea, creo que es debido a cual es la ventana activa o cual tiene el foco.

Si posicionas la pagina web de tal manera que al arrastrar la pestaña de redimensión puedas cubrir todo el escritorio, podrás obserbar que la barra de tareas permanece 1 seg encima de la ventana redimensionada, cuando arrastras la segunda vez.

El comportamiento de la barra más que con ChangeDisplaySettings, parece que tiene más que ver con si una ventana ocupa todo el área del escritorio o no. Si el problema de aparecer por encima o por debajo de la barra es tema del foco, quizás puedas cambiarlo a algún sitio para que la ventana salga por encima siempre.

(espero que se me entienda XDD, vaya pruebas raras)

un saludo
www.videopanoramas.com Videopanoramas 3D player

_Grey

 El plugin actua igual en mi XP, parece que Windows pretende actuar segun parezca que el usuario esta en el escritorio o la aplicacion se ponga en fullscreen.

Esto que has dicho del foco me a ayudado a encontrar una posible solucion; le pretendia poner el foco y en primer plano en un principio con un SetWindowPos(m_hWnd,HWND_TOP,0,0,x,y,SWP_SHOWWINDOW), despues de leer tu ultimo mensaje probe con un implicito SetFocus(), y seguia igual... pero despues de probar un poco lo hice un SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,x,y,SWP_SHOWWINDOW), y ahora si que se mantiene por encima de la barra de tareas desde un buen principio, el problema es que al quitar pantalla completa sigue encima de todo...

Lo que si que noto, es que tu plugin sale de fullscreen limpiamente y no tarda nada el escritorio en responder, pero esto quiza sea por que el bucle de mensajes de win lo tengo un poco guarro.

saludossss.

zupervaca

 Haz otro setwindowpos al salir pero con el valor HWND_NOTOPMOST, asi dejara de estar en la lista de ventanas al frente.
El problema de que tarde en responder puede ser debido a que capturas un mensaje y haces las cosas de tu app y luego capturas el siguiente, lo mejor es que trates todos los mensajes de la ventana de una vez y cuando acaben todos hagas las cosas de tu app.

_Grey

 ostras, pues si, es que cuando uno esta en el fragor de la batalla parece que uno tiene prisa en responder :P . Asi pues, arreglado lo de la barra de tareas y con correcta restauración, gracias :)

Sobre el retardo, seguro que tienes toda la razón, me lo mirare con mas paciencia.

Saludos y gracias.






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.