2010-05-01 5 views
2

Je pense à créer un programme de dessin avec des calques et à utiliser GDI + pour les afficher. Je veux utiliser GDI + car il prend en charge la transparence. Le fait est que dessiner des lignes sur le DC est très rapide, mais dessiner directement sur un bitmap est très lent. Ce n'est que rapide si vous verrouillez les bits et commencez à définir des pixels. Puis-je dessiner sur plusieurs DC dans mon événement WM_PAINT, puis faire DrawBitmap pour chaque couche sur le MemDC? Quelle est la meilleure façon d'y arriver?Calques avec GDI +

Merci

Répondre

2

GDI + est certainement assez rapide pour un programme de dessin. Je l'utilise (à partir de C#) pour l'animation à haute vitesse (> 30 fps).

Il semble que vous souhaitiez pouvoir manipuler des pixels individuels. C'est très rapide avec LockBits, et bien qu'il soit légèrement maladroit à utiliser en C# (nécessitant un pointeur et la balise unsafe), il ne semble pas que cela soit aussi difficile en C++.

Vous ne souhaitez probablement pas copier plusieurs couches directement sur votre surface de contrôle à l'intérieur d'un événement de peinture. Au lieu de cela, ce rendu devrait être fait à un tampon hors-écran (B1). Une fois B1 dessiné avec toutes les opérations de copie/dessin terminées, copiez-le dans un second tampon hors écran (B2), puis invalidez/rafraîchissez votre surface de contrôle. Dans l'événement de peinture du contrôle, vous copiez de B2 vers la surface visible. Vous ne voulez pas dessiner directement sur la surface visible avec une opération de dessin en plusieurs étapes, car il en résultera une forme de scintillement (parfois l'écran se repeindra alors que votre code n'est qu'à mi-chemin d'une opération à plusieurs étapes). , donc l'utilisateur voit un cadre semi-fini occasionnel).

Vous pouvez effectuer un rendu sur un seul tampon hors écran et en copier une copie sur la surface visible de l'événement paint. La principale complication ici est que vous devez traiter d'une manière ou d'une autre des événements de peinture "parasites", c'est-à-dire des événements non provoqués par votre invalidation intentionnelle du contrôle mais par autre chose (comme un utilisateur faisant glisser une autre fenêtre). Si vous copiez du tampon hors-écran à la surface et que le tampon n'est qu'à moitié tracé, vous obtiendrez un scintillement. Si vous bloquez dans l'événement paint jusqu'à ce que le dessin du tampon soit terminé, vous verrez des "traces de formulaire" sur votre contrôle, ce qui est encore pire.

La solution est l'approche à double tampon décrite ci-dessus. Les événements parasites (ou non parasitaires lorsque vous invalidez) seront copiés à partir de B2, qui est toujours entièrement rendu et mis à jour - donc pas de scintillement. La double mise en mémoire tampon utilise plus de mémoire, mais dans un programme de dessin comportant plusieurs calques, ce n'est pas grave.