2010-02-16 5 views
5

Existe-t-il une méthode rapide et préférée de défilement dans un contrôle utilisateur dans GDI +?Comment faire défiler légitimement avec GDI +?

J'ai créé un contrôle qui affiche graphiquement un tracé de données défilant horizontalement.

Actuellement, ma commande opère en convertissant la position d'une barre de défilement horizontale en un décalage dans les données. Le contrôle restitue ensuite les données qui existent entre ce point de départ et un point final calculé en fonction de la largeur du contrôle.

Cette méthode fonctionne, mais elle est très lente. Je ne souhaite pas avoir à redessiner manuellement toute la surface de contrôle à chaque événement de défilement. Au lieu de cela, je voudrais initialiser le contrôle en peignant l'intégralité (ou une partie) des données graphiques sur une surface hors écran, puis faire défiler virtuellement la surface de contrôle en lui faisant lire les données graphiques pré-rendues à partir du décalage calculé par la position de la barre de défilement horizontale.

BitBlt est-il le seul moyen de le faire? Dois-je vraiment copier manuellement les données graphiques d'une surface à l'autre? Est-ce que je ne peux pas simplement prendre en charge l'événement Paint et l'amener à lire les données de la surface hors écran pendant le rendu? De cette façon, la copie et l'action de rendu sont une seule et même chose. Ou, devrais-je faire quelque chose comme de la peinture directement sur un panneau de contrôle et ensuite faire défiler le panneau lui-même de gauche à droite?

CLARIFICATION: Essentiellement, je veux connaître la bonne façon de faire défiler les données pré-rendus. Comment fait-on défiler les données graphiques dans un contrôle? Redessiner le graphique pré-rendu n'est PAS une option correcte.

+0

Quelle peut la surface de l'ensemble de la parcelle scrollable obtenir? Dessinez-vous toujours tous les points ou seulement ceux que vous connaissez sont visibles? –

+0

Je dessine uniquement les points situés dans la zone visible. La zone entière de l'intrigue peut être jusqu'à 200 fois la largeur du contrôle. Je voudrais créer un tampon graphique sur le double de la taille de la surface de contrôle et remplir le tampon si nécessaire en lisant uniquement les données nécessaires dans une taille de bloc définie. – James

Répondre

3

Oui, j'essaierais de double-buffering. Si vous affichez un bitmap hors écran, vous pouvez simplement faire défiler le bitmap.

Vous pouvez essayer de rendre le graphique entier à une grande image bitmap et laisser les barres de défilement le déplacer. Toutefois, si votre graphique est extrêmement volumineux, vous devrez limiter la taille de l'image bitmap à la zone visible, peindre uniquement ce qui est visible et gérer le défilement virtuellement tel que vous le faites actuellement. Test sur Windows XP 32 bits, j'ai trouvé que la limitation se situait autour de 237,9 millions de pixels. C'est certainement beaucoup pour la plupart des contrôles, mais cela peut ne pas suffire pour votre application.

Pour les curieux, voici les tailles bitmap de Windows maximale, nous avons pu créer et utiliser:

 
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

Comment "faire simplement défiler le bitmap?" En copiant mautiquement les zones du bitmap hors écran vers le bitmap à l'écran? En passant une référence et un décalage de défilement dans une certaine fonction GDI +? – James

+1

En C#, plusieurs substitutions Graphics.DrawImage permettent de dessiner une partie d'une image vers un emplacement spécifié. Vous pouvez créer une image bitmap, puis dessiner le rectangle à partir de l'emplacement de défilement et la taille de la zone visible du contrôle. –

+0

@ James, oui, c'est ce que Paul voulait dire.Votre question, "Je ne peux pas simplement prendre en charge l'événement Paint et le faire lire les données de la surface hors écran comme il rend?" montre votre malentendu. L'événement Paint lui-même ne fait rien - il ne rend pas; il indique simplement à votre code que l'informatique doit dessiner quelque chose. Donc, dessiner une partie de votre image pré-rendue avec DrawImage() est un moyen correct de faire défiler. – Qwertie

Questions connexes