鱼C论坛

 找回密码
 立即注册
查看: 2545|回复: 3

截图截真相大家快来看!

[复制链接]
发表于 2012-7-13 02:57:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. char* getScreen(long left,long top,long right,long bottom)
  2. {

  3. HWND DeskWnd=::GetDesktopWindow();//获取桌面窗口句柄
  4. RECT DeskRC;
  5. DeskRC.left = left;
  6. DeskRC.top = top;
  7. DeskRC.right = right;
  8. DeskRC.bottom = bottom;

  9. // ::GetClientRect(DeskWnd,&DeskRC);//获取窗口大小
  10. HDC DeskDC=GetDC(DeskWnd);//获取窗口DC
  11. HBITMAP DeskBmp=::CreateCompatibleBitmap(DeskDC,DeskRC.right-DeskRC.left,DeskRC.bottom-DeskRC.top);//兼容位图
  12. HDC memDC=::CreateCompatibleDC(DeskDC);//兼容DC
  13. SelectObject(memDC,DeskBmp);//把兼容位图选入兼容DC中
  14. BitBlt(memDC,0,0,right-DeskRC.left,DeskRC.bottom-DeskRC.top,DeskDC,DeskRC.left,DeskRC.top,SRCCOPY);//拷贝DC

  15. BITMAP bmInfo;
  16. DWORD bmDataSize;
  17. char *bmData;//位图数据
  18. GetObject(DeskBmp,sizeof(BITMAP),&bmInfo);//根据位图句柄,获取位图信息
  19. bmDataSize=bmInfo.bmWidthBytes*bmInfo.bmHeight;//计算位图数据大小
  20. bmData=new char[bmDataSize];//分配数据

  21. BITMAPFILEHEADER bfh;//位图文件头
  22. bfh.bfType=0x4d42;
  23. bfh.bfSize=bmDataSize+54;
  24. bfh.bfReserved1=0;
  25. bfh.bfReserved2=0;
  26. bfh.bfOffBits=54;

  27. BITMAPINFOHEADER bih;//位图信息头
  28. bih.biSize=40;
  29. bih.biWidth=bmInfo.bmWidth;
  30. bih.biHeight=bmInfo.bmHeight;
  31. bih.biPlanes=1;
  32. bih.biBitCount=24;
  33. bih.biCompression=BI_RGB;
  34. bih.biSizeImage=bmDataSize;
  35. bih.biXPelsPerMeter=0;
  36. bih.biYPelsPerMeter=0;
  37. bih.biClrUsed=0;
  38. bih.biClrImportant=0;

  39. ::GetDIBits(DeskDC,DeskBmp,0,bmInfo.bmHeight,bmData,(BITMAPINFO *)&bih,DIB_RGB_COLORS);//获取位图数据部分

  40. sumSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+bmDataSize;
  41. char * stream = new char[sumSize];
  42. memcpy(stream,&bfh,sizeof(BITMAPFILEHEADER));
  43. memcpy(stream+sizeof(BITMAPFILEHEADER),&bih,sizeof(BITMAPINFOHEADER));
  44. memcpy(stream+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER),bmData,bmDataSize);

  45. HANDLE hFile=CreateFile(TEXT("C:\\Screen.bmp"),GENERIC_WRITE,0,NULL,CREATE_ALWAYS,
  46. FILE_ATTRIBUTE_NORMAL,0);//创建文件
  47. DWORD dwSize;
  48. WriteFile(hFile,(void *)stream,sumSize,&dwSize,0);//写入位图文件头
  49. ::CloseHandle(hFile);//关闭文件句柄

  50. return stream;
  51. }
复制代码
懂的不懂的都来帮个忙, 怎么把上面stream指向的一个完整位图显示在任意窗口, 不带MFC. 研究一晚了, 只好来求助!.  从磁盘加载, 从资源加载都显示了, 这内存中没思路了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-13 08:57:09 | 显示全部楼层
自己都搞不懂 :sleepy:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-7-14 09:10:30 | 显示全部楼层
悲催了...怎么就没人呢...  

奋战到今天终于显示了,
方法一:
HBITMAP bmp;
BITMAPFILEHEADER *pbmfh;
pbmfh = (BITMAPFILEHEADER*)stream;
bmp = CreateDIBitmap(hdc, (BITMAPINFOHEADER*)(pbmfh+1), CBM_INIT, (BYTE*)pbmfh+pbmfh->bfOffBits,
  (BITMAPINFO*)(pbmfh+1), DIB_RGB_COLORS);
BITMAPINFOHEADER *pmi = (BITMAPINFOHEADER*)(pbmfh+1);
HDC dc;
dc = CreateCompatibleDC(hdc);
SelectObject(dc, bmp);
BitBlt(hdc, 1300, 0, 200, 100, dc, 0, 0, SRCCOPY);
//复制来的, 其中意思待研究, 这个有点麻烦但完美显示了,

方法二:
HDC hdc = GetDC(NULL);
  StretchDIBits(hdc, 1300, 0, bmInfo.bmWidth, bmInfo.bmHeight, 0, 0, bmInfo.bmWidth, bmInfo.bmHeight, stream, (BITMAPINFO*)&bih, DIB_RGB_COLORS, SRCCOPY);
这个简单, 但是显示出的来图像右边20像素的一小竖条跑到左边了..................郁闷, 继续求助, 什么内存对齐之类的, 怎么才能显示正常...

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-7-29 13:47:15 | 显示全部楼层
StretchDIBits  显示内存bmp字节流错位啊! 哪位侠士指点下. 如图, 右边20像素跑左边了, 代码在楼上方法二. 有别的缩放方法也可以.

-_-

-_-
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 17:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表