多媒体应用程序的设计_第1页
多媒体应用程序的设计_第2页
多媒体应用程序的设计_第3页
多媒体应用程序的设计_第4页
多媒体应用程序的设计_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Windows程序设计何倩桂电信息与通信学院教材: Visual C+面向对象与可视化程序设计 (第二版)黄维通编著,清华大学出版社参考书: 1. C+程序设计教程,钱能编著, 清华大学出版社2Visual C+程序设计基础与实例分析,朱晴婷编著2第第10讲讲 多媒体应用程序的设计多媒体应用程序的设计 312.1 利用音频函数利用音频函数 为了介绍多媒体程序的设计,我们为了介绍多媒体程序的设计,我们先介绍一个非常简单的例子,希望先介绍一个非常简单的例子,希望读者能够通过这个简单的例子,了读者能够通过这个简单的例子,了解音频文件的播放方法解音频文件的播放方法 412.1.1 一个简单的应用实例一

2、个简单的应用实例 【例例12-1】设计一个简单的音频播放程序,程设计一个简单的音频播放程序,程序启动时,播放序启动时,播放windows系动启动时候的音乐系动启动时候的音乐1.创建工程文件创建工程文件MCIStart;打开;打开Stdafx.h文件,在文件,在#ifndef _AFX_NO_AFXCMN_SUPPORT语句的上一行顶头加入语句的上一行顶头加入语句语句#include 2.将将winmm.lib与应用程序链与应用程序链接起来接起来3.在在MCIStartDlg.cpp的的OnInitDialog()函数中的函数中的return TRUE之前加上代码:之前加上代码: sndPlay

3、Sound(SystemStart,SND_ASYNC); 512.1.2 几个常用的音频函数几个常用的音频函数 MessageBeep()函数函数: :用来播放系统提示用来播放系统提示音音 sndPlaySound()函数函数:播放播放wavwav音频音频 PlaySound()函数函数:播放来自资源中的声播放来自资源中的声音音PlaySound()sndPlaySound()MessageBeep()功能包功能包含关系含关系612.1.3 用用MCI控制波形声音的播放控制波形声音的播放 MCIERROR mciSendCommand(MCIDEVICEID IDDevice, /接收命令消

4、息的接收命令消息的MCI设备设备ID UINT uMsg, /发送的命令消息发送的命令消息 DWORD fdwCommand, /命令消息的标志集命令消息的标志集 DWORD_PTR dwParam) /消息参数的结构体地址消息参数的结构体地址常用的常用的MCI设备消息设备消息 见教材表见教材表12-57在调用在调用MCI设备时可用设备时可用mciGetErrorString()检检测错误,该函数的原型如下:测错误,该函数的原型如下: BOOL mciGetErrorString( DWORD fdwError, /错误代码错误代码 LPTSTR lpszErrorText, /指向错误内容字

5、串的指针指向错误内容字串的指针 UINT cchErrorText /错误内容的缓冲区容量错误内容的缓冲区容量) 8【例例12-212-2】编写一个音频播放器程序,可以选编写一个音频播放器程序,可以选择音频文件,并控制其播放、暂停播放、暂择音频文件,并控制其播放、暂停播放、暂停后的继续播放以及停止播放的功能停后的继续播放以及停止播放的功能 IDC_OPEN_BUTTON IDC_CLOSE_BUTTON IDC_START_BUTTON IDC_PAUSE_BUTTON IDC_STOP_BUTTON IDC_EXIT_BUTTON 91. 将头文件将头文件mmsystem.h加入到文件加入到

