Hola Tolo yo mas de lo que dice la msdn no te voy a poder explicar pero voy a tratar de decirtelo en criollo como decimos en Argentina que es a como yo entiendo o lo uso
CreateCompatibleDC como dice la palabra crea un DC o hdc, luego lo suelo utilizar acomapado de CreateCompatibleBitmap
CreateCompatibleBitmap como dice la palabra crea un bitmap (mapa de bits) ahora bien todo hdc tiene objetos asociados, Brocha, pen, font, bitmap, paleta y algunas cosas mas que ahora no recuerdo, bien entonces cuando utilizao CreateCompatibleBitmap ese hbitmap se lo asigno a el hdc devuelto por CreateCompatibleDC (SelectObject(hDC, hBmp) ) el api SelectObject es quien se encarga de asociar ese bmp al DC, SelectObject en este caso retorno el viejo bmp que tenia ese hdc, el que luego deveremos devolver a ese hdc porque es windows quien se encargara de elminarlo, tu tendras que eliminar el que creaste con CreateCompatibleBitmap
enfocando ahora en SelectObject si al hdc le hubieras asociado una fuente SelectObject retornaria la vieja fuente del hdc.
DeleteObject elemina a esos objectos bitmap, brochas, pen, fonts etc etc
ReleaseDC se usa para GetDC
DeleteDC se usa para CreateCompatibleDC tambien se pude utilizar DeleteObject
ahora vamos a un ejemplo para que se entienda mejor, vamos a crear un lienzo o hdc virtual no se bien como llamarlo porque algunos le dicen de otra forma pero la idea seria por ejemplo no depender de un picturebox para pintar algo temporalmente.
Option Explicit
Private Declare Function StretchBlt Lib "gdi32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
Private Declare Function SetStretchBltMode Lib "gdi32.dll" (ByVal hdc As Long, ByVal nStretchMode As Long) As Long
Private Declare Function BitBlt Lib "gdi32.dll" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32.dll" (ByVal hdc As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32.dll" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32.dll" (ByVal hdc As Long) As Long
Private Declare Function GdiTransparentBlt Lib "gdi32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal crTransparent As Long) As Boolean
Private Declare Function GetDC Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function SelectObject Lib "gdi32.dll" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function ReleaseDC Lib "user32.dll" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Sub Form_Load()
Dim ScreenDC As Long
Dim MiHdc As Long
Dim hBmp As Long
Dim hOldBmp As Long
Me.AutoRedraw = True
ScreenDC = GetDC(0) 'al pasar el paramentro 0 recuperamos el hdc de la pantalla
MiHdc = CreateCompatibleDC(0) 'crea un nuevo hdc
hBmp = CreateCompatibleBitmap(ScreenDC, 100, 100) ' crea un nuevo bitmap de 100x100 pixels
hOldBmp = SelectObject(MiHdc, hBmp) 'asociamos nuestro bitmap al hdc, rertorna el el viejo bmp y lo guardamos para luego restaurarlo.
BitBlt MiHdc, 0, 0, 100, 100, ScreenDC, 300, 300, vbSrcCopy 'copia parte de la pantalla en nuestro buffer
BitBlt Me.hdc, 20, 20, 100, 100, MiHdc, 0, 0, vbSrcCopy 'luego copia el buffer a nuestro formulario
SelectObject MiHdc, hOldBmp 'restaura el viejo bitmap al hdc
ReleaseDC 0&, ScreenDC 'liberamos el dc de la pantalla
DeleteDC MiHdc 'eliminamos nuestro hdc
DeleteObject hBmp 'elminamos el bmp
End Sub
este ejemplo copio parte de la pantalla la almaceno en un buffer (hdc) y luego pinto este buffer en el formulario
no tiene mucha utilidad el ejemplo pero podras entender para que sirve cada api en cuestion.
si utilizas el api loadimage esta puede retornar un bmp un icono u otros, en caso de un bmp puedes pintarlo en un form con bitblt pero antenes necesitas su hdc para ello
hBitmap=LoadImage...
PicDC = CreateCompatibleDC(0)
OldhBmp = SelectObject(PicDC, hBitmap)
listo ya tienes tu PicDC
si fuera un icono
Private Declare Function DrawIcon Lib "user32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal hIcon As Long) As Long
hIcon = LoadImage...
DrawIcon me.hdc,x,y, hIcon
espero que haya aclarado alguna duda.