Pregunta

Fondo:Tengo una pequeña aplicación de reproducción de vídeo con una interfaz de usuario inspirada en el venerable Sasami2k, recién actualizada para usar VMR9 (es decir,Direct3D9 con DirectShow) y ser menos inestable.Actualmente, es una aplicación C++ que utiliza Win32 sin formato, por necesidad:Ninguno de los diversos kits de herramientas vale un carajo.WPF, en particular, no fue posible debido a las restricciones de su espacio aéreo.

Bien, ahora que existe D3DImage, podría ser viable mezclar y combinar D3D/VMR9/DirectShow y WPF.Dadas las frustraciones pasadas por la inextensibilidad de Win32, esto parece algo bueno.

Pero ya sabes, estoy cayendo ante el primer obstáculo.

Con Win32 he creado (muy fácilmente) una ventana sin bordes cuyo tamaño se puede cambiar proporcionalmente, se ajusta a los bordes de la pantalla y ocupa toda la pantalla (incluido el área de la barra de tareas) cuando está maximizada.Es una aplicación de vídeo, por lo que todas estas son propiedades bastante deseables.

Bien, entonces, ¿cómo hacer lo mismo con WPF?

En Win32 uso:Wm_getminmaxinfo para controlar el comportamiento de maximizar wm_nchittest para controlar los bordes de cambio de tamaño wm_moving para controlar el snap-to screen-bordes wm_singing para controlar la relación de reaminicionamiento

Sin embargo, al observar WPF, parece que los distintos eventos llegan demasiado tarde, a menos que no entienda bien la documentación.

Por ejemplo, no sé cuándo estoy en medio de un movimiento, ya que LocationChanged dice que se activa solo una vez que la ventana se ha movido (lo cual es demasiado tarde).De manera similar, parece que StateChanged solo se activa una vez que la ventana ha sido restaurada/maximizada (cuando necesito la información antes de maximizar, para indicarle al sistema el tamaño de maximización correcto).

Y parece que estoy pasando por alto por completo dónde me dice el sistema sobre los cambios de tamaño.Lo mismo ocurre con las pruebas de impacto.

Entonces, ¿me estoy perdiendo algo aquí, o no tengo más remedio que volver a conectar el wndproc de esta cosa de todos modos?¿Puedo hacer lo que quiero sin conectar el WndProc?

Si tengo que usar WndProc, también podría seguir con mi código base existente;Quiero tener un código de interfaz de usuario más simple y limpio, y alejarme de WndProc es fundamental para lograrlo.

Si tengo que conectar el WndProc, me pregunto:por qué?Win32 tiene los mensajes de ventana de tamaño/tamaño, movimiento/movido, poscambio/poscambio, y todos son útiles.¿Por qué WPF no replicaría el mismo conjunto de eventos?Parece una brecha innecesaria en la funcionalidad.

Además, significa que WPF está vinculado a una implementación específica dependiente de USER32.Esto significa que MS no puede (en Windows 7 u 8, digamos) invertir la capa de visualización para hacer que WPF sea "nativo" y emular HWND y WndProcs para aplicaciones heredadas, aunque esto es precisamente lo que MS debería hacer.

¿Fue útil?

Solución

Y parece que estoy pasando por alto por completo dónde me dice el sistema sobre los cambios de tamaño.Lo mismo ocurre con las pruebas de impacto.

Para cambiar el tamaño, de hecho te falta el TamañoCambiado evento.AFAIK, lamentablemente no hay ningún evento OnSizeChanging, OnLocationChanging y OnStateChanging en un Ventana en la red


Lo vi, pero hasta donde sé, solo se activa después de que el tamaño ha cambiado, mientras que necesito que el evento se active durante el cambio de tamaño.¿A menos que esté leyendo mal los documentos y en realidad dispara continuamente?

No dispara continuamente pero probablemente puedas usar el Cambiar tamañoComenzar y Cambiar tamañoFin eventos y poder hacerlo.


¿No son eventos de WinForms?

Mmm, tienes razón.

Otros consejos

Bien, para responder a mi propia pregunta, me faltaban Adorners (nunca volví a aparecer en ninguna de las búsquedas que hice, por lo que no parece que sean tan conocidos como quizás deberían ser).

Desafortunadamente, parecen bastante más complejos que las anulaciones de WndProc, pero creo que debería ser posible manipularlos para que hagan lo que quiero.

En el código, puede establecer la propiedad WindowStyle en "Ninguno" y WindowsState en "Maximizado".

No estoy seguro de cómo se vería Xaml.

¿Quizás puedas anular ArrangeOverride y/o MeasureOverride para compensar los eventos de cambio de tamaño que faltan?Medir es el primer paso y ocurre cuando un diseño necesita ajustarse a un nuevo tamaño, por lo que es como un evento de cambio de tamaño.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top