6、文件Stdafx.h中,中,将多媒体函数库将多媒体函数库winmm.lib通过通过project菜单中的菜单中的seetings命令来与程序链接起来命令来与程序链接起来 2.在在CMCIPlayerDlg类上增加类上增加Protected类型的成员变量,类型的成员变量,具体如下:具体如下: BOOL m_PSign(作为判断正在播放的标识)(作为判断正在播放的标识) BOOL m_ASign(作为判断正在播放的标识)、(作为判断正在播放的标识)、DWORD dwError(用来储存错误代码)、(用来储存错误代码)、MCIDEVICEID m_MCIDeviceID(用来储存打开设备的用来储存打

7、开设备的ID值值) charszErrorBufMAXERRORLENGTH(用来储存出错内容)用来储存出错内容) 10BOOL CMCIPlayerDlg:OnInitDialog()CDialog:OnInitDialog();/ TODO: Add extra initialization herem_PSign=FALSE;/初始化正在播放标识初始化正在播放标识m_ASign=FALSE; /初始化正在暂停标识初始化正在暂停标识m_MCIDeviceID=0; /初始化设备标识初始化设备标识return TRUE;11void CMCIPlayerDlg:OnOpenButton()

8、/打开一个文件打开一个文件CString filename;/定义定义CString类的类的filename用来存储文件名用来存储文件名CString fileext;/定义定义CString类的类的fileext用来存储文件扩展名用来存储文件扩展名MCI_OPEN_PARMS mciOpenParms;/定义结构体变量用来存储打定义结构体变量用来存储打开文件的信息和返回的设备标识信息开文件的信息和返回的设备标识信息DWORD dwError;/定义定义dwError用来储存返回的错误标识用来储存返回的错误标识static char szFilter=波形音频文件波形音频文件(*.wav)|*

9、.wav|MIDI序列序列(*.mid)|*.mid0;CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);/通过打开按钮时显示的内容通过打开按钮时显示的内容12if (dlg.DoModal()=IDOK) filename=dlg.GetFileName();/获取打开的文件名获取打开的文件名 fileext=dlg.GetFileExt();/获取打开的文件扩展名获取打开的文件扩展名 if (m_PSign) /如果程序正在播放,则关闭如果程序正在播放,则关闭 dwError=mciS

10、endCommand(m_MCIDeviceID,MCI_CLOSE,0,NULL);/关闭正在播放的声音关闭正在播放的声音if (dwError) /如果关闭不成功,则显示出错的原因如果关闭不成功,则显示出错的原因 if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)MessageBox(szErrorBuf,MCI出错出错,MB_ICONWARNING); elseMessageBox(不明错误标识不明错误标识,MCI出错出错,MB_ICONWARNING);/给出相应报告给出相应报告return; 13/如果没有声音

