MFC界面保存实现课案.docx

上传人:b****0 文档编号:16859128 上传时间:2023-07-19 格式:DOCX 页数:38 大小:32.32KB
下载 相关 举报
MFC界面保存实现课案.docx_第1页
第1页 / 共38页
MFC界面保存实现课案.docx_第2页
第2页 / 共38页
MFC界面保存实现课案.docx_第3页
第3页 / 共38页
MFC界面保存实现课案.docx_第4页
第4页 / 共38页
MFC界面保存实现课案.docx_第5页
第5页 / 共38页
MFC界面保存实现课案.docx_第6页
第6页 / 共38页
MFC界面保存实现课案.docx_第7页
第7页 / 共38页
MFC界面保存实现课案.docx_第8页
第8页 / 共38页
MFC界面保存实现课案.docx_第9页
第9页 / 共38页
MFC界面保存实现课案.docx_第10页
第10页 / 共38页
MFC界面保存实现课案.docx_第11页
第11页 / 共38页
MFC界面保存实现课案.docx_第12页
第12页 / 共38页
MFC界面保存实现课案.docx_第13页
第13页 / 共38页
MFC界面保存实现课案.docx_第14页
第14页 / 共38页
MFC界面保存实现课案.docx_第15页
第15页 / 共38页
MFC界面保存实现课案.docx_第16页
第16页 / 共38页
MFC界面保存实现课案.docx_第17页
第17页 / 共38页
MFC界面保存实现课案.docx_第18页
第18页 / 共38页
MFC界面保存实现课案.docx_第19页
第19页 / 共38页
MFC界面保存实现课案.docx_第20页
第20页 / 共38页
亲,该文档总共38页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

MFC界面保存实现课案.docx

《MFC界面保存实现课案.docx》由会员分享,可在线阅读,更多相关《MFC界面保存实现课案.docx(38页珍藏版)》请在冰点文库上搜索。

MFC界面保存实现课案.docx

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(dc.GetSafeHdc()),0);

//使图标在工作区矩形中居中

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模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2