2010-02-16 14 views
5

¿Existe un método preferido y rápido para desplazarse dentro de un control de usuario en GDI +?¿Cómo se puede desplazar legítimamente con GDI +?

He creado un control que representa gráficamente un gráfico de datos desplazables horizontalmente.

Actualmente, mi control funciona al convertir la posición de una barra de desplazamiento horizontal en un desplazamiento en los datos. Luego, el control representa los datos que existen entre este punto inicial y uno final calculado en función del ancho del control.

Este método funciona, pero es muy lento. No deseo tener que volver a dibujar manualmente toda la superficie de control en cada evento de desplazamiento. Más bien, me gustaría inicializar el control pintando la totalidad (o una parte) de los datos gráficos en una superficie fuera de pantalla, y luego desplazar virtualmente la superficie de control haciendo que lea los datos gráficos pretratados comenzando en el desplazamiento calculado por la posición de la barra de desplazamiento horizontal.

¿BitBlt es la única forma de hacerlo? ¿Realmente tengo que copiar manualmente los datos gráficos de una superficie a otra? ¿No puedo simplemente asumir el evento Paint y hacer que lea los datos de la superficie fuera de la pantalla a medida que se renderiza? De esta forma, la acción de copiar y renderizar es una en la misma.

O, ¿debería hacer algo como pintar directamente en el control de un Panel y luego simplemente desplazar el panel de izquierda a derecha?

ACLARACIÓN: Básicamente, quiero saber la forma correcta de desplazar los datos pretratados. ¿Cómo se puede desplazar datos gráficos dentro de un control? Redibujar el gráfico preprocesado NO es una opción correcta.

+0

¿Qué tan grande puede la superficie de toda la trama desplazable conseguir? ¿Siempre dibujas todos los puntos o solo los que sabes que son visibles? –

+0

Solo dibujo los puntos que están dentro del área visible. El área completa de la trama puede ser hasta 200 veces el ancho del control. Me gustaría crear un búfer gráfico de aproximadamente el doble del tamaño de la superficie de control y rellenar el búfer cuando sea necesario leyendo solo los datos necesarios en un tamaño de fragmento determinado. – James

Respuesta

3

Sí, probaría el doble almacenamiento en el búfer. Si renderiza en un mapa de bits fuera de la pantalla, puede desplazar el mapa de bits.

Puede intentar renderizar todo el gráfico en un mapa de bits grande y dejar que las barras de desplazamiento lo muevan. Sin embargo, si su gráfica es extremadamente grande, necesitará limitar el tamaño del mapa de bits al área visible, pintar solo lo que sea visible para él y manejar el desplazamiento virtualmente tal como está ahora.

Al probar en Windows XP de 32 bits, encontré que la limitación es de unos 237,9 millones de píxeles. Eso es ciertamente suficiente para la mayoría de los controles, pero puede no ser suficiente para su aplicación.

Para los curiosos, aquí es el máximo tamaño de mapa de bits de Windows hemos sido capaces de crear y utilizar:

 
Width Height Area (pixels) 
====== ====== =========== 
32,767 7,261 237,921,187 
25,000 9,517 237,925,000 
23,792 10,000 237,920,000 
20,000 11,896 237,920,000 
15,861 15,000 237,915,000 
15,000 15,861 237,915,000 
11,896 20,000 237,920,000 
10,000 23,792 237,920,000 
9,517 25,000 237,925,000 
7,261 32,767 237,921,187 
+1

¿Cómo se puede "desplazar el mapa de bits?" ¿Al copiar de forma manual las áreas del mapa de bits fuera de la pantalla al mapa de bits en pantalla? ¿Al pasar una referencia y desplazamiento de desplazamiento hacia una determinada función GDI +? – James

+1

En C#, hay varias anulaciones de Graphics.DrawImage que le permiten dibujar parte de una imagen en una ubicación especificada. Puede construir un mapa de bits, luego dibujar el rectángulo que comienza en la ubicación de desplazamiento y el tamaño del área visible del control. –

+0

@James, sí, eso es lo que Pablo quiso decir.Su pregunta, "¿No puedo simplemente asumir el evento Paint y hacer que lea los datos de la superficie fuera de la pantalla a medida que se renderiza?" muestra tu malentendido. El evento Paint en sí no hace nada; no se procesa; simplemente notifica a su código que TI necesita dibujar algo. Entonces, dibujar parte de la imagen pretratada con DrawImage() es una forma correcta de desplazarse. – Qwertie

Cuestiones relacionadas