11、正在播放,则获取打开文件的后辍,并如果没有声音正在播放,则获取打开文件的后辍,并根据后辍决定相应的打开类型根据后辍决定相应的打开类型if (!strcmp(wav,fileext)/当后辍为当后辍为wav时时mciOpenParms.lpstrDeviceType=waveaudio;else if (!strcmp(mid,fileext)/当后辍为当后辍为mid时时mciOpenParms.lpstrDeviceType=sequencer;mciOpenParms.lpstrElementName=filename;/将打开的文件名存入将打开的文件名存入mciOpenParms结构体中结

12、构体中dwError=mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpenParms);/发送打开文件命令,发送打开文件命令,MCI_OPEN_TYPE参数说明设备类参数说明设备类型名包含在型名包含在mciOpenParms结构体中,结构体中,/MCI_OPEN_ELEMENT参数说明要打开的文件名包含在参数说明要打开的文件名包含在mciOpenParams结构体中结构体中14if (dwError)/如果打开不成功,则显示出错的原因如果打开不成功,则显示出错的原因if (mci

13、GetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)MessageBox(szErrorBuf,MCI出错出错,MB_ICONWARNING);else MessageBox(不明错误标识不明错误标识,MCI出错出错,MB_ICONWARNING);return;m_MCIDeviceID=mciOpenParms.wDeviceID;/将获取的设备将获取的设备ID值赋给全局变量值赋给全局变量m_MCIDeviceIDm_PSign=FALSE;/设置正在播放标识为设置正在播放标识为FALSEm_ASign=FALSE;/设置正在暂停

14、标识为设置正在暂停标识为FALSE 15void CMCIPlayerDlg:OnStartButton() /从头开始播放从头开始播放 MCI_PLAY_PARMS mciPlayParms;/结构体变量存储播放相关信息结构体变量存储播放相关信息 if (!m_PSign)/如果没有正在播放的声音如果没有正在播放的声音 mciPlayParms.dwCallback=(long)GetSafeHwnd();/为发送为发送MM_MCINOTIFY消息指定窗口句柄消息指定窗口句柄 mciPlayParms.dwFrom=0;/设置播放位置从头开始设置播放位置从头开始dwError=mciSend

15、Command(m_MCIDeviceID,MCI_PLAY,MCI_FROM|MCI_NOTIFY,(DWORD)(LPVOID)&mciPlayParms); /开始播放声音,参数开始播放声音,参数MCI_FROM说明开始播放的位置说明开始播放的位置包含在包含在mciPlayParms结构体中结构体中 /参数参数MCI_NOTIFY的意义是播放完后发送的意义是播放完后发送MM_MCINOTIFY消息消息 16if (dwError) if (mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH) MessageBox(

16、szErrorBuf,MCI出错出错,MB_ICONWARNING); else MessageBox(不明错误标识不明错误标识,MCI出错出错,MB_ICONWARNING); return; m_PSign=TRUE;/设置正在播放标识为设置正在播放标识为TRUE 17void CMCIPlayerDlg:OnPauseButton() if (m_PSign)/如果有正在播放的声音如果有正在播放的声音if (!m_ASign)/如果不是暂停状态如果不是暂停状态dwError=mciSendCommand(m_MCIDeviceID,MCI_PAUSE,0,NULL);/则暂停播放则暂停播

17、放if (dwError)if (mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH) MessageBox(szErrorBuf,MCI出错出错,MB_ICONWARNING); else MessageBox(不明错误标识不明错误标识,MCI出错出错,MB_ICONWARNING);return;m_ASign=TRUE;/设置正在暂停标识为设置正在暂停标识为TRUE 18else/如果已经是暂停状态如果已经是暂停状态dwError=mciSendCommand(m_MCIDeviceID,MCI_RESUME,0,NULL

18、);/则继续播放则继续播放 if (dwError) if (mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)MessageBox(szErrorBuf,MCI出错出错,MB_ICONWARNING); else MessageBox(不明错误标识不明错误标识,MCI出错出错,MB_ICONWARNING);return; m_ASign=FALSE;/设置正在暂停标识为设置正在暂停标识为FALSE 19void CMCIPlayerDlg:OnStopButton() dwError=mciSendCommand(m_MC

19、IDeviceID,MCI_STOP,MCI_WAIT,NULL);/发送停止命令消息,参数发送停止命令消息,参数MCI_WAIT说明当命令执行结说明当命令执行结束后函数才返回值束后函数才返回值if (dwError)if (mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)MessageBox(szErrorBuf,MCI出错出错,MB_ICONWARNING); else MessageBox(不明错误标识不明错误标识,MCI出错出错,MB_ICONWARNING);return;m_PSign=FALSE;/设置正在播放

20、标识为设置正在播放标识为FALSEm_ASign=FALSE;/设置正在暂停标识为设置正在暂停标识为FALSEMessageBox(如要播放新的文件,请在打开前先关闭如要播放新的文件,请在打开前先关闭现有文件现有文件,注意注意,MB_ICONQUESTION);/提请用户注意先关闭现有文件提请用户注意先关闭现有文件20void CMCIPlayerDlg:OnCloseButton() /关闭当前设备关闭当前设备if (m_MCIDeviceID) /若什么文件都没有打开过,就不执行关闭操作若什么文件都没有打开过,就不执行关闭操作 dwError=mciSendCommand(m_MCIDev

21、iceID,MCI_STOP,MCI_WAIT,NULL); if (dwError) if (mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)MessageBox(szErrorBuf,MCI出错出错,MB_ICONWARNING); else MessageBox(不明错误标识不明错误标识,MCI出错出错,MB_ICONWARNING);return; dwError=mciSendCommand(m_MCIDeviceID,MCI_CLOSE,0,NULL);if (dwError) if (mciGetErrorSt

22、ring(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)MessageBox(szErrorBuf,MCI出错出错,MB_ICONWARNING); else MessageBox(不明错误标识不明错误标识,MCI出错出错,MB_ICONWARNING);return; m_MCIDeviceID=0;/关闭文件后将变量设为关闭文件后将变量设为 0 21void CMCIPlayerDlg:OnExitButton()void CMCIPlayerDlg:OnExitButton()/点击确定的响应点击确定的响应 OnCloseButton();OnClos

23、eButton();/先执行关闭文件的操作先执行关闭文件的操作CDialog:OnOK();CDialog:OnOK();/关闭窗口关闭窗口 22手动加入手动加入MM_MCINOTIFY消息的处理函数消息的处理函数在在MCIPlayerDlg.h中的函数中的函数class CMCIPlayerDlg : public CDialog()的()的“/AFX_MSG”和和“DECLARE_MESSAGE_MAP()”语句之间加入如下代码:语句之间加入如下代码: afx_msg LRESULT MciNotify(WPARAM wParam,LPARAM lParam);23在在MCIPlayerD

24、lg.cpp中的消息映射入口处加入如下代码:中的消息映射入口处加入如下代码: ON_MESSAGE(MM_MCINOTIFY,MciNotify)。样式如下:样式如下:BEGIN_MESSAGE_MAP(CMCIPlayerDlg, CDialog)/AFX_MSG_MAP(CMCIPlayerDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_OPEN_BUTTON, OnOpenButton)ON_BN_CLICKED(IDC_START_BUTTON, OnStartButton)ON_BN_

25、CLICKED(IDC_PAUSE_BUTTON, OnPauseButton)ON_BN_CLICKED(IDC_STOP_BUTTON, OnStopButton)ON_BN_CLICKED(IDC_CLOSE_BUTTON, OnCloseButton)/AFX_MSG_MAPON_MESSAGE(MM_MCINOTIFY,MciNotify)END_MESSAGE_MAP() 24 将函数将函数MciNotify加入应用程序中加入应用程序中:LRESULT CMCIPlayerDlg:MciNotify(WPARAM wParam,LPARAM lParam) if (wParam=M

26、CI_NOTIFY_SUCCESSFUL)/成功播放完成后重置标识成功播放完成后重置标识 m_PSign=FALSE;/设置正在播放标识为设置正在播放标识为FALSE m_ASign=FALSE;/设置正在暂停标识为设置正在暂停标识为FALSE return 0; return -1;/否则返回错误否则返回错误2512.2 12.2 利用利用Windows Media PlayerWindows Media Player控件实控件实现多媒体程序设计现多媒体程序设计 【例例12-312-3】编编写应用程序,写应用程序,使得用户可使得用户可以分别选择以分别选择一个视频文一个视频文件和一个音件和一个

27、音频文件来同频文件来同时播放或者时播放或者分别播放分别播放 26为为CPlayMediaView类添加四个成员,两个用来播放多类添加四个成员,两个用来播放多媒体文件,两个用来保存待播放的文件名,修改后的媒体文件,两个用来保存待播放的文件名,修改后的CPlayMediaView.h文件如下:文件如下:class CWMPPlayer4; / 前示声明前示声明class CPlayMediaView : public CView protected: / create from serialization only CPlayMediaView(); DECLARE_DYNCREATE(CPlay

28、MediaView) / Attributespublic:CPlayMediaDoc* GetDocument();CWMPPlayer4* m_Video;/ 用来播放视频用来播放视频CWMPPlayer4* m_Music;/ 用来播放音频用来播放音频CStringm_strVideo; / 视频文件名视频文件名CStringm_strMusic; / 音频文件名音频文件名/ Operations; 27初始化和释放指针,修改初始化和释放指针,修改PlayMedia.cpp文件:文件:#include wmpplayer4.h#include wmpcontrols.h#include

29、wmpsettings.h CPlayMediaView:CPlayMediaView()/ TODO: add construction code herem_Video = new CWMPPlayer4;m_Music = new CWMPPlayer4; CPlayMediaView:CPlayMediaView() delete m_Video;delete m_Music; 28 对于对于m_Video和和m_Music两个变量,两个变量,由于对应的是由于对应的是ActiveX控件,因此控件,因此不不但需要但需要new来初始化指针来初始化指针,还需要使,还需要使用它的用它的Crea

30、te函数来创建初始化函数来创建初始化ActiveX控件。控件。 由于两个控件是作为由于两个控件是作为View的子窗的子窗口运行的,通常它们的创建是在口运行的,通常它们的创建是在View的的OnCreate函数中完成,因此需函数中完成,因此需要响应要响应View的的WM_CREATE消息,并消息,并在其中创建两个控件:在其中创建两个控件:29int CPlayMediaView:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CView:OnCreate(lpCreateStruct) = -1)return -1;/ TODO: Add your spe

31、cialized creation code hereHCURSOR hCursor=:LoadCursor(NULL, IDC_ARROW);/ 获得标准箭头鼠标指针获得标准箭头鼠标指针m_Video-Create(AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_PARENTDC, hCursor, 0, 0), NULL, WS_VISIBLE|WS_CHILD, CRect(0,0,0,0), this, 0); / 创建视频窗口创建视频窗口/ 由于使用单独的音频来播放,将视频设置为静音模式由于使用单独的音频来播

