2010-05-06 22 views
7

En tant que nouveau venu relativement au MFC, je vois beaucoup de contextes de périphériques (DC). Je comprends vaguement que c'est quelque chose à voir avec le dessin, mais les détails ne sont pas très bien expliqués partout où je peux trouver. Que signifie la création d'un «contexte de périphérique compatible» et pourquoi est-ce important? Que fait SelectObject, et comment dois-je faire un DC compatible en premier?Comprendre les contextes de périphériques

Répondre

11

Un contexte de périphérique est juste un endroit où le dessin se produit, donc si vous avez deux DC différents, vous dessinez à deux endroits différents. Un peu comme une poignée de fichier.

Les contextes de périphériques peuvent se référer à l'immobilier à l'écran, ou aux bitmaps qui résident en mémoire, et probablement d'autres endroits, aussi, ce sont juste les deux que je peux penser pour le moment.

Les contextes compatibles sont ceux qui ont la même organisation de pixels sous-jacente, ce qui signifie le nombre de bits par pixel, les octets par pixel, l'organisation des couleurs et ainsi de suite. Les contextes de mémoire bitmap mémoire peuvent avoir n'importe quelle organisation que vous voulez, mais vos contextes d'écran vont être liés (éventuellement) à des tampons sur votre carte graphique, qui (en fonction du mode, etc) auront une organisation de pixels très spécifique. Avoir des contextes compatibles signifie qu'il est efficace de transférer des données d'image entre eux, car peu ou pas de traduction des données est nécessaire. À l'autre extrême, si vous avez une palette de 256 couleurs, une carte de 8 bits et que vous essayez de l'appliquer à un écran comportant 8 bits de RGBA par pixel, chaque pixel nécessitera un massage important car il est copié et donc incompatible bitmaps est beaucoup plus lent. Selon la documentation Win32 SDK, au moins BitBlt() et StretchBlt() "convertissent le format de couleur source pour correspondre au format de destination", de sorte que cela peut être fait.

Recherchez CreateCompatibleDC() et CreateCompatibleBitmap() comme points de départ pour créer des contextes de dessin compatibles avec ceux déjà existants.

SelectObject() contrôle quelles ressources sont actuellement actives dans le contexte du périphérique. Un contexte a un stylo, une brosse, une police et un bitmap en cours. Ceux-ci simplifient beaucoup d'autres appels GDI en vous permettant de spécifier moins de paramètres. Par exemple, vous n'avez pas besoin de spécifier la police lorsque vous utilisez TextOut(), mais si vous voulez changer la police, c'est là qu'intervient SelectObject(). Si vous alimentez SelectObject() un handle vers une police, le retour value est un handle de la police en vigueur et les opérations suivantes utilisent la nouvelle police. Le comportement est le même pour les autres types de ressources, stylos, pinceaux, etc

+0

Merci! Quelques questions de suivi à ce sujet, alors: Pouvez-vous utiliser des contrôleurs de domaine non compatibles, et toujours avoir un programme de travail (bien que beaucoup plus lent)? Et où SelectObject entre-t-il dans le concept de compatibilité de contexte de périphérique? – Smashery

+0

@Smashery: édité un peu pour mieux résoudre ces problèmes. – JustJeff

+0

Merci - une réponse très claire et utile! – Smashery