c++截图高手 进来帮帮忙!

alibabamt1 2009-06-16 12:27:03
我有一个程序dlg1是个窗口MFC程序,当打开dlg1的时候...

我想截dlg1窗口背面的图,就是仅仅被dlg1覆盖住的部分!不管是什么都截个图!

先谢谢各位朋友解答!
...全文
119 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
neohope 2009-06-16
  • 打赏
  • 举报
回复
呵呵,你是要背景图?
exescope直接抓
别逗我乐 2009-06-16
  • 打赏
  • 举报
回复
把,那个挡住的窗口,挪一下,不就行了?
gleen 2009-06-16
  • 打赏
  • 举报
回复
定下 哈哈
别逗我乐 2009-06-16
  • 打赏
  • 举报
回复
不明白楼主,说什么。
帮顶!
yxq281426250 2009-06-16
  • 打赏
  • 举报
回复
学习~!~~~
findcsdn 2009-06-16
  • 打赏
  • 举报
回复
楼上解释的对。

哈哈,楼主一定以为屏幕分好多个层,想到哪个层取图像都可以。

其实,屏幕就一层,如果被覆盖了就没有了,所以想要取dlg后面的图,就要在dlg显示前取好。


ReViSion 2009-06-16
  • 打赏
  • 举报
回复
dlg1出来之前先截好,再根据dlg1显示的位置来要的图片位置呀
tkminigame 2009-06-16
  • 打赏
  • 举报
回复
DC(0)是只管绘制桌面,还是包容了桌面上的窗口?
liuwg9999 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 alibabamt1 的回复:]
我试验了不行 dlg1的显示区域还是dlg1窗口啊..我不是要这个dlg1窗口而是他的背后!
我想截被dlg1窗口覆盖的桌面部分 不是dlg1窗口 不截dlg1窗口!是dlg1窗口的背后哈 背后啊!
[/Quote]

平静~~~
alibabamt1 2009-06-16
  • 打赏
  • 举报
回复
我试验了不行 dlg1的显示区域还是dlg1窗口啊..我不是要这个dlg1窗口而是他的背后!
我想截被dlg1窗口覆盖的桌面部分 不是dlg1窗口 不截dlg1窗口!是dlg1窗口的背后哈 背后啊!
findcsdn 2009-06-16
  • 打赏
  • 举报
回复
覆盖后,覆盖前,都可以截屏的啊,这个函数可以随时调用。

dlg显示前,你就可以获取dlg的显示区域的,就截取那一部分就行了。

截取多少次都可以的。


alibabamt1 2009-06-16
  • 打赏
  • 举报
回复
findcsdn同学回答的不错,但你说的是一般性截图这个我知道的哈.

但是我想在dlg1窗口显示出来后截被其覆盖的桌面部分,而且要经常截.不知道可行性如何
findcsdn 2009-06-16
  • 打赏
  • 举报
回复
上面的一些对象没有释放,你加上吧。
findcsdn 2009-06-16
  • 打赏
  • 举报
回复
可以在Dlg显示出来以前,拷贝屏幕, 这里有个拷贝屏幕的例子。



#include <afx.h>

int SaveBitmapToFileA(HBITMAP hBitmap, LPSTR lpFileName, int w, int h);

void main()
{
HDC scrndc, mendc;

scrndc = ::GetDC(0);
mendc = CreateCompatibleDC(scrndc);
HBITMAP hbmp = CreateCompatibleBitmap(scrndc, 100, 100);
SelectObject (mendc, hbmp);
BitBlt(mendc, 0, 0, 100, 100, scrndc, 0, 0, SRCCOPY);
SaveBitmapToFileA (hbmp, "d:\\a.bmp", 100, 100);
}


int SaveBitmapToFileA(HBITMAP hBitmap , LPSTR lpFileName, int w, int h)
{
HDC hDC;
WORD wBitCount;
DWORD dwPaletteSize=0,dwBmBitsSize,dwDIBSize, dwWritten;

BITMAPFILEHEADER bmfHdr;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
HANDLE fh, hDib, hPal,hOldPal=NULL;
wBitCount = 24;

if (wBitCount<= 8)
dwPaletteSize = (1 << wBitCount) *sizeof(RGBQUAD);

bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = w;
bi.biHeight = h;
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 = ((1024 * wBitCount+31)/24)* 3 * 768 ;

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, 768,
(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,
(BITMAPINFO *)lpbi, DIB_RGB_COLORS);

if (hOldPal)
{
SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
ReleaseDC(NULL, hDC);
}

fh = CreateFile(lpFileName, GENERIC_WRITE,
0,//not be shared
NULL, //cannot be inherited
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;

//write file header
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);

//write bmp data
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);

GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);

return TRUE;
}

alibabamt1 2009-06-16
  • 打赏
  • 举报
回复
就是桌面被dlg1覆盖住的部分截图
针对你们目前回答我做下补充:
1.dlg1不能挪动
2.不是背景图 而是被dlg1窗口覆盖住的桌面部分 我觉得已经说的够清楚了吧

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