DDB store pixel value in some "optimized" device-specific format. DIB allows you to specify what format to use - RGBA32, BGRA32, RGB565, etc.. Because device can operate with pixels values with different performance theoretically DDB gives better performance.
That said, you should not really care about this. This was relevant only for Windows 3.x, maybe some of Win9x. After that it is pretty much irrelevant. You should really do your own rendering, pixel-filling, etc with your bitmap and just upload big image to GDI. It gives you more flexibility, better options for optimization (SSE, AVX instructions?), and easier way to do cross-platform code. And I would suggest to look at OpenGL or D3D to upload final image buffer to window (Casey chose OpenGL). It will give you significantly better performance.
BitBlt only copies pixels. StretchDIBits allows to resize the rectangle you are copying. This means it has more complex code, thus potentially slower.
If you want to use DIB-like structure just for setting whole DC, you can use SetDIBits. But if I remember correctly it won't allow to specify offset where to put it - it will always be (0,0).
Alternative is to create DIB bitmap (CreateDIBSection) which can give you pointer to its memory. Then create DC context for this bitmap (CreateCompatibleDC + SelectObject). Then you'll be able to use BitBlt to copy pixels from your bitmap to destination DC.