2010-05-06 3 views
7

Come nuovo arrivato relativo a MFC, vedo contesti dispositivo (DC) molto. Capisco vagamente che è qualcosa a che fare con il disegno, ma le specifiche non sono spiegate molto bene da nessuna parte che riesco a trovare. Che cosa significa creare un "contesto dispositivo compatibile" e perché è importante? Che cosa fa SelectObject e come devo prima creare una DC compatibile?Informazioni sui contesti del dispositivo

risposta

11

Un Device Context è solo un luogo in cui si verifica il disegno, quindi se hai due DC diversi, stai disegnando in due posti diversi. Un po 'come un handle di file.

I contesti dispositivo possono fare riferimento a beni immobili sullo schermo o a bitmap che si trovano solo nella memoria, e probabilmente anche in altri posti, quelli sono solo i due a cui riesco a pensare al momento.

I contesti compatibili sono quelli che hanno la stessa organizzazione di pixel sottostante, per cui si intende il numero di bit per pixel, i byte per pixel, l'organizzazione del colore e così via. I contesti del dispositivo di memoria bitmap possono avere qualsiasi organizzazione desiderata, ma i contesti dello schermo saranno correlati (eventualmente) ai buffer della scheda grafica, che avranno (a seconda della modalità, ecc.) Un'organizzazione dei pixel molto specifica.

In contesti compatibili significa che è efficiente trasferire dati di immagine tra di loro, poiché è richiesta una traduzione minima o nulla dei dati. All'altro estremo, se si dispone di una tavolozza di colori a 256 bit, mappa a 8 bit e si tenta di eseguire il blit su uno schermo con 8 bit ciascuno di RGBA per pixel, ogni pixel richiederà un massaggio significativo in quanto viene copiato e quindi non compatibile le bitmap sono molto più lente. Secondo la documentazione dell'SDK Win32, almeno BitBlt() e StretchBlt() "convertono il formato del colore sorgente in modo che corrisponda al formato di destinazione", quindi può essere fatto.

Ricercare CreateCompatibleDC() e CreateCompatibleBitmap() come punti di partenza per la creazione di contesti di disegno compatibili con quelli già esistenti.

SelectObject() controlla quali risorse sono attualmente attive nel contesto del dispositivo. Un contesto ha una penna, un pennello, un font e una bitmap correnti. Queste rendono più semplici le altre chiamate GDI consentendo di specificare un numero inferiore di parametri. Ad esempio, non è necessario specificare il carattere quando si utilizza TextOut(), ma se si desidera modificare il carattere, è qui che entra SelectObject(). Se si alimenta SelectObject() un handle per un carattere, il ritorno value è un handle per il font che era in vigore e le operazioni successive usano il nuovo font. Il comportamento è lo stesso per gli altri tipi di risorse, penne, pennelli, ecc.

+0

Grazie! Alcune domande di follow-up su questo, quindi: puoi utilizzare DC non compatibili e avere ancora un programma funzionante (anche se molto più lento)? E dove entra SelectObject nel concetto di compatibilità del contesto del dispositivo? – Smashery

+0

@Smashery: modificato un po 'per risolvere meglio questi problemi. – JustJeff

+0

Grazie - una risposta molto chiara e utile! – Smashery