BMP,JPG,GIF都可以FullDC(CString fn)
{
// TODO: add draw code for native data here
CWaitCursor wait;
CFileStatus fstatus;CFile file;
LONG cb;
if (file.Open(fn,CFile::modeRead)&&file.GetStatus(fn,fstatus)&&((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
if (hGlobal != NULL)
{
LPVOID pvData=NULL;
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
IPicture *pPic;IStream *pStm;
file.ReadHuge(pvData, cb);file.Close ();
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{
CDC *allDC=GetDC();
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
double fX,fY;
fX = (double)(long)((double)allDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)allDC->GetDeviceCaps(HORZSIZE)*100.0));
fY = (double)(long)((double)allDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)allDC->GetDeviceCaps(VERTSIZE)*100.0));
if(!m_bFitSize)
m_allRect=CRect(0,0,(long)fX,(long)fY);
else
{
GetClientRect(m_allRect);m_allRect.NormalizeRect ();
CRect old=m_allRect;
CPoint bg(0,0);
double fdx=m_allRect.Width ()/fX;
double fdy=m_allRect.Height ()/fY;
double fd;
if(fdx fd=fdx;
else
fd=fdy;
m_allRect.right=m_allRect.left +(long)(fX*fd)-1;
m_allRect.bottom =m_allRect.top +(long)(fY*fd)-1;}
ClearDC();
m_DC.CreateCompatibleDC (allDC);
m_Bitmap.CreateCompatibleBitmap (allDC,m_allRect.Width(),m_allRect.Height ());
if(m_Bitmap.GetSafeHandle ()==NULL){ReleaseDC(allDC);pPic->Release();pPic->Release();GlobalFree(hGlobal);ClearDC();return false;}
m_pBitmap=m_DC.SelectObject (&m_Bitmap);
ReleaseDC(allDC);SetScrollSizes(MM_TEXT,CSize(m_allRect.Width (),m_allRect.Height ()));
CBrush brs;brs.CreateSolidBrush (RGB(0,0,0));
m_DC.FillRect (m_allRect,&brs);
brs.DeleteObject ();
if(FAILED(pPic->Render(m_DC.m_hDC ,0,0,m_allRect.Width (),m_allRect.Height (),0,hmHeight,hmWidth,-hmHeight,NULL))) return false;
pPic->Release();GlobalFree(hGlobal);
SetFileList(fn);
}
else
{
GlobalFree(hGlobal);
ClearDC();
return false;
}
}
else
{
file.Close ();
GlobalFree(hGlobal);
ClearDC();
return false;
}
}
else
{
file.Close();
ClearDC();
return false;
}
}
else {ClearDC();return false;}
return true;
}
{
// TODO: add draw code for native data here
CWaitCursor wait;
CFileStatus fstatus;CFile file;
LONG cb;
if (file.Open(fn,CFile::modeRead)&&file.GetStatus(fn,fstatus)&&((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
if (hGlobal != NULL)
{
LPVOID pvData=NULL;
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
IPicture *pPic;IStream *pStm;
file.ReadHuge(pvData, cb);file.Close ();
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{
CDC *allDC=GetDC();
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
double fX,fY;
fX = (double)(long)((double)allDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)allDC->GetDeviceCaps(HORZSIZE)*100.0));
fY = (double)(long)((double)allDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)allDC->GetDeviceCaps(VERTSIZE)*100.0));
if(!m_bFitSize)
m_allRect=CRect(0,0,(long)fX,(long)fY);
else
{
GetClientRect(m_allRect);m_allRect.NormalizeRect ();
CRect old=m_allRect;
CPoint bg(0,0);
double fdx=m_allRect.Width ()/fX;
double fdy=m_allRect.Height ()/fY;
double fd;
if(fdx fd=fdx;
else
fd=fdy;
m_allRect.right=m_allRect.left +(long)(fX*fd)-1;
m_allRect.bottom =m_allRect.top +(long)(fY*fd)-1;}
ClearDC();
m_DC.CreateCompatibleDC (allDC);
m_Bitmap.CreateCompatibleBitmap (allDC,m_allRect.Width(),m_allRect.Height ());
if(m_Bitmap.GetSafeHandle ()==NULL){ReleaseDC(allDC);pPic->Release();pPic->Release();GlobalFree(hGlobal);ClearDC();return false;}
m_pBitmap=m_DC.SelectObject (&m_Bitmap);
ReleaseDC(allDC);SetScrollSizes(MM_TEXT,CSize(m_allRect.Width (),m_allRect.Height ()));
CBrush brs;brs.CreateSolidBrush (RGB(0,0,0));
m_DC.FillRect (m_allRect,&brs);
brs.DeleteObject ();
if(FAILED(pPic->Render(m_DC.m_hDC ,0,0,m_allRect.Width (),m_allRect.Height (),0,hmHeight,hmWidth,-hmHeight,NULL))) return false;
pPic->Release();GlobalFree(hGlobal);
SetFileList(fn);
}
else
{
GlobalFree(hGlobal);
ClearDC();
return false;
}
}
else
{
file.Close ();
GlobalFree(hGlobal);
ClearDC();
return false;
}
}
else
{
file.Close();
ClearDC();
return false;
}
}
else {ClearDC();return false;}
return true;
}
下面例子把屏幕拷贝后存成文件。
void JPG()
{
HWND hDesktopWnd = GetDesktopWindow();
HDC hDesktopDC = GetDC(hDesktopWnd);
WINDOWINFO pwi; TJPEGImage *JpegImage = new TJPEGImage;
Graphics::TBitmap *Bitmap = new Graphics::TBitmap; GetWindowInfo(hDesktopWnd, &pwi);
Bitmap->Width = pwi.rcWindow.right ;
Bitmap->Height = pwi.rcWindow.bottom ; BitBlt(Bitmap->Canvas->Handle,0,0,Bitmap->Width,Bitmap->Width,
hDesktopDC,0,0,SRCCOPY ); ReleaseDC(hDesktopWnd,hDesktopDC); JpegImage->Assign(Bitmap);
JpegImage->SaveToFile("Scr.jpg"); delete Bitmap;
delete JpegImage;
}