MFC界面保存实现课案.docx
- 文档编号:29124823
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:38
- 大小:32.32KB
MFC界面保存实现课案.docx
《MFC界面保存实现课案.docx》由会员分享,可在线阅读,更多相关《MFC界面保存实现课案.docx(38页珍藏版)》请在冰豆网上搜索。
MFC界面保存实现课案
将屏幕和MFC程序界面保存成bmp格式图片保存
分类:
c++专区MFC客户端2014-06-0316:
39915人阅读评论
(1)收藏举报
将屏幕保存为图片,使用vs2008编译通过。
#include"stdafx.h"
#include
#include
int__stdcallWinMain(
HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPSTRlpCmdLine,
intnShowCmd)
{
HWNDhwnd=:
:
GetDesktopWindow();
HDChDC=:
:
GetDC(hwnd);//获取屏幕DC
RECTrect;
:
:
GetClientRect(hwnd,&rect);//获取屏幕大小
HDChDCMem=:
:
CreateCompatibleDC(hDC);//创建兼容DC
HBITMAPhBitMap=:
:
CreateCompatibleBitmap(hDC,rect.right,rect.bottom);//创建兼容位图
HBITMAPhOldMap=(HBITMAP):
:
SelectObject(hDCMem,hBitMap);//将位图选入DC,并保存返回值
:
:
BitBlt(hDCMem,0,0,rect.right,rect.bottom,hDC,0,0,SRCCOPY);//将屏幕DC的图象复制到内存DC中
CImageimage;
image.Attach(hBitMap);
image.Save(_T("c:
//B.jpg"));//如果文件后缀为.bmp,则保存为为bmp格式
image.Detach();
:
:
SelectObject(hDCMem,hOldMap);//选入上次的返回值
//释放
:
:
DeleteObject(hBitMap);
:
:
DeleteDC(hDCMem);
:
:
DeleteDC(hDC);
return0;
}
将当前MFC程序(这里是单文档程序)保存为图片,使用vs2005。
第一个使用CImage类保存图片,第二个使用BITMAPINFO。
第一个:
voidCMainFrame:
:
OnGetMap()
{
HWNDhwnd=this->GetSafeHwnd();
HDChDC=:
:
GetWindowDC(hwnd);//获取DC
RECTrect;
:
:
GetWindowRect(hwnd,&rect);//获取屏幕大小
HDChDCMem=:
:
CreateCompatibleDC(hDC);//创建兼容DC
HBITMAPhBitMap=:
:
CreateCompatibleBitmap(hDC,rect.right-rect.left,rect.bottom-rect.top);//创建兼容位图
HBITMAPhOldMap=(HBITMAP):
:
SelectObject(hDCMem,hBitMap);//将位图选入DC,并保存返回值
:
:
BitBlt(hDCMem,0,0,rect.right-rect.left,rect.bottom-rect.top,hDC,0,0,SRCCOPY);//将屏幕DC的图象复制到内存DC中
CImageimage;//需要#include
image.Attach(hBitMap);
image.Save(_T("c:
//B.jpg"));//如果文件后缀为.bmp,则保存为为bmp格式
image.Detach();
:
:
SelectObject(hDCMem,hOldMap);//选入上次的返回值
//释放
:
:
DeleteObject(hBitMap);
:
:
DeleteDC(hDCMem);
:
:
DeleteDC(hDC);
}
VC6.0通过,第二个:
voidCMainFrame:
:
OnGetMap()
{
CDC*pDC=GetWindowDC();
CBitmapbitmap;
CDCmemDC;
CRectrect;
GetWindowRect(rect);
memDC.CreateCompatibleDC(pDC);
bitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
memDC.SelectObject(&bitmap);
memDC.BitBlt(0,0,rect.Width(),rect.Height(),pDC,0,0,SRCCOPY);
CFileDialogfDlg(FALSE,_T("bmp"),NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("位图文件|*.bmp"),this);
if(fDlg.DoModal()==IDOK)
{
CStringbmpfile=fDlg.GetPathName();
CFilefile(bmpfile,CFile:
:
modeCreate|CFile:
:
modeWrite);
BITMAPbInfo;
bitmap.GetBitmap(&bInfo);
//计算调色板大小
intpanelsize=0;
if(bInfo.bmBitsPixel<24)//非真彩色
{
panelsize=pow((double)2,bInfo.bmBitsPixel)*sizeof(RGBQUAD);
}
//定义位图信息
BITMAPINFO* bMapInfo=(BITMAPINFO*)LocalAlloc(LPTR,sizeof(BITMAPINFO)+panelsize);
bMapInfo->bmiHeader.biBitCount=bInfo.bmBitsPixel;
bMapInfo->bmiHeader.biClrImportant=0;
bMapInfo->bmiHeader.biCompression=0;
bMapInfo->bmiHeader.biHeight=bInfo.bmHeight;
bMapInfo->bmiHeader.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=newchar[bMapInfo->bmiHeader.biSizeImage];
intlen=GetDIBits(pDC->m_hDC,bitmap,0,bInfo.bmHeight,pData,bMapInfo,DIB_RGB_COLORS);
BITMAPFILEHEADERbFileHeader;
bFileHeader.bfType=0x4D42;
bFileHeader.bfReserved1=0;
bFileHeader.bfReserved2=0;
bFileHeader.bfSize=sizeof(BITMAPFILEHEADER);
bFileHeader.bfOffBits=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();
deletepData;
LocalFree(bMapInfo);
}
bitmap.DeleteObject();
memDC.DeleteDC();
}
c++截取屏幕图片并保存(函数代码实现)
//获取桌面窗口的CDC
CDC*pdeskdc=GetDesktopWindow()->GetDC();
CRectre;
//获取窗口的大小
GetDesktopWindow()->GetClientRect(&re);
CBitmapbmp;
bmp.CreateCompatibleBitmap(pdeskdc,re.Width(),re.Height());
//创建一个兼容的内存画板
CDCmemorydc;
memorydc.CreateCompatibleDC(pdeskdc);
//选中画笔
CBitmap*pold=memorydc.SelectObject(&bmp);
//绘制图像
memorydc.BitBlt(0,0,re.Width(),re.Height(),pdeskdc,0,0,SRCCOPY);
//获取鼠标位置,然后添加鼠标图像
CPointpo;
GetCursorPos(&po);
HICONhinco=(HICON)GetCursor();
memorydc.DrawIcon(po.x-10,po.y-10,hinco);
//选中原来的画笔
memorydc.SelectObject(pold);
BITMAPbit;
bmp.GetBitmap(&bit);
//DWORDsize=bit.bmWidth*bit.bmHeight;
//定义图像大小(单位:
byte)
DWORDsize=bit.bmWidthBytes*bit.bmHeight;
LPSTRlpdata=(LPSTR)GlobalAlloc(GPTR,size);
//后面是创建一个bmp文件的必须文件头,想要了解可以参考msdn
BITMAPINFOHEADERpbitinfo;
pbitinfo.biBitCount=24;
pbitinfo.biClrImportant=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,bmp,0,pbitinfo.biHeight,lpdata,
(BITMAPINFO*)&pbitinfo,DIB_RGB_COLORS);
BITMAPFILEHEADERbfh;
bfh.bfReserved1=bfh.bfReserved2=0;
bfh.bfType=((WORD)('M'<<8)|'B');
bfh.bfSize=54+size;
bfh.bfOffBits=54;
//写入文件
CFilefile;
if(file.Open("1.bmp",CFile:
:
modeCreate|CFile:
:
modeWrite))
{
file.WriteHuge(&bfh,sizeof(BITMAPFILEHEADER));
file.WriteHuge(&pbitinfo,sizeof(BITMAPINFOHEADER));
file.WriteHuge(lpdata,size);
file.Close();
}
GlobalFree(lpdata);
MFC程序实现给对话框添加背景图片
1.插入一个Bitmap的资源图片,假设资源名称为:
IDC_BITMAP1
2.在CXXXDialog:
:
OnPaint()中实现:
voidCMyDialogDlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND,reinterpret_cast
//使图标在工作区矩形中居中
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//绘制图标
dc.DrawIcon(x,y,m_hIcon);
}
else
{
//
//给窗体添加背景
//
CPaintDCdc(this);
CRectrc;
GetClientRect(&rc);
CDCdcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmapbmpBackground;
bmpBackground.LoadBitmap(IDB_BITMAP1);
BITMAPbitmap;
bmpBackground.GetBitmap(&bitmap);
CBitmap*pbmpPri=dcMem.SelectObject(&bmpBackground);
dc.StretchBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
}
}
VC++中播放声音的方法
声音是多媒体的一个重要组成部分,在应用程序中加入声音可以使界面更友好。
在VC++中可以根据不同的应用要求,用不同的方法实现声音的播放。
一.播放声音文件的简单方法
在VC++中的多媒体动态连接库中提供了一组与音频设备有关的函数。
利用这些函数可以方便地播放声音。
最简单的播放声音方法就是直接调用VC++中提供的声音播放函数BOOLsndPlaySound(LPCSTRlpszSound,UINTfuSound);或BOOLPlaySound(LPCSTRlpszSound,HMODULEhmod,DWORDfuSound);其中参数lpszSound是需要播放声音的.WAV文件的路径和文件名,hmod在这里为NULL,fuSound是播放声音的标志,详细说明请参考VC++中的帮助。
例如播放C:
soundmusic.wav可以用sndPlaySound("c:
\sound\music.wav",SND_ASYNC);或PlaySound("c:
\sound\music.wav",NULL,SND_ASYNC|SND_NODEFAULT);如果没有找到music.wav文件,第一种格式将播放系统默认的声音,第二种格式不会播放系统默认的声音。
二.将声音文件加入到程序中
在VC++的程序设计中,可以利用各种标准的资源,如位图,菜单,对话框等。
同时VC++也允许用户自定义资源,因此我们可以将声音文件作为用户自定义资源加入程序资源文件中,经过编译连接生成EXE文件,实现无.WAV文件的声音播放。
要实现作为资源的声音文件的播放,首先要在资源管理器中加入待播放的声音文件(实现过程并不复杂,这里不在叙述)。
假设生成的声音文件资源标识符为IDR_WAVE1。
在播放时只需要调用下面的语句:
PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(),SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP);
其中MAKEINTRESOURCE()宏将整数资源标识符转变为字符串,AfxGetResourceHandle()函数返回包含资源的模块句柄,
SND_RESOURCE是必须的标志。
作为资源的声音文件的第二种播放方法是把资源读入内存后作为内存数据播放。
具体步骤入下:
1.获得包含资源的模块句柄:
HMODULEhmod=AfxGetResourceHandle();
2.检索资源块信息:
HRSRChSndResource=FindResource(hmod,MAKEINTRESOURCE(IDR_WAVE1),_T("WAVE"));
3.装载资源数据并加锁:
HGLOBALhGlobalMem=LoadResource(hmod,hSndResource);
LPCTSTRlpMemSound=(LPCSTR)LockResource(hGlobalMem);
4.播放声音文件:
sndPlaySound(lpMemSound,SND_MEMORY));
5.释放资源句柄:
FreeResource(hGlobalMem);
三.播放声音文件的高级方法
在VC++中提供了一组对音频设备及多媒体文件直接进行操作的函数。
利用这些函数可以灵活地对声音文件进行各种处理。
首先介绍几个要用到的数据结构。
WAVEFORMATEX结构定义了WAVE音频数据文件的格式。
WAVEHDR结构定义了波形音频缓冲区。
读出的数据首先要填充此缓冲区才能送音频设备播放。
WAVEOUTCAPS结构描述了音频设备的性能。
MMCKINFO结构包含了RIFF文件中一个块的信息。
详细的说明请参考VC++中的帮助。
下面给出程序流程简图及程序源代码清单,在VC++环境下可直接使用:
源程序清单如下:
LPSTRszFileName;//声音文件名
MMCKINFOmmckinfoParent;
MMCKINFOmmckinfoSubChunk;
DWORDdwFmtSize;
HMMIOm_hmmio;//音频文件句柄
DWORDm_WaveLong;
HPSTRlpData;//音频数据
HANDLEm_hData;
HANDLEm_hFormat;
WAVEFORMATEX*lpFormat;
DWORDm_dwDataOffset;
DWORDm_dwDataSize;
WAVEHDRpWaveOutHdr;
WAVEOUTCAPSpwoc;
HWAVEOUThWaveOut;
//打开波形文件
if(!
(m_hmmio=mmioOpen(szFileName,NULL,MMIO_READ|MMIO_ALLOCBUF)))
{
//FileopenError
Error("Failedtoopenthefile.");//错误处理函数
returnfalse;
}
//检查打开文件是否是声音文件
mmckinfoParent.fccType=mmioFOURCC(’W’,’A’,’V’,’E’);
if(mmio
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC 界面 保存 实现