At the beginning two device contexts are retrieved:
- source device context from an active form
- destination device context from a default printer -- PrintDlg is used
It is not possible to transfer bitmap data directly between these device contexts -- at least to my knowledge. That is why you need a mediator -- the compatible device context and the compatible bitmap selected into it.
The compatible means that these both have properties similar to their form counterparts.
Bitmap information (both headers and data) is copied from the form to the compatible bitmap via the BitBlt function. Then device-independent bitmap data is selected from this temporary bitmap via the GetDIBits, next to be sent to the printer device context using the StretchDIBits function.
To keep the code short several simplifications have been made: only one page is printed regardless of the size of the form; no control of the page orientation.
The PRINTDLG structure, one used to initialize the printer settings, is mostly populated with zeros. That means all default printing settings are applied: one copy, all pages, portrait etc. To switch, for example, to the album orientation, populate correspondent members of this structure. Check this example.