1、MFC界面保存实现课案将屏幕和MFC程序界面保存成bmp格式图片保存 分类: c+专区 MFC客户端 2014-06-03 16:39 915人阅读 评论(1) 收藏 举报 将屏幕保存为图片,使用vs2008编译通过。#include stdafx.h #include #include int _stdcall WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) HWND hwnd = :GetDesktopWindow(); HDC hDC = :GetDC(hwnd);
2、/获取屏幕DC RECT rect; :GetClientRect(hwnd, &rect);/获取屏幕大小 HDC hDCMem = :CreateCompatibleDC(hDC);/创建兼容DC HBITMAP hBitMap = :CreateCompatibleBitmap(hDC, rect.right, rect.bottom);/创建兼容位图 HBITMAP hOldMap = (HBITMAP):SelectObject(hDCMem, hBitMap);/将位图选入DC,并保存返回值 :BitBlt(hDCMem, 0, 0, rect.right, rect.bottom
3、, hDC, 0, 0, SRCCOPY);/将屏幕DC的图象复制到内存DC中 CImage image; image.Attach(hBitMap); image.Save(_T(c:/B.jpg);/如果文件后缀为.bmp,则保存为为bmp格式 image.Detach(); :SelectObject(hDCMem, hOldMap);/选入上次的返回值 /释放 :DeleteObject(hBitMap); :DeleteDC(hDCMem); :DeleteDC(hDC); return 0; 将当前MFC程序(这里是单文档程序)保存为图片,使用vs2005。第一个使用CImage类
4、保存图片,第二个使用BITMAPINFO。第一个:void CMainFrame:OnGetMap() HWND hwnd = this-GetSafeHwnd(); HDC hDC = :GetWindowDC(hwnd);/获取DC RECT rect; :GetWindowRect(hwnd, &rect);/获取屏幕大小 HDC hDCMem = :CreateCompatibleDC(hDC);/创建兼容DC HBITMAP hBitMap = :CreateCompatibleBitmap(hDC, rect.right-rect.left, rect.bottom-rect.to
5、p);/创建兼容位图 HBITMAP hOldMap = (HBITMAP):SelectObject(hDCMem, hBitMap);/将位图选入DC,并保存返回值 :BitBlt(hDCMem, 0, 0, rect.right-rect.left, rect.bottom-rect.top, hDC, 0, 0, SRCCOPY);/将屏幕DC的图象复制到内存DC中 CImage image;/需要#include image.Attach(hBitMap); image.Save(_T(c:/B.jpg);/如果文件后缀为.bmp,则保存为为bmp格式 image.Detach();
6、 :SelectObject(hDCMem, hOldMap);/选入上次的返回值 /释放 :DeleteObject(hBitMap); :DeleteDC(hDCMem); :DeleteDC(hDC); VC6.0通过,第二个:void CMainFrame:OnGetMap() CDC* pDC = GetWindowDC(); CBitmap bitmap; CDC memDC ; CRect rect; GetWindowRect(rect); memDC.CreateCompatibleDC(pDC); bitmap.CreateCompatibleBitmap(pDC,rect
7、.Width(),rect.Height(); memDC.SelectObject(&bitmap); memDC.BitBlt(0,0,rect.Width(),rect.Height(),pDC,0,0,SRCCOPY); CFileDialog fDlg(FALSE,_T(bmp),NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T(位图文件|*.bmp),this); if (fDlg.DoModal()=IDOK) CString bmpfile = fDlg.GetPathName(); CFile file(bmpfile,CFile:
8、modeCreate|CFile:modeWrite); BITMAP bInfo; bitmap.GetBitmap(&bInfo); /计算调色板大小 int panelsize = 0; if (bInfo.bmBitsPixelbmiHeader.biBitCount = bInfo.bmBitsPixel; bMapInfo-bmiHeader.biClrImportant = 0; bMapInfo-bmiHeader.biCompression = 0; bMapInfo-bmiHeader.biHeight = bInfo.bmHeight; bMapInfo-bmiHeade
9、r.biPlanes = bInfo.bmPlanes; bMapInfo-bmiHeader.biSize = sizeof(BITMAPINFO); bMapInfo-bmiHeader.biSizeImage = bInfo.bmHeight*bInfo.bmWidthBytes; bMapInfo-bmiHeader.biWidth = bInfo.bmWidth; bMapInfo-bmiHeader.biXPelsPerMeter = 0; bMapInfo-bmiHeader.biYPelsPerMeter = 0; /获取位图的实际数据 char* pData = new ch
10、arbMapInfo-bmiHeader.biSizeImage; int len = GetDIBits(pDC-m_hDC,bitmap,0,bInfo.bmHeight,pData,bMapInfo,DIB_RGB_COLORS); BITMAPFILEHEADER bFileHeader; bFileHeader.bfType = 0x4D42; bFileHeader.bfReserved1 = 0; bFileHeader.bfReserved2 = 0; bFileHeader.bfSize = sizeof(BITMAPFILEHEADER); bFileHeader.bfOf
11、fBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+panelsize; /向文件中写入位图数据 file.Write(&bFileHeader,sizeof(BITMAPFILEHEADER); file.Write(&bMapInfo-bmiHeader,sizeof(BITMAPINFOHEADER); file.Write(pData,bMapInfo-bmiHeader.biSizeImage+panelsize); file.Close(); delete pData; LocalFree(bMapInfo); bit
12、map.DeleteObject(); memDC.DeleteDC(); c+截取屏幕图片并保存(函数代码实现) /获取桌面窗口的CDC CDC *pdeskdc = GetDesktopWindow()-GetDC(); CRect re; /获取窗口的大小 GetDesktopWindow()-GetClientRect(&re); CBitmap bmp; bmp.CreateCompatibleBitmap(pdeskdc , re.Width() , re.Height(); /创建一个兼容的内存画板 CDC memorydc; memorydc.CreateCompatibleD
13、C(pdeskdc); /选中画笔 CBitmap *pold = memorydc.SelectObject(&bmp); /绘制图像 memorydc.BitBlt(0,0,re.Width() ,re.Height(), pdeskdc , 0 ,0 ,SRCCOPY) ; /获取鼠标位置,然后添加鼠标图像 CPoint po; GetCursorPos(&po); HICON hinco = (HICON)GetCursor(); memorydc.DrawIcon(po.x-10 , po.y - 10 , hinco); /选中原来的画笔 memorydc.SelectObject
14、(pold); BITMAP bit; bmp.GetBitmap(&bit);/ DWORD size = bit.bmWidth * bit.bmHeight ; /定义 图像大小(单位:byte) DWORD size = bit.bmWidthBytes * bit.bmHeight ; LPSTR lpdata = (LPSTR)GlobalAlloc(GPTR , size) ; /后面是创建一个bmp文件的必须文件头,想要了解可以参考msdn BITMAPINFOHEADER pbitinfo; pbitinfo.biBitCount = 24 ; pbitinfo.biClrI
15、mportant = 0; pbitinfo.biCompression = BI_RGB ; pbitinfo.biHeight = bit.bmHeight ; pbitinfo.biPlanes = 1 ; pbitinfo.biSize = sizeof(BITMAPINFOHEADER); pbitinfo.biSizeImage =size; pbitinfo.biWidth = bit.bmWidth; pbitinfo.biXPelsPerMeter = 0; pbitinfo.biYPelsPerMeter = 0 ; GetDIBits(pdeskdc-m_hDC , bm
16、p , 0 , pbitinfo.biHeight , lpdata , (BITMAPINFO*)&pbitinfo,DIB_RGB_COLORS); BITMAPFILEHEADER bfh; bfh.bfReserved1 = bfh.bfReserved2 = 0 ; bfh.bfType = (WORD)(M 8)|B); bfh.bfSize = 54 + size ; bfh.bfOffBits = 54 ; /写入文件 CFile file; if ( file.Open(1.bmp , CFile:modeCreate|CFile:modeWrite) ) file.Writ
17、eHuge( &bfh , sizeof(BITMAPFILEHEADER) ); file.WriteHuge(&pbitinfo , sizeof(BITMAPINFOHEADER); file.WriteHuge(lpdata , size); file.Close(); GlobalFree(lpdata);MFC程序实现给对话框添加背景图片 1.插入一个Bitmap的资源图片,假设资源名称为:IDC_BITMAP12.在CXXXDialog:OnPaint()中实现:void CMyDialogDlg:OnPaint() if (IsIconic() CPaintDC dc(this
18、); / 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc(), 0); / 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2;
19、 / 绘制图标 dc.DrawIcon(x, y, m_hIcon); else / / 给窗体添加背景 / CPaintDC dc(this); CRect rc; GetClientRect(&rc); CDC dcMem; dcMem.CreateCompatibleDC(&dc); CBitmap bmpBackground; bmpBackground.LoadBitmap(IDB_BITMAP1); BITMAP bitmap; bmpBackground.GetBitmap(&bitmap); CBitmap* pbmpPri = dcMem.SelectObject(&bmpB
20、ackground); dc.StretchBlt(0,0,rc.Width(), rc.Height(), &dcMem,0,0,bitmap.bmWidth, bitmap.bmHeight, SRCCOPY); VC+中播放声音的方法声音是多媒体的一个重要组成部分,在应用程序中加入声音可以使界面更友好。在VC+中可以根据不同的应用要求,用不同的方法实现声音的播放。 一播放声音文件的简单方法 在VC+ 中的多媒体动态连接库中提供了一组与音频设备有关的函数。利用这些函数可以方便地播放声音。最简单的播放声音方法就是直接调用VC+中提供的声音播放函数BOOL sndPlaySound ( LPC
21、STR lpszSound,UINT fuSound ); 或BOOL PlaySound( LPCSTR lpszSound, HMODULE hmod, DWORD fuSound );其中参数lpszSound是需要播放声音的.WAV文件的路径和文件名, hmod在这里为NULL,fuSound是播放声音的标志,详细说明请参考VC+中的帮助。 例如播放C:soundmusic.wav可以用sndPlaySound (c:soundmusic.wav,SND_ASYNC);或PlaySound(c:soundmusic.wav,NULL, SND_ASYNC|SND_NODEFAULT )
22、;如果没有找到music.wav文件,第一种格式将播放系统默认的声音,第二种格式不会播放系统默认的声音。 二将声音文件加入到程序中 在VC+的程序设计中,可以利用各种标准的资源,如位图,菜单,对话框等。同时VC+也允许用户自定义资源,因此我们可以将声音文件作为用户自定义资源加入程序资源文件中,经过编译连接生成EXE文件,实现无.WAV文件的声音播放。 要实现作为资源的声音文件的播放,首先要在资源管理器中加入待播放的声音文件(实现过程并不复杂,这里不在叙述)。假设生成的声音文件资源标识符为IDR_WAVE1。在播放时只需要调用下面的语句: PlaySound(MAKEINTRESOURCE(ID
23、R_WAVE1),AfxGetResourceHandle(), SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP); 其中MAKEINTRESOURCE()宏将整数资源标识符转变为字符串,AfxGetResourceHandle()函数返回包含资源的模块句柄, SND_RESOURCE是必须的标志。 作为资源的声音文件的第二种播放方法是把资源读入内存后作为内存数据播放。具体步骤入下: 1获得包含资源的模块句柄: HMODULE hmod=AfxGetResourceHandle(); 2检索资源块信息: HRSRC hSndResource=Find
24、Resource(hmod,MAKEINTRESOURCE(IDR_WAVE1),_T(WAVE); 3. 装载资源数据并加锁: HGLOBAL hGlobalMem=LoadResource(hmod,hSndResource); LPCTSTR lpMemSound=(LPCSTR)LockResource(hGlobalMem); 4播放声音文件: sndPlaySound(lpMemSound,SND_MEMORY); 5释放资源句柄: FreeResource(hGlobalMem); 三播放声音文件的高级方法 在VC+中提供了一组对音频设备及多媒体文件直接进行操作的函数。利用这些函
25、数可以灵活地对声音文件进行各种处理。 首先介绍几个要用到的数据结构。WAVEFORMATEX结构定义了WAVE音频数据文件的格式。WAVEHDR结构定义了波形音频缓冲区。读出的数据首先要填充此缓冲区才能送音频设备播放。WAVEOUTCAPS结构描述了音频设备的性能。MMCKINFO结构包含了RIFF文件中一个块的信息。详细的说明请参考VC+中的帮助。 下面给出程序流程简图及程序源代码清单,在VC+环境下可直接使用: 源程序清单如下: LPSTR szFileName;/声音文件名 MMCKINFO mmckinfoParent; MMCKINFO mmckinfoSubChunk; DWORD
26、 dwFmtSize; HMMIO m_hmmio;/音频文件句柄 DWORD m_WaveLong; HPSTR lpData;/音频数据 HANDLE m_hData; HANDLE m_hFormat; WAVEFORMATEX * lpFormat; DWORD m_dwDataOffset; DWORD m_dwDataSize; WAVEHDR pWaveOutHdr; WAVEOUTCAPS pwoc; HWAVEOUT hWaveOut; /打开波形文件 if(!(m_hmmio=mmioOpen(szFileName,NULL,MMIO_READ|MMIO_ALLOCBUF) /File open Error Error(Failed to open the file.);/错误处理函数 return false; /检查打开文件是否是声音文件 mmckinfoParent.fccType =mmioFOURCC(W,A,V,E); if(mmio
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2