以下是截取屏幕的程序,怎么把截取得到 的结果保存到文件中去呢?
HBITMAP GetScreenBmp()
{
HWND hwnd = ::GetDesktopWindow();
HDC hsrc = ::GetDC(hwnd);
HDC hmemdc = ::CreateCompatibleDC(hsrc);
RECT rc;
::GetWindowRect(hwnd,&rc);
SIZE sz;
sz.cx = rc.right - rc.left;
sz.cy = rc.bottom - rc.top;
HBITMAP hbmp = ::CreateCompatibleBitmap(hsrc,sz.cx,sz.cy);
HGDIOBJ holdbmp = ::SelectObject(hmemdc,hbmp);
::BitBlt(hmemdc,0,0,sz.cx,sz.cy,hsrc,rc.left,rc.top,SRCCOPY);
::SelectObject(hmemdc,holdbmp);
::DeleteObject(hmemdc);
::ReleaseDC(hwnd,hsrc);
return hbmp;
}
HBITMAP GetScreenBmp()
{
HWND hwnd = ::GetDesktopWindow();
HDC hsrc = ::GetDC(hwnd);
HDC hmemdc = ::CreateCompatibleDC(hsrc);
RECT rc;
::GetWindowRect(hwnd,&rc);
SIZE sz;
sz.cx = rc.right - rc.left;
sz.cy = rc.bottom - rc.top;
HBITMAP hbmp = ::CreateCompatibleBitmap(hsrc,sz.cx,sz.cy);
HGDIOBJ holdbmp = ::SelectObject(hmemdc,hbmp);
::BitBlt(hmemdc,0,0,sz.cx,sz.cy,hsrc,rc.left,rc.top,SRCCOPY);
::SelectObject(hmemdc,holdbmp);
::DeleteObject(hmemdc);
::ReleaseDC(hwnd,hsrc);
return hbmp;
}
解决方案 »
- error C2146: syntax error : missing ';' before identifier 'dlg'
- ado连接oracle的怪问题
- 新手求教:编写的Windows服务为什么不能启动?
- 懂CD 刻录编程的人进来,大家聊聊
- 防火墙能挡住病毒吗?冲击波一类的?
- 各位高人帮帮忙啊,我把我的分都加上去了,我刚注册的
- 同志们,网络问题,sos呼救了!!!!!!!!!!!
- 如何组织一个应用程序的应用
- 有关内存申请与释放问题!
- 请问CSTRING怎么样实现象VB中TRIM()函数的功能呢?怎样用最简便的方法实现呢?
- 怎么创建access数据库?
- 如何在进度调控件CProgressCtrl上面写文本?
{
HDC hDC; // 设备描述表
int iBits; // 当前显示分辨率下每个像素所占字节数 WORD wBitCount; // 位图中每个像素所占字节数 DWORD dwPaletteSize = 0 ; // 定义调色板大小, 位图中像素字节大小 ,
// 位图文件大小 , 写入文件字节数 DWORD dwBmBitsSize ; DWORD dwDIBSize, dwWritten ; BITMAP Bitmap; BITMAPFILEHEADER bmfHdr; //位图属性结构 BITMAPINFOHEADER bi; //位图文件头结构 LPBITMAPINFOHEADER lpbi; //位图信息头结构 HANDLE fh, hDib, hPal,hOldPal = NULL ; //指向位图信息头结构,定义文件,分配内存句柄,调色板句柄 //计算位图文件每个像素所占字节数 hDC = CreateDC( "DISPLAY" , NULL , NULL , NULL ) ; iBits = GetDeviceCaps( hDC , BITSPIXEL ) * GetDeviceCaps( hDC , PLANES ) ; DeleteDC( hDC ) ; if ( iBits <= 1 )
{
wBitCount = 1;
} else if ( iBits <= 4 )
{
wBitCount = 4;
} else if ( iBits <= 8 )
{
wBitCount = 8;
} else if ( iBits <= 24 )
{
wBitCount = 24;
} else if ( iBits <= 32 )
{
wBitCount = 32;
} //计算调色板大小
if ( wBitCount <= 8 )
{
dwPaletteSize = ( 1 << wBitCount ) * sizeof( RGBQUAD ) ;
} //设置位图信息头结构 GetObject( hBitmap , sizeof( BITMAP ) , ( LPSTR ) & Bitmap ) ; bi.biSize = sizeof( BITMAPINFOHEADER ); bi.biWidth = Bitmap.bmWidth; bi.biHeight = Bitmap.bmHeight; bi.biPlanes = 1; bi.biBitCount = wBitCount; bi.biCompression = BI_RGB; bi.biSizeImage = 0; bi.biXPelsPerMeter = 0; bi.biYPelsPerMeter = 0; bi.biClrUsed = 0; bi.biClrImportant = 0; dwBmBitsSize = ( ( Bitmap.bmWidth * wBitCount + 31 ) / 32 ) * 4 * Bitmap.bmHeight ; //为位图内容分配内存 hDib = GlobalAlloc( GHND ,dwBmBitsSize + dwPaletteSize + sizeof( BITMAPINFOHEADER ) ) ; lpbi = ( LPBITMAPINFOHEADER )GlobalLock( hDib ) ; *lpbi = bi; // 处理调色板 hPal = GetStockObject( DEFAULT_PALETTE ); if ( hPal )
{ hDC = ::GetDC( NULL ); hOldPal = SelectPalette( hDC, (HPALETTE ) hPal , FALSE ) ; RealizePalette( hDC ) ; } // 获取该调色板下新的像素值 GetDIBits( hDC, hBitmap, 0, ( UINT ) Bitmap.bmHeight, ( LPSTR )lpbi + sizeof( BITMAPINFOHEADER ) + dwPaletteSize, ( LPBITMAPINFO )lpbi, DIB_RGB_COLORS ); //恢复调色板 if ( hOldPal )
{ SelectPalette( hDC, ( HPALETTE )hOldPal, TRUE ); RealizePalette( hDC ) ; ::ReleaseDC( NULL, hDC ) ;
} //创建位图文件 fh = CreateFile( szfilename , GENERIC_WRITE, 0 , NULL , CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN , NULL ) ; if ( fh == INVALID_HANDLE_VALUE )
{
return false;
} // 设置位图文件头 bmfHdr.bfType = 0x4D42; // "BM" dwDIBSize = sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER ) + dwPaletteSize + dwBmBitsSize; bmfHdr.bfSize = dwDIBSize; bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0; bmfHdr.bfOffBits = ( DWORD )sizeof( BITMAPFILEHEADER ) + ( DWORD )sizeof( BITMAPINFOHEADER ) + dwPaletteSize; // 写入位图文件头 WriteFile( fh, ( LPSTR )&bmfHdr, sizeof ( BITMAPFILEHEADER ), &dwWritten, NULL); // 写入位图文件其余内容 WriteFile( fh, ( LPSTR )lpbi, dwDIBSize, &dwWritten , NULL ); //消除内存分配 GlobalUnlock( hDib ); GlobalFree( hDib ); CloseHandle( fh ); return true;
}
{
CDC dc;
dc.CreateDC("DISPLAY",NULL,NULL,NULL);
CBitmap bm;
int Width=GetSystemMetrics(SM_CXSCREEN);
int Height=GetSystemMetrics(SM_CYSCREEN);
bm.CreateCompatibleBitmap(&dc,Width,Height);
CDC tdc;
tdc.CreateCompatibleDC(&dc);
CBitmap*pOld=tdc.SelectObject(&bm);
tdc.BitBlt(0,0,Width,Height,&dc,0,0,SRCCOPY);
tdc.SelectObject(pOld);
BITMAP btm;
bm.GetBitmap(&btm);
DWORD size=btm.bmWidthBytes*btm.bmHeight;
LPSTR lpData=(LPSTR)GlobalAllocPtr(GPTR,size);
/////////////////////////////////////////////
BITMAPINFOHEADER bih;
bih.biBitCount=btm.bmBitsPixel;
bih.biClrImportant=0;
bih.biClrUsed=0;
bih.biCompression=0;
bih.biHeight=btm.bmHeight;
bih.biPlanes=1;
bih.biSize=sizeof(BITMAPINFOHEADER);
bih.biSizeImage=size;
bih.biWidth=btm.bmWidth;
bih.biXPelsPerMeter=0;
bih.biYPelsPerMeter=0;
///////////////////////////////////
GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
// bm.GetBitmapBits(size,lpData); //此函数在处理5-5-5模式的16位色下会出现颜色混乱
//////////////////////////////
static int filecount=0;
CString name;
name.Format("pict%04d.bmp",filecount++);
name=m_Path+name;
BITMAPFILEHEADER bfh;
bfh.bfReserved1=bfh.bfReserved2=0;
bfh.bfType=((WORD)('M'<< 8)|'B');
bfh.bfSize=54+size;
bfh.bfOffBits=54;
CFile bf;
if(bf.Open(name,CFile::modeCreate|CFile::modeWrite)){
bf.WriteHuge(&bfh,sizeof(BITMAPFILEHEADER));
bf.WriteHuge(&bih,sizeof(BITMAPINFOHEADER));
bf.WriteHuge(lpData,size);
bf.Close();
nCount++;
}
GlobalFreePtr(lpData);
if(nCount==1)
m_Number.Format("%d picture captured.",nCount);
else
m_Number.Format("%d pictures captured.",nCount);
UpdateData(FALSE);
}