|
hCopyDC = ::CreateCompatibleDC(hdc);
CWRAEx(hCopyDC != _NULL, HRESULT_FROM_WIN32(GetLastError()));
hBitmap = CreateCompatibleBitmap(hdc, rect.right-rect.left , rect.bottom-rect.top);
CWRAEx(hBitmap != _NULL, HRESULT_FROM_WIN32(GetLastError()));
hBitTemp = (HBITMAP) SelectObject(hCopyDC, hBitmap);
CWRAEx(hBitTemp != _NULL, HRESULT_FROM_WIN32(GetLastError()));
hr = m_pNewBitMap->QueryInterface(IID_IImage,(void **)&pImage);
CHR(hr);
pImage->GetImageInfo(&imgInfo);
dDotPermmX = imgInfo.Xdpi / 25.4;
dDotPermmY = imgInfo.Ydpi / 25.4;
xImage = (int)(imgInfo.Width / dDotPermmX / 0.01);
yImage = (int)(imgInfo.Height / dDotPermmY / 0.01);
xOffset = (int)(m_xOffset * 1.0 / rect.right * xImage);
yOffset = (int)(m_yOffset * 1.0 / rect.bottom * yImage);
rcImage.left = xOffset / m_EnlargeFactor;
rcImage.bottom = yImage - yOffset / m_EnlargeFactor;
rcImage.top = rcImage.bottom - yImage / m_EnlargeFactor;
rcImage.right = rcImage.left + xImage / m_EnlargeFactor;
// important, if the rcImage out of the image size,
// there will be a big error, the CreateCompatibleDC
// will always return null.
rcImage.top = rcImage.top < 0 ? 0 : rcImage.top;
rcImage.left = rcImage.left < 0 ? 0 : rcImage.left;
rcImage.right = rcImage.right > xImage ? xImage : rcImage.right;
rcImage.bottom = rcImage.bottom > yImage ? yImage : rcImage.bottom;
CBR(rcImage.left < rcImage.right);
CBR(rcImage.top < rcImage.bottom);
hr = pImage->Draw(hCopyDC,&rect,&rcImage);
CHR(hr);
if (!lParam && m_bThumb && m_EnlargeFactor > 1)
{
BitBlt(hCopyDC,m_thumbRect.left,m_thumbRect.top,m_thumbRect.right-m_thumbRect.left,m_thumbRect.bottom-m_thumbRect.top,m_thumbDC,0,0,SRCCOPY);
TuneThumbPos(hCopyDC, rect);
} |
|