Un device context è un astrazione di dispositivo su cui disegnare. Di fatto può essere una stampante, lo schermo, l'area client o l'intera area di una finestra, una bitmap, qualunque cosa "disegnabile" (e ovviamente supportata dalle Windows GDI), ma per il tuo codice e per le funzioni GDI di Windows sarà sempre un device context; in questa maniera puoi disegnare su una stampante così come sullo schermo in maniera esattamente identica. Un esempio in C99/C++:
codice:
//presuppone che sia stato incluso windows.h
//tutto il codice di controllo degli errori è stato omesso per semplicità
//inizializzazione
HDC dcScreen, dcBitmap;
HBITMAP bmp;
//ottiene un device context per lo schermo
dcScreen = GetDC(NULL);
//crea una bitmap compatibile con lo schermo (volendo poteva essere una bitmap di qualunque genere) 800x600
bmp = CreateCompatibleBitmap(dcScreen,800,600);
//crea un compatible dc in cui selezionare la bitmap
dcBitmap = CreateCompatibleDC(dcScreen);
//seleziona la bitmap nel DC
SelectBitmap(dcBitmap,bmp);
//disegno
//seleziona in entrambi i DC una penna nera e un pennello grigio
SelectPen(dcScreen,GetStockPen(BLACK_PEN));
SelectPen(dcBitmap,GetStockPen(BLACK_PEN));
SelectBrush(dcScreen,GetStockBrush(GRAY_BRUSH));
SelectBrush(dcBitmap,GetStockBrush(GRAY_BRUSH));
//disegna un rettangolo sui due DC
Rectangle(dcScreen,10,10,50,50);
Rectangle(dcBitmap,10,10,50,50);
//cleanup
ReleaseDC(NULL,dcScreen);
DeleteDC(dcBitmap);
DeleteBitmap(bmp);
.
Da questo esempio puoi vedere che, sebbene i due DC vengano creati ed eliminati in modi differenti, per il disegno si usano esattamente nella stessa maniera, ottenendo più o meno lo stesso risultato (che ovviamente può variare in funzione della risoluzione e delle altre caratteristiche del device reale).
In questo senso intendevo dire che è l'analogo dell'oggetto Graphics: puoi ottenere un oggetto Graphics per disegnare su una bitmap, sullo schermo, su una finestra, ma comunque per disegnarci sopra userai sempre gli stessi metodi. In ogni caso tieni conto che avrai a che fare con il metodo FromHdc solamente se dovrai lavorare in situazioni miste managed-unmanaged; non è una funzione utile all'interno di GDI+, è piuttosto un ponte tra Windows GDI e GDI+.
Per ulteriori informazioni consulta il link che ti ho dato prima, e in particolare questa sezione.