• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > mic_lee2000的截图代码,怎么直接保存图片到硬盘?

mic_lee2000的截图代码,怎么直接保存图片到硬盘?

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了mic硬盘,mic,mic男团,集成块 mic29152bu,蓝牙音箱mic等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: mic_lee2000 的截图代码,怎么直接保存图片到硬盘?
描述:


mic_lee2000 的截图代码,怎么直接保存图片到硬盘?
、引用 4 楼 mic_lee2000 的回复:
下面的代码肯定能用,也一定好用: 
// 创建WebBrowser屏幕快照 
HBITMAP CWebBrowser::CreateSnapShot() 
{ 
IHTMLDocument2* pDoc = this->get_Document(); 
if(NULL == pDoc) 
return NULL; 
CComPtr <IHTMLDocument2> spDoc(pDoc); 
pDoc->Release(); 
if(NULL == spDoc) 
return NULL; 
    HRESULT hr; 
CComPtr <IViewObject> spViewObject = NULL; 
hr = spDoc->QueryInterface(IID_IViewObject,(void **)&spViewObject); 
if(FAILED(hr) || NULL == spViewObject) 
return NULL; 
// get WebBrowser device context 
HDC wndDC = ::GetWindowDC(this->m_hWnd); 
HDC dc = ::CreateCompatibleDC(wndDC); 
RECT rect; 
GetWindowRect(&rect); 
HBITMAP hBitmap = ::CreateCompatibleBitmap(wndDC,rect.right - rect.left,rect.bottom - rect.top); 
if(NULL == hBitmap) 
return NULL; 
Gdiplus::Bitmap* bmp = Gdiplus::Bitmap::FromHBITMAP(hBitmap,NULL); 
HGDIOBJ hobj = ::SelectObject(dc,(HGDIOBJ)hBitmap);  // Select the Snapshot bitmap object;hobj 
try 
{ 
::Gdiplus::Graphics* g = ::Gdiplus::Graphics::FromHDC(dc); 
g->Clear(Gdiplus::Color(255,255,255)); 
delete g; 
g = NULL; 
RECTL rectl; 
rectl.top = 0; 
rectl.left = 0; 
rectl.right = rect.right - rect.left; 
rectl.bottom = rect.bottom - rect.top; 
DVASPECTINFO info; 
info.cb = sizeof(info); 
info.dwFlags = DVASPECTINFOFLAG_CANOPTIMIZE; 
// draw screen snapshot. 
hr = spViewObject->Draw(DVASPECT_CONTENT,-1, 
&info,NULL,NULL,dc,&rectl,&rectl,NULL,0); 
} 
catch(...) 
{ 
  ATLTRACE2(atlTraceCOM,2,_T("create a webbrowser thumb failed....")); 
} 
::SelectObject(dc,hobj); 
::DeleteDC(dc); 
return hBitmap; 
} 
这个代码,怎么实现保存图片. ?


解决方案1:

将HBITMAP保存为BMP文件的代码一般如下:
WORD wbitsCount;//位图中每个像素所占字节数。
       DWORD dwpalettelsize=0;//调色板大小
       DWORD dwbmdibitsize,dwdibsize,dwwritten;
       BITMAP bitmap;//定义了位图的各种的信息。
       BITMAPFILEHEADER bmfhdr;//定义了大小、类型等BMP文件的信息。
       BITMAPINFOHEADER bi;
       LPBITMAPINFOHEADER lpbi;
       HANDLE fh,fdib;
GetObject(hBitmap,sizeof(BITMAP),(void *)&bitmap);//得到BITMAP结构。
       //以下代码是用BITMAP的信息填充BITMAPINFOHEADER结构
       wbitsCount=bitmap.bmBitsPixel;
bi.biSize=sizeof(BITMAPINFOHEADER);
       bi.biWidth=bitmap.bmWidth;
       bi.biHeight=bitmap.bmHeight;
       bi.biPlanes=1;
       bi.biBitCount= bitmap.bmBitsPixel ;
       bi.biClrImportant=0;
       bi.biClrUsed=0;
       bi.biCompression=BI_RGB;
       bi.biSizeImage=0;
       bi.biYPelsPerMeter=0;
       bi.biXPelsPerMeter=0;