32、放,将视频设置为静音模式m_Video-GetSettings().SetMute(TRUE);m_Music-Create(AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_PARENTDC, hCursor, 0, 0), NULL, WS_VISIBLE|WS_CHILD, CRect(0,0,0,0), this, 0); / 创建音频窗口创建音频窗口m_Music-ShowWindow(SW_HIDE); / 将音频窗口设置为不可见将音频窗口设置为不可见return 0; 30们添加们添加“操作操作”及相关菜单

33、及相关菜单项项 ID_OPER_OPENVID_OPER_PLAYVID_OPER_STOPVID_OPER_OPENAID_OPER_PLAYAID_OPER_STOPA31void CPlayMediaView:OnOperOpenv() static char BASED_CODE szFilter = Video Files (*.avi;*.mpg;*.mpeg)|*.avi;*.mpg;*.mpeg|;/ 只允许打开视频文件只允许打开视频文件CFileDialog fileDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, szFilter); if(f

34、ileDlg.DoModal() = IDOK) m_strVideo = fileDlg.GetPathName();/ 获得视频文件名获得视频文件名 void CPlayMediaView:OnOperPlayv() m_Video-GetControls().stop(); / 首先停止正在播放的首先停止正在播放的 m_Video-GetSettings().SetAutoStart(TRUE); / 准备播放准备播放 m_Video-SetUrl(m_strVideo);/ 载入视频文件自动播放载入视频文件自动播放32void CPlayMediaView:OnOperStopv()

