It's a rather lengthy question and more particularly, answer.
I'm tired right now and will explain the best I can. Apologies for any lack of quality of response.
Firstly, BMP files actually use lossless compression, so they are suitable (and the easiest to deal with. PNG files can be loaded with GDI+, but that's probably best left as an improvement to an already functioning application. The main advantage with PNGs being their size on disk.
Next, you can easily use plain ol' GDI for this task. No need for anything more heavy-weight, unless loading an image file not supported by GDI (read: unless using almost any image type - BMP being a notable exception).
You can use StretchBlt to do the scaling/drawing.
Though you will need to calculate:
(a) the portion of the image you'd like to display
(b) the aspect ratio and the output dimensions. (think letter-box display for 16:9 content on a 4:3 tv, or black side-bars if showing 4:3 content on a 16:9 display) - You need to center the image in one axis, if not both (when zoomed out a long way)
Here's some code from an old project I have here. The first function requires that GDIplus has already been initialized. While the second doesn't maintain the correct aspect ratio - it just scales the image to fit the chosen window. You'd need to change that.
HBITMAP mLoadImg(WCHAR *szFilename)
{
HBITMAP result=NULL;
Gdiplus::Bitmap* bitmap = new Gdiplus::Bitmap(szFilename,false);
bitmap->GetHBITMAP(NULL, &result);
delete bitmap;
return result;
}
void displayImage(HWND dest, HBITMAP bmp)
{
RECT myRect;
BITMAP bm;
HDC screenDC, memDC;
HBITMAP oldBmp;
screenDC = GetDC(dest);
memDC = CreateCompatibleDC(screenDC);
oldBmp = (HBITMAP)SelectObject(memDC, bmp);
GetObject(bmp, sizeof(bm), &bm);
GetClientRect(dest, &myRect);
StretchBlt(screenDC, 0,0,myRect.right,myRect.bottom, memDC, 0,0,bm.bmWidth,bm.bmHeight, SRCCOPY);
SelectObject(memDC, oldBmp);
ReleaseDC(dest, screenDC);
DeleteDC(memDC);
}
I generally init GDI+ in main(), like this:
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
hInst = hInstance;
InitCommonControls();
DialogBox(hInstance, MAKEINTRESOURCE(DLG_MAIN), NULL, (DLGPROC)DialogProc);
Gdiplus::GdiplusShutdown(gdiplusToken);
}