IFACEMETHODIMP PreviewBase::GetThumbnail(UINT cx, HBITMAP *phbmp, WTS_ALPHATYPE *pdwAlpha) { BaseEngine *engine = GetEngine(); if (!engine) return E_FAIL; RectD page = engine->Transform(engine->PageMediabox(1), 1, 1.0, 0); float zoom = min(cx / (float)page.dx, cx / (float)page.dy) - 0.001f; RectI thumb = RectD(0, 0, page.dx * zoom, page.dy * zoom).Round(); BITMAPINFO bmi = { 0 }; bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader); bmi.bmiHeader.biHeight = thumb.dy; bmi.bmiHeader.biWidth = thumb.dx; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = 32; bmi.bmiHeader.biCompression = BI_RGB; unsigned char *bmpData = NULL; HBITMAP hthumb = CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, (void **)&bmpData, NULL, 0); if (!hthumb) return E_OUTOFMEMORY; page = engine->Transform(thumb.Convert<double>(), 1, zoom, 0, true); RenderedBitmap *bmp = engine->RenderBitmap(1, zoom, 0, &page); HDC hdc = GetDC(NULL); if (bmp && GetDIBits(hdc, bmp->GetBitmap(), 0, thumb.dy, bmpData, &bmi, DIB_RGB_COLORS)) { // cf. http://msdn.microsoft.com/en-us/library/bb774612(v=VS.85).aspx for (int i = 0; i < thumb.dx * thumb.dy; i++) bmpData[4 * i + 3] = 0xFF; *phbmp = hthumb; if (pdwAlpha) *pdwAlpha = WTSAT_RGB; } else { DeleteObject(hthumb); hthumb = NULL; } ReleaseDC(NULL, hdc); delete bmp; return hthumb ? S_OK : E_NOTIMPL; }