35、m_Video-GetControls().stop(); / 停止播放停止播放 void CPlayMediaView:OnOperOpena() / 只允许打开音频文件只允许打开音频文件 static char BASED_CODE szFilter = Audio Files (*.wav;*.mp3)|*.wav;*.mp3|;CFileDialog fileDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, szFilter); if(fileDlg.DoModal() = IDOK) m_strMusic = fileDlg.GetPathName();

36、/ 获得音频文件名获得音频文件名33void CPlayMediaView:OnOperPlaya() m_Music-GetControls().stop(); / 首先停止正在播放的首先停止正在播放的 m_Music-GetSettings().SetAutoStart(TRUE); / 准备播放准备播放 m_Music-SetUrl(m_strMusic); / 载入视频文件自动播放载入视频文件自动播放 void CPlayMediaView:OnOperStopa() m_Music-GetControls().stop(); / 停止播放停止播放 34 有了以上代码,程序还不能够正常

37、运行,需要为播有了以上代码,程序还不能够正常运行,需要为播放视频的控件设置窗口尺寸。为此需要响应放视频的控件设置窗口尺寸。为此需要响应View的的WM_SIZE消息,该消息响应函数如下:消息,该消息响应函数如下:void CPlayMediaView:OnSize(UINT nType, int cx, int cy) CView:OnSize(nType, cx, cy);/ TODO: Add your message handler code here CRect rect; GetClientRect(rect); m_Video-MoveWindow(rect); 在播放视频时,该控

