加急~~ 如何将窗口的一部分背景图用位图存储下来 问题如题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你搜CopyWindowToBitmap自己改改就能满足需求了。 #include "stdafx.h" #include <windows.h> #include <atlimage.h> int __stdcall WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { HWND hwnd = ::GetDesktopWindow(); HDC hDC = ::GetDC(hwnd); RECT rect; ::GetClientRect(hwnd, &rect); HDC hDCMem = ::CreateCompatibleDC(hDC); HBITMAP hBitMap = ::CreateCompatibleBitmap(hDC, rect.right, rect.bottom); HBITMAP hOldMap = (HBITMAP)::SelectObject(hDCMem, hBitMap); ::BitBlt(hDCMem, 0, 0, rect.right, rect.bottom, hDC, 0, 0, SRCCOPY);//修改里面的参数来保存一部分有用的背景图 CImage image; image.Attach(hBitMap); image.Save("c:\\B.bmp"); image.Detach(); ::SelectObject(hDCMem, hOldMap); ::DeleteObject(hBitMap); ::DeleteDC(hDCMem); ::DeleteDC(hDC); return 0; } 本人对DC的概念还不是很清楚感觉对截图还是把握不住HBITMAP hBitMap = ::CreateCompatibleBitmap(hDC, rect.right, rect.bottom); 创建兼容位图, 此时的位图是什么状态?是空白?还是其他?::BitBlt(hDCMem, 0, 0, rect.right, rect.bottom, hDC, 0, 0, SRCCOPY);//修改里面的参数来保存一部分有用的背景图 ---这句算是把hDC 中 从点(0,0)到(rect.right, rect.bottom) 这个区域的数据保存到hBitmap了吧那么hDC相当于一张背景图片么? HBITMAP hBitMap = ::CreateCompatibleBitmap(hDC, rect.right, rect.bottom); 创建兼容位图, 此时的位图是什么状态?是空白?还是其他? ==此时应该是黑底图片。::BitBlt(hDCMem, 0, 0, rect.right, rect.bottom, hDC, 0, 0, SRCCOPY);//修改里面的参数来保存一部分有用的背景图 ---这句算是把hDC 中 从点(0,0)到(rect.right, rect.bottom) 这个区域的数据保存到hBitmap了吧 ===这是把当前桌面指定大小的区域内容复制到内存DC中,存在选入内存DC的hBitmap中。 CreateCompatibleBitmap() 默认情况下创建的是一个单色位图,只有一个像素的大小。而你这里是创建了一个rect.right宽,rect.bottom高的一个单色位图。 DC就是 "Device Content" , 设备描述表,它是MFC的主要对象之一。通过CDC类进行各种绘图操作,例如选笔,选色,选涂色的花样,选“画”字的大小字体,画直线曲线多变性,画图像(照片)等,可以“画”到屏幕上,“画”到打印机上,“画”到文件里。建议你看看《VC++技术内幕一书》,讲的很好 VC6.0下:/************************************************************************ 函数名称* SaveClientToFile()* HWND hWnd 拷屏的窗口句柄* CFile file 存储位图的文件* 函数功能 实现窗口画面拷贝保存成24色位图文件* 2008.11.2***********************************************************************/void SaveClientToFile(HWND hWnd, CFile &file){ HDC hDC, hMemDC; HANDLE hBits; HBITMAP hBitmap, hTmpBmp; HPALETTE hPal; LPVOID lpBits; RGBQUAD RGBQuad; DWORD ImgSize, plSize; int i, CRes, Height, Width; BITMAPFILEHEADER bmFH; LPBITMAPINFO pBmInfo, pBmInfoMem; LPLOGPALETTE lp; if(hWnd==HWND_DESKTOP) //桌面窗口句柄 { Width = GetSystemMetrics(SM_CXSCREEN); //获得桌面的宽度和高度 Height = GetSystemMetrics(SM_CYSCREEN); } else { RECT rc; //获取非桌面窗口的宽度和高度 ::GetWindowRect(hWnd,&rc); Width = rc.right - rc.left; Height = rc.bottom - rc.top; } hDC = ::GetWindowDC(hWnd); //获取待拷贝窗口的画图设备句柄(不能用GetDC(hWnd)!!!!!!!!!!!!) hMemDC = CreateCompatibleDC(hDC); //为设备句柄创建内存设备上下文 hBitmap = CreateCompatibleBitmap(hDC, Width, Height); //为设备句柄初始化位图 hTmpBmp = CreateCompatibleBitmap(hDC, 8, 8); pBmInfoMem = (LPBITMAPINFO)GlobalAlloc(GHND, sizeof(BITMAPINFO) + 256*sizeof( RGBQUAD )); pBmInfo = (LPBITMAPINFO )GlobalLock(pBmInfoMem); SelectObject(hMemDC, hBitmap); BitBlt(hMemDC, 0, 0, Width, Height, hDC , 0, 0, SRCCOPY); SelectObject(hMemDC, hTmpBmp); ZeroMemory(pBmInfo, sizeof(BITMAPINFO)); pBmInfo->bmiHeader.biSize = (DWORD)sizeof(BITMAPINFOHEADER); pBmInfo->bmiHeader.biWidth = Width; pBmInfo->bmiHeader.biHeight = Height; pBmInfo->bmiHeader.biPlanes = 1; pBmInfo->bmiHeader.biBitCount = 24;//(WORD)GetDeviceCaps(hDC, BITSPIXEL); pBmInfo->bmiHeader.biCompression = BI_RGB; GetDIBits(hDC, hBitmap, 0, Height, NULL, pBmInfo, DIB_RGB_COLORS ); if(!pBmInfo->bmiHeader.biSizeImage) pBmInfo->bmiHeader.biSizeImage=((((pBmInfo->bmiHeader.biWidth*pBmInfo->bmiHeader.biBitCount)+31) & ~31)/8)*pBmInfo->bmiHeader.biHeight; CRes = GetDeviceCaps(hDC, SIZEPALETTE); //Number of entries plSize = CRes*sizeof(RGBQUAD); //调色板的长度 ImgSize = pBmInfo->bmiHeader.biSizeImage; bmFH.bfType = 0x4d42; //"BM" bmFH.bfOffBits = plSize + sizeof(BITMAPINFOHEADER) + sizeof( BITMAPFILEHEADER); bmFH.bfSize = ImgSize + bmFH.bfOffBits; bmFH.bfReserved1 = 0; bmFH.bfReserved2 = 0; file.Write(&bmFH, sizeof(BITMAPFILEHEADER)); //写位图文件头 file.Write(&(pBmInfo->bmiHeader), sizeof(BITMAPINFOHEADER)); //写位图头信息 if(CRes) //写调色板信息 { hPal=(HPALETTE)GlobalAlloc(GHND, sizeof(LOGPALETTE) + (CRes*sizeof(PALETTEENTRY))); lp=(LPLOGPALETTE)GlobalLock(hPal); lp->palNumEntries=(WORD)CRes; lp->palVersion=0x0300; GetSystemPaletteEntries(hDC, 0, CRes, lp->palPalEntry); //获取系统调色板级数 RGBQuad.rgbReserved=0; for(i = 0; i < CRes; i ++) { RGBQuad.rgbRed = lp->palPalEntry[i].peRed; RGBQuad.rgbGreen = lp->palPalEntry[i].peGreen; RGBQuad.rgbBlue = lp->palPalEntry[i].peBlue; file.Write(&RGBQuad, sizeof(RGBQUAD)); } GlobalUnlock(hPal); GlobalFree(hPal); } hBits = GlobalAlloc(GHND, pBmInfo->bmiHeader.biSizeImage); lpBits = (LPVOID)GlobalLock(hBits); GetDIBits(hDC, hBitmap, 0, Height, lpBits, pBmInfo, DIB_RGB_COLORS); file.Write(lpBits, ImgSize); //写入位图数据 GlobalUnlock(hBits); GlobalFree( hBits); GlobalUnlock(pBmInfo); GlobalFree(pBmInfoMem); DeleteObject(hTmpBmp); DeleteObject(hBitmap); DeleteDC(hMemDC); ::ReleaseDC(hWnd, hDC); file.Close(); } 求助×-× vc解析xml基础问题!! 如何增加更改配色方案的功能? 求教,纯真IP数据库的用法。 用msflexgrid控件设置宽度,坐标问题! 奇怪,我的BLOWFISH加密算法每次使用同一个密钥加密同一个字符串的结果都不一样! 难题,我用MFC开发ActiveX控件,用在网页中出现的难题? 请问哪里有访问usb型hid设备的应用程序的例子啊,VC写的? 多线程socket!!! vb的picturebox控件能支持256色以上吗? vc++6.0初学者的问题,请各位指点。 socket编程疑问 关于setup factory
#include <atlimage.h> int __stdcall WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd)
{
HWND hwnd = ::GetDesktopWindow();
HDC hDC = ::GetDC(hwnd); RECT rect;
::GetClientRect(hwnd, &rect);
HDC hDCMem = ::CreateCompatibleDC(hDC); HBITMAP hBitMap = ::CreateCompatibleBitmap(hDC, rect.right, rect.bottom);
HBITMAP hOldMap = (HBITMAP)::SelectObject(hDCMem, hBitMap); ::BitBlt(hDCMem, 0, 0, rect.right, rect.bottom, hDC, 0, 0, SRCCOPY);//修改里面的参数来保存一部分有用的背景图 CImage image;
image.Attach(hBitMap);
image.Save("c:\\B.bmp");
image.Detach(); ::SelectObject(hDCMem, hOldMap);
::DeleteObject(hBitMap);
::DeleteDC(hDCMem);
::DeleteDC(hDC); return 0;
}
感觉对截图还是把握不住
HBITMAP hBitMap = ::CreateCompatibleBitmap(hDC, rect.right, rect.bottom);
创建兼容位图, 此时的位图是什么状态?是空白?还是其他?
::BitBlt(hDCMem, 0, 0, rect.right, rect.bottom, hDC, 0, 0, SRCCOPY);//修改里面的参数来保存一部分有用的背景图 ---这句算是把hDC 中 从点(0,0)到(rect.right, rect.bottom) 这个区域的数据保存到hBitmap了吧那么hDC相当于一张背景图片么?
创建兼容位图, 此时的位图是什么状态?是空白?还是其他?
==此时应该是黑底图片。
::BitBlt(hDCMem, 0, 0, rect.right, rect.bottom, hDC, 0, 0, SRCCOPY);//修改里面的参数来保存一部分有用的背景图 ---这句算是把hDC 中 从点(0,0)到(rect.right, rect.bottom) 这个区域的数据保存到hBitmap了吧
===这是把当前桌面指定大小的区域内容复制到内存DC中,存在选入内存DC的hBitmap中。
/***********************************************************************
* 函数名称
* SaveClientToFile()
* HWND hWnd 拷屏的窗口句柄
* CFile file 存储位图的文件
* 函数功能 实现窗口画面拷贝保存成24色位图文件
* 2008.11.2
***********************************************************************/
void SaveClientToFile(HWND hWnd, CFile &file)
{
HDC hDC, hMemDC;
HANDLE hBits;
HBITMAP hBitmap, hTmpBmp;
HPALETTE hPal;
LPVOID lpBits;
RGBQUAD RGBQuad;
DWORD ImgSize, plSize;
int i, CRes, Height, Width;
BITMAPFILEHEADER bmFH;
LPBITMAPINFO pBmInfo, pBmInfoMem;
LPLOGPALETTE lp;
if(hWnd==HWND_DESKTOP) //桌面窗口句柄
{
Width = GetSystemMetrics(SM_CXSCREEN); //获得桌面的宽度和高度
Height = GetSystemMetrics(SM_CYSCREEN);
}
else
{
RECT rc; //获取非桌面窗口的宽度和高度
::GetWindowRect(hWnd,&rc);
Width = rc.right - rc.left;
Height = rc.bottom - rc.top;
}
hDC = ::GetWindowDC(hWnd); //获取待拷贝窗口的画图设备句柄(不能用GetDC(hWnd)!!!!!!!!!!!!)
hMemDC = CreateCompatibleDC(hDC); //为设备句柄创建内存设备上下文
hBitmap = CreateCompatibleBitmap(hDC, Width, Height); //为设备句柄初始化位图
hTmpBmp = CreateCompatibleBitmap(hDC, 8, 8);
pBmInfoMem = (LPBITMAPINFO)GlobalAlloc(GHND, sizeof(BITMAPINFO) + 256*sizeof( RGBQUAD ));
pBmInfo = (LPBITMAPINFO )GlobalLock(pBmInfoMem);
SelectObject(hMemDC, hBitmap);
BitBlt(hMemDC, 0, 0, Width, Height, hDC , 0, 0, SRCCOPY);
SelectObject(hMemDC, hTmpBmp);
ZeroMemory(pBmInfo, sizeof(BITMAPINFO));
pBmInfo->bmiHeader.biSize = (DWORD)sizeof(BITMAPINFOHEADER);
pBmInfo->bmiHeader.biWidth = Width;
pBmInfo->bmiHeader.biHeight = Height;
pBmInfo->bmiHeader.biPlanes = 1;
pBmInfo->bmiHeader.biBitCount = 24;//(WORD)GetDeviceCaps(hDC, BITSPIXEL);
pBmInfo->bmiHeader.biCompression = BI_RGB;
GetDIBits(hDC, hBitmap, 0, Height, NULL, pBmInfo, DIB_RGB_COLORS );
if(!pBmInfo->bmiHeader.biSizeImage)
pBmInfo->bmiHeader.biSizeImage=((((pBmInfo->bmiHeader.biWidth*pBmInfo->bmiHeader.biBitCount)+31) & ~31)/8)*pBmInfo->bmiHeader.biHeight;
CRes = GetDeviceCaps(hDC, SIZEPALETTE); //Number of entries
plSize = CRes*sizeof(RGBQUAD); //调色板的长度
ImgSize = pBmInfo->bmiHeader.biSizeImage;
bmFH.bfType = 0x4d42; //"BM"
bmFH.bfOffBits = plSize + sizeof(BITMAPINFOHEADER) + sizeof( BITMAPFILEHEADER);
bmFH.bfSize = ImgSize + bmFH.bfOffBits;
bmFH.bfReserved1 = 0;
bmFH.bfReserved2 = 0; file.Write(&bmFH, sizeof(BITMAPFILEHEADER)); //写位图文件头
file.Write(&(pBmInfo->bmiHeader), sizeof(BITMAPINFOHEADER)); //写位图头信息
if(CRes) //写调色板信息
{
hPal=(HPALETTE)GlobalAlloc(GHND, sizeof(LOGPALETTE) + (CRes*sizeof(PALETTEENTRY)));
lp=(LPLOGPALETTE)GlobalLock(hPal);
lp->palNumEntries=(WORD)CRes;
lp->palVersion=0x0300;
GetSystemPaletteEntries(hDC, 0, CRes, lp->palPalEntry); //获取系统调色板级数
RGBQuad.rgbReserved=0;
for(i = 0; i < CRes; i ++)
{
RGBQuad.rgbRed = lp->palPalEntry[i].peRed;
RGBQuad.rgbGreen = lp->palPalEntry[i].peGreen;
RGBQuad.rgbBlue = lp->palPalEntry[i].peBlue;
file.Write(&RGBQuad, sizeof(RGBQUAD));
}
GlobalUnlock(hPal);
GlobalFree(hPal);
}
hBits = GlobalAlloc(GHND, pBmInfo->bmiHeader.biSizeImage);
lpBits = (LPVOID)GlobalLock(hBits);
GetDIBits(hDC, hBitmap, 0, Height, lpBits, pBmInfo, DIB_RGB_COLORS);
file.Write(lpBits, ImgSize); //写入位图数据
GlobalUnlock(hBits);
GlobalFree( hBits);
GlobalUnlock(pBmInfo);
GlobalFree(pBmInfoMem);
DeleteObject(hTmpBmp);
DeleteObject(hBitmap);
DeleteDC(hMemDC);
::ReleaseDC(hWnd, hDC);
file.Close();
}