//以下代码是获取调色板的长度,调色板现在的用处很少,因为256色的位图已经不多了。
       if(wbitsCount<=8)
              dwpalettelsize=(1<<wbitsCount)*sizeof(RGBQUAD);
//计算位图的大小,并分配相应的内存空间,注意的是没有分配BITMAPFILEHEADER。
       dwbmdibitsize=((bitmap.bmWidth*wbitsCount+31)/8)*bitmap.bmHeight;
       fdib=GlobalAlloc(GHND,dwbmdibitsize+dwpalettelsize+sizeof(BITMAPINFOHEADER));
       lpbi=(LPBITMAPINFOHEADER)::GlobalLock(fdib);
       *lpbi=bi;//将bi中的数据写入分配的内存中。
       hdc=::GetDC(NULL);
       GetDIBits(hdc,hBitmap,0,(UINT)bitmap.bmHeight,(LPSTR)lpbi+sizeof(BITMAPINFOHEADER)+dwpalettelsize,(BITMAPINFO *)lpbi,DIB_RGB_COLORS);
/*GetDIBits是最重要的函数,真正获得位图数据的工作就由它完成,它第一个参数为HDC,第二个参数为位图句柄,第三个参数为扫描行的开始行,一般为0,第四个为结束行,一般就是高度,第四个参数最重要,它表示接收数据的起始地址,这个地址一般是在调色板之后。第五个参数指的是接收BITMAPINFO结构的地址,这个结构上面没有写,它其实就是BITMAPINFO结构加上调色板信息。最后一个参数是格式。一般是DIB_RGB_COLORS*/
//创建文件以及文件信息头
fh=CreateFile(FileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,NULL);
       if(fh==INVALID_HANDLE_VALUE)
              return FALSE;
bmfhdr.bfType=0x4d42;//BMP类型,一定要这样写
       dwdibsize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwbmdibitsize+dwpalettelsize;//文件总长,由几个部分组成
       bmfhdr.bfSize=dwdibsize;
       bmfhdr.bfReserved1=0;
       bmfhdr.bfReserved2=0;
bmfhdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwpalettelsize;//位图数据相对于文件头的偏移量
//将文件信息头写入文件
WriteFile(fh,(LPSTR)&bmfhdr,sizeof(BITMAPFILEHEADER),&dwwritten,NULL);
//将数据写入文件,包含BITMAPINFO结构、调色板、数据
WriteFile(fh,(LPSTR)lpbi,dwdibsize,&dwwritten,NULL);
//关闭相关句柄
::GlobalUnlock(fdib);
       ::GlobalFree(fdib);
       ::CloseHandle(fh);
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wltg2001/archive/2008/04/17/2300258.aspx


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • mic_lee2000的截图代码,怎么直接保存图片到硬盘?

相关文章

  • 2017-06-05 我编译出来的文件超大,怎么办?
  • 2017-06-04 如何在exe程序中为ie添加external接口
  • 2017-06-05 我机子中病毒了,请大家帮忙,谁见见过着中病毒??
  • 2017-06-04 COMactive?
  • 2017-06-04 请教:做ActiveX控件的时候,有种方法把数据写入注册表,请帮忙!
  • 2017-06-05 WMP的用户界面插件
  • 2017-06-05 在主框架窗口的一消息响应函数里用ShellExecute()方法调用另一个exe程序时遇到的问题。谢谢!
  • 2017-06-05 谁能给我一个多线程下载文件例子?
  • 2017-06-04 RichEdit中的COM问题!!!
  • 2017-06-05 线程专用钩子和全局钩子在编码上区别在哪里啊?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 怎样用_heapchk重现捕捉内存错误!急
    • 如何用VC写网页上的ActiveX控件?如何发布,如何签名?
    • 用ATL写asp组件,能否在ie中显示窗体?
    • 程序间通讯的问题,急急急急
    • 从资源dll中读取位图失败,各位请看-->>
    • 如何捕获这样的文件下载
    • 看过<COM技术内幕>的大侠请进
    • CEvent我不知如何用啊,HELP!
    • 怎样在视图里加载ActiveX?
    • BHO中,如何禁止javascript和vbscript的运行啊?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有