38、件会自动显示出在播放视频时,该控件会自动显示出MediaPlayer的的控制面板,可以通过在控制面板,可以通过在OnCreate函数中,在函数中,在m_Video创创建之后调用建之后调用SetMode函数来隐藏该控件的控制面板。函数来隐藏该控件的控制面板。 m_Video-SetUiMode(none);3512.312.3常见格式图片的显示常见格式图片的显示 Windows程序中经常要显示各种图片,对于程序中经常要显示各种图片,对于普通的普通的BMP、DIB等位图格式文件,等位图格式文件,GDI的的LoadImage,LoadBitmap函数已经提供了支函数已经提供了支持,但是对于网页中常见

39、的持,但是对于网页中常见的PNP、JPG、GIF以及矢量格式的以及矢量格式的WMF图片,图片,Visual C+自带自带了一个实现这个功能的函数了一个实现这个功能的函数OleLoadPicture。但是由于。但是由于MSDN中只提到中只提到该函数支持该函数支持BMP、ICO、WMF格式,因此该格式,因此该函数经常被大家忽视,这里将介绍如何使用该函数经常被大家忽视,这里将介绍如何使用该函数来显示各种格式的图片。函数来显示各种格式的图片。 36【例例12-4】使用使用AppWizard创建创建MFC SDI应用程序,用来应用程序,用来装载并显示图片。装载并显示图片。创建创建ImageViewer工

40、程文件。为显示图片,为工程文件。为显示图片,为CImageViewerView添加成员添加成员m_pPicture以装载图形,并以装载图形,并定义载入图片的函数的声明:定义载入图片的函数的声明: LPPICTURE m_pPicture;private:void LoadPicture(CString strFile); 接下来为接下来为m_pPicture成员添加初始化和释放的代码:成员添加初始化和释放的代码: CImageViewerView:CImageViewerView()m_pPicture = NULL;CImageViewerView:CImageViewerView() if

41、 (m_pPicture)m_pPicture-Release();37为实现打开文件,我们添加为实现打开文件,我们添加“操作操作&O”菜单,增加菜菜单,增加菜单项单项“载入图片载入图片”,其,其ID为为ID_OPER_OPEN,然后映射,然后映射消息响应函数:消息响应函数:void CImageViewerView:OnOperOpen() TCHAR szFileMAX_PATH;/ 保存文件名的缓冲保存文件名的缓冲 ZeroMemory(szFile, MAX_PATH);/ 初始化该缓冲初始化该缓冲 OPENFILENAME ofn;/ 打开文件的关键结构打开文件的关键结构 Z

