Насчет отрисовки на контексте Bitmap'a, то вот так работает
#pas
if valid then begin
hdcMem:= CreateCompatibleDC(0);
hdcBmp:= CreateCompatibleBitmap(DC, wsz, hsz);
SelectObject(hdcMem, hdcBmp);
BitBlt(hdcMem, 0, 0, wsz, hsz, DC, 0, 0, SRCCOPY);
if (sz.cx * 100) div sz.cy > (hw * 100) div hh then
FImgCtx.StretchBlt(hdcMem, x1, y1 + (hh - (hw * sz.cy) div sz.cx) div 2, hw, (hw * sz.cy) div sz.cx, 0, 0, sz.cx, sz.cy, SRCCOPY)
else
FImgCtx.StretchBlt(hdcMem, x1 + (hw - (hh * sz.cx) div sz.cy) div 2, y1, (hh * sz.cx) div sz.cy, hh, 0, 0, sz.cx, sz.cy, SRCCOPY);
BitBlt(DC, 0, 0, wsz, hsz, hdcMem, 0, 0, SRCCOPY);
DeleteDC(hdcMem);
_hi_CreateEvent(_Data,@_event_onLoad);
Иначе работать никак не желает.