如师
解决方案 »
- vc编写的计算器程序中等号处理函数和数字输入函数之间要加一reset函数怎么办?
- 怎么样判断光驱中的光盘的类型,如CD, VCD ,DVD, 普通文件等???
- 请教:单片机发232信号 ,pc收usb信号,怎么用vc实现呢?
- 新建一个基于对话框项目,支持SOCKET,编译时error C2065: 'WSAPROTOCLO_INFOW' : undeclared identifier
- 本人是新手,请教如何解决下面的问题
- 这个错误信息是怎么回事?(在线等待)
- 刚刚从everandforever(Forever)哪学了一招,觉得给了70分太少,再送上100,请everandforever(Forever)进来领
- 怎样获得计算机的名称?
- 关于oracle的sql语句问题?
- 关于HOOK碰到一个问题
- rtp rtcp 是什么?
- 第二次运行的时候框架窗口失去响应?
HANDLE CScreenCap::MakeDDBToDIB(HBITMAP bitmap, DWORD dwCompression, HPALETTE hPal, DWORD* sizeimage)
{
BITMAP bm;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
DWORD dwLen;
HANDLE hDib;
HANDLE handle;
HDC hdc; //不支持BI_BITFIELDS类型
if( dwCompression == BI_BITFIELDS )
{
return NULL;
} //如果调色板为空,则用默认调色板
if (hPal==NULL)
{
hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE );
} //获取位图信息
GetObject(bitmap,sizeof(bm),(LPSTR)&bm); //初始化位图信息头
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bm.bmWidth;
bi.biHeight = bm.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = bm.bmPlanes * bm.bmBitsPixel;
bi.biCompression = dwCompression;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0; //计算信息头及颜色表大小
int ncolors = (1 << bi.biBitCount);
if( ncolors> 256 )
{
ncolors = 0;
}
dwLen = bi.biSize + ncolors * sizeof(RGBQUAD); hdc = GetDC(NULL);
hdc = CreateDC("DISPLAY", NULL, NULL, NULL) ;
hPal = SelectPalette(hdc,hPal,FALSE);
RealizePalette(hdc); //为信息头及颜色表分配内存
hDib = GlobalAlloc(GMEM_FIXED,dwLen); if (!hDib)
{
SelectPalette(hdc,hPal,FALSE);
//ReleaseDC(0,hdc);
return NULL;
} lpbi = (LPBITMAPINFOHEADER)hDib;
*lpbi = bi;
//调用 GetDIBits 计算图像大小
GetDIBits(hdc, bitmap, 0L, (DWORD)bi.biHeight,
(LPBYTE)NULL, (LPBITMAPINFO)lpbi, (DWORD)DIB_RGB_COLORS ); bi = *lpbi;
//图像的每一行都对齐(32bit)边界
if (bi.biSizeImage == 0)
{
bi.biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8)
* bi.biHeight;
if (dwCompression != BI_RGB)
{
bi.biSizeImage = (bi.biSizeImage * 3) / 2;
}
} //重新分配内存大小,以便放下所有数据
dwLen += bi.biSizeImage;
if (handle = GlobalReAlloc(hDib, dwLen, GMEM_MOVEABLE))
{
hDib = handle;
}
else
{
GlobalFree(hDib);
//重选原始调色板
SelectPalette(hdc,hPal,FALSE);
//CloseHandle(handle) ;
return NULL;
} //获取位图数据
lpbi = (LPBITMAPINFOHEADER)hDib; //最终获得的DIB
BOOL bgotbits = GetDIBits( hdc, bitmap,
0L, //扫描行起始处
(DWORD)bi.biHeight, //扫描行数
(LPBYTE)lpbi //位图数据地址
+ (bi.biSize + ncolors * sizeof(RGBQUAD)),
(LPBITMAPINFO)lpbi, //位图信息地址
(DWORD)DIB_RGB_COLORS); //颜色板使用RGB if( !bgotbits )
{
GlobalFree(hDib); SelectPalette(hdc,hPal,FALSE);
//CloseHandle(handle) ;
return NULL;
} SelectPalette(hdc,hPal,FALSE);
*sizeimage=bi.biSizeImage; ReleaseDC(NULL, hdc) ;
DeleteDC(hdc) ;
hdc = NULL ;
//CloseHandle(handle) ; return hDib;
}