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;
}

解决方案 »

  1.   

    bcb的要不要啊?你可以做成dll,用vc调用。
    下面例子把屏幕拷贝后存成文件。
    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;
    }