写窗口图像到BMP位图文件

      分类一 2005-5-20 14:32
        WINDOWS的窗口图像从本质上来说,是WINDOWS在内存DC上绘制的一幅图像,
我们要将此图像存储起来,首先要获得WINDOWS窗口的区域大小,然后将区域中的图像
存在一内存DC中,由于内存DC是与设备相关的位图,所以将它存储起来还要用DDBTODIB
函数转换成DIB位图,最后再用WriteDIB函数转储成BMP文件。  

BOOL WriteWindowToDIB( LPTSTR szFile, CWnd *pWnd )
{
CBitmap  bitmap;
CWindowDC dc(pWnd);
CDC  memDC;
CRect rect;

memDC.CreateCompatibleDC(&dc);

pWnd->GetWindowRect(rect);
       //用窗口区域大小定义一个内存DC ,并将窗口图像暂存其中
bitmap.CreateCompatibleBitmap(&dc, rect.Width(),rect.Height() );

CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
memDC.BitBlt(0, 0, rect.Width(),rect.Height(), &dc, 0, 0, SRCCOPY);

// 如果设备支持调色板,创建调色板
CPalette pal;
if( dc.GetDeviceCaps(RASTERCAPS) & RC_PALETTE )
{
UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * 256);
LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];
pLP->palVersion = 0x300;

pLP->palNumEntries =
GetSystemPaletteEntries( dc, 0, 255, pLP->palPalEntry );

// Create the palette
pal.CreatePalette( pLP );

delete[] pLP;
}

memDC.SelectObject(pOldBitmap);

// 转换 bitmap 到 a DIB
HANDLE hDIB = DDBToDIB( bitmap, BI_RGB, &pal );

if( hDIB == NULL )
return FALSE;

// Write it to file
WriteDIB( szFile, hDIB );

// Free the memory allocated by DDBToDIB for the DIB
GlobalFree( hDIB );
return TRUE;
}
标签集:TAGS:
回复Comments() 点击Count()

回复Comments

{commentauthor}
{commentauthor}
{commenttime}
{commentnum}
{commentcontent}
作者:
{commentrecontent}