42、eroMemory(&ofn, sizeof(OPENFILENAME); / 初始化该结构初始化该结构 ofn.lStructSize= sizeof(OPENFILENAME);/ 设置该结构的大小设置该结构的大小 / 设置属性:文件必须存在、路径必须存在、隐藏只读文件设置属性:文件必须存在、路径必须存在、隐藏只读文件 ofn.Flags= OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY; ofn.hwndOwner= m_hWnd;/ 设置该文件框的父窗口设置该文件框的父窗口38ofn.lpstrFilter= _

43、T(Supported Files Types(*.bmp;*.gif;*.jpg;*.ico;*.emf;*.wmf)0*.bmp;*.gif;*.jpg;*.ico;*.emf;*.wmf0Bitmaps (*.bmp)0*.bmp0GIF Files (*.gif)0*.gif0JPEG Files (*.jpg)0*.jpg0Icons (*.ico)0*.ico0Enhanced Metafiles (*.emf)0*.emf0Windows Metafiles (*.wmf)0*.wmf00);/ 设置支持的文件扩展名设置支持的文件扩展名 ofn.lpstrTitle= _T(选择

44、图片选择图片);/ 对话框标题对话框标题ofn.lpstrFile = szFile;/ 设置返回文件名的缓冲设置返回文件名的缓冲ofn.nMaxFile= MAX_PATH;/ 设置缓冲的长度设置缓冲的长度if (IDOK = GetOpenFileName(&ofn)/ 调用对话框调用对话框LoadPicture(szFile);/ 载入该文件载入该文件 39下面实现关键函数下面实现关键函数LoadPicture:void CImageViewerView:LoadPicture(CString strFile) HANDLE hFile=CreateFile(strFile,GE

45、NERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); /打开文件打开文件_ASSERTE(INVALID_HANDLE_VALUE != hFile);DWORD dwFileSize = GetFileSize(hFile, NULL); / 获得文件大小获得文件大小_ASSERTE(-1 != dwFileSize);LPVOID pvData = NULL;HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize); / 分配全局内存,获得内存句柄分配全局内存,获得内存句柄_ASSERTE(NULL !=

46、hGlobal);pvData = GlobalLock(hGlobal); /锁定内存,获得内存指针锁定内存,获得内存指针_ASSERTE(NULL != pvData);40DWORD dwBytesRead = 0;BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL); / 读取文件读取文件_ASSERTE(FALSE != bRead);GlobalUnlock(hGlobal);CloseHandle(hFile);LPSTREAM pstm = NULL;HRESULT hr = Creat

47、eStreamOnHGlobal(hGlobal, TRUE, &pstm); /从内存数据创建从内存数据创建IStream*_ASSERTE(SUCCEEDED(hr) & pstm);41if (m_pPicture) / 创建创建IPicturem_pPicture-Release();/ 从从IStream接口中载入图片到接口中载入图片到IPicture中中hr = :OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID *)&m_pPicture);_ASSERTE(SUCCEEDED(hr

48、) & m_pPicture);pstm-Release(); / 释放释放IStream接口接口Invalidate(); / 强制重新绘制窗口强制重新绘制窗口 通过以上调用,我们通过以上调用,我们的程序已经将位图文的程序已经将位图文件成功载入到件成功载入到m_pPicture变量中了变量中了 42 下面就是显示的步骤,与一般的绘图程序下面就是显示的步骤,与一般的绘图程序类似,显示代码也是在类似,显示代码也是在OnDraw中完成。中完成。#define HIMETRIC_INCH2540void CImageViewerView:OnDraw(CDC* pDC) CImageView

49、erDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here if(m_pPicture)long hmWidth; long hmHeight; m_pPicture-get_Width(&hmWidth); m_pPicture-get_Height(&hmHeight);43/ convert himetric to pixels int nWidth= MulDiv(hmWidth, GetDeviceCaps(pDC-GetSafeHdc(), LOGPIXELSX), HIMETRIC_INCH); int nHeight= MulDiv(hmHeight, GetDeviceCaps(pDC-GetSafeHdc(),LOGPIXE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论