Pregunta

Tengo un formulario, que establece en estos estilos constructor:

this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

Y dibujar algunos rectángulos en caso Paint. No hay controles en el formulario. Hovewer, cuando cambio el tamaño de la forma, hay bandas negras en la derecha y la parte inferior del formulario. ¿Hay alguna manera de deshacerse de ellos? Lo he intentado todo, la escucha de WM_ERASEBKGND en WndProc, dibujo manualmente la forma en WM_PAINT, la implementación de aduana doble búfer, etc. ¿Hay algo más que podría intentar?

He encontrado esto: https: // connect. microsoft.com/VisualStudio/feedback/details/522441/custom-resizing-of-system-windows-window-flickers y parece que es un error en DWM, pero sólo espero que pueda hacer alguna solución.

Tenga en cuenta que debo usar el doble buffer, ya que quiero llamar la presentación gráfica muy intenso en el caso Paint. Yo desarrollo en C # .NET 2.0, Win7.

Actualización de estado 1

Me las he arreglado para deshacerse de la mayor parte de las rayas negras mediante la implementación de la funcionalidad de cambio de tamaño por mí mismo. Hovewer todavía hay algunos pequeños fallos. ¿Hay alguna manera de hacer resize y operación paint a la vez? Aquí es un pseudo-código de lo que tiene que hacer:

IntPtr hDC;
var size = new Size(250, 200);
IntPtr handle = API.PaintAndResizeBegin(this.Handle /* Form.Handle */,
                                        size.Width, size.Height, out hDC);
using (var g = Graphics.FromHdc(hDC)) {
    this.backBuffer.Render(g, size);
}
API.PaintAndResizeCommit(handle);

¿Hay alguna manera de ejecutar el código anterior?

La segunda solución podría ser back-buffer forma entera, incluyendo el área de no cliente. Pero, ¿cómo hacer eso? No quiero para pintar el área no cliente por mí, como yo quiero mantener el efecto aerodinámico agradable en Vista / 7. Cualquier ayuda será muy apreciada.

Estado Actualización 2

Parece que este problema no tiene solución, ya que es omnipresente en Windows, en cada aplicación. Sólo podemos esperar que la EM se llevará algo de inspiración en Mac OS X y proporcionará las API apropiadas en nuevo Windows.

¿Fue útil?

Solución

he encontrado la función que se puede pintar y cambiar el tamaño de la ventana, al mismo tiempo - UpdateLayeredWindow .

Así que ahora debería ser posible crear ventanas de tamaño variable, que no tienen ningún tiras mientras se cambia de tamaño. Sin embargo, es necesario pintar el contenido de la ventana a ti mismo, por lo que es un poco incómodo. Pero creo que el uso de WPF y UpdateLayeredWindow, no debería haber ningún problema.


Actualizar

problemas encontrados. :-) Al utilizar UpdateLayeredWindow, debe pintar el borde de la ventana de uno mismo. Por lo tanto, si desea ventana estándar pintado usando UpdateLayeredWindow con un bonito efecto de cristal en win7, que se atornillan.

Conectar Microsft es aún un hilo sobre este problema, en el que Microsoft dice que es un error de diseño, y si alguna vez se fija, a continuación, probablemente en Win8 o algún sistema más nuevo. Así que no hay mucho que podríamos hacer al respecto.

Otros consejos

He descubierto que lo mejor es no hacer ninguna costumbre renderizado directamente sobre la superficie de formularios. En su lugar, poner un cuadro de imagen atracado en el formulario, crear el objeto de mapa de bits que se mostrará en el cuadro de imagen, dibujar todo en que el uso del método System.Drawing.Graphics.FromImage(Image).

Me usó ese método con un bucle de juego para hacer un juego de disparos simples (al estilo Crimsonland) y consiguió un rendimiento bastante bueno (con líneas suavizadas), por encima de 100 FPS.

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