Я всегда использую SetDiBitsToDevice, но drawDIBits тоже может быть в порядке (не проверял).
Что касается перевернутого характера функций Windows Blit:
Есть обходной путь. Если вы передаете в функцию структуру BITMAPINFOHEADER или BITMAPINFO, просто отрицаете значение в элементе bitmap-height. Это скажет GDI сделать блиц, как если бы высота была положительной, но интерпретировать данные как данные, хранящиеся в порядке сверху вниз.
Вы также можете получить хорошее улучшение скорости с помощью этого "хака".
Если вы хотите изменить порядок байтов пикселей (например, превратить ARGB в BGRA или около того), вы можете использовать структуру BITMAPV4HEADER и сообщить GDI, как организованы ваши данные пикселей. Это функциональность, которая используется редко, но работает с WIN98. Я бы сказал, что теперь это безопасно, чтобы использовать его ..