Why JPG display only with 16 color in Dialog?
Any clue? The code is attached below.
TIA.
void CCardDlg::LoadAndDisplayJpeg()
{
long Len;
CFile File;
HGLOBAL hglob = NULL;
HBITMAP hbm = NULL;
CPaintDC dc(this);
try
{
File.Open(_T("\\tmp\\YanYan.jpg"), CFile::modeRead);
Len = File.GetLength();
hglob = GlobalAlloc(GMEM_MOVEABLE, Len + 1);
if (hglob == NULL) CGException::ThrowLastError();
try
{
File.Read(GlobalLock(hglob), Len);
}
catch(...)
{
GlobalUnlock(hglob);
throw;
}
GlobalUnlock(hglob);
hbm = LoadJpeg(hglob);
// Draw the Bitmap
CDC mdc;
CRect rect;
CBitmap *Bmp;
BITMAP bmp;
mdc.CreateCompatibleDC(NULL);
Bmp = CBitmap::FromHandle(hbm);
CBitmap *obmp = mdc.SelectObject(Bmp);
GetClientRect(&rect);
Bmp->GetBitmap(&bmp);
dc.StretchBlt(0, 0, rect.Width(), rect.Height(),
&mdc, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
mdc.SelectObject(obmp);
m_Photo.DeleteObject();
m_Photo.CreateBitmapIndirect(&bmp);
// Free resource
GlobalFree(hglob);
hglob = NULL;
DeleteObject(hbm);
hbm = NULL;
GetDlgItem(IDC_SC_PHOTO)->Invalidate();
}
catch(...)
{
if (hglob != NULL) GlobalFree(hglob);
if (hbm != NULL) DeleteObject(hbm);
throw;
}
}
HBITMAP CCardDlg::LoadJpeg(HGLOBAL hglob) const
{
IStream *stream = NULL;
CreateStreamOnHGlobal(hglob, FALSE, &stream);
IPicture *pic;
OleLoadPicture(stream, 0, FALSE, IID_IPicture, (void**) &pic);
stream->Release();
HBITMAP hbm0 = NULL;
pic->get_Handle((OLE_HANDLE*) &hbm0);
// Now we make a copy of it into our own hbm
DIBSECTION dibs;
::GetObject(hbm0, sizeof(dibs), &dibs);
// if (dibs.dsBm.bmBitsPixel != 24)
// {
// pic->Release();
// return NULL;
// }
int w = dibs.dsBm.bmWidth, h = dibs.dsBm.bmHeight;
dibs.dsBmih.biClrUsed = 0;
dibs.dsBmih.biClrImportant = 0;
void *bits;
HDC sdc = ::GetDC(m_hWnd);
HBITMAP hbm1 = ::CreateDIBSection(sdc, (BITMAPINFO*) &dibs.dsBmih,
DIB_RGB_COLORS, &bits, 0, 0);
//
HDC hdc0 = ::CreateCompatibleDC(sdc);
HDC hdc1 = ::CreateCompatibleDC(sdc);
HGDIOBJ hold0 = ::SelectObject(hdc0, hbm0);
HGDIOBJ hold1 = ::SelectObject(hdc1, hbm1);
::BitBlt(hdc1, 0, 0, w, h, hdc0, 0, 0, SRCCOPY);
::SelectObject(hdc0, hold0);
::SelectObject(hdc1, hold1);
::DeleteDC(hdc0);
::DeleteDC(hdc1);
::ReleaseDC(m_hWnd, sdc);
pic->Release();
return hbm1;
}