10多媒體應用程序設計_第1頁
10多媒體應用程序設計_第2頁
10多媒體應用程序設計_第3頁
10多媒體應用程序設計_第4頁
10多媒體應用程序設計_第5頁
已閱讀5頁,還剩42頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1Windows教材: Visual C+參考書: 1. C+程序設計教程, 2Visual C+程序設計基礎與實例分析,朱晴婷編著2第第10講講 多媒體應用程序的設計多媒體應用程序的設計 312.1 利用音頻函數(shù)利用音頻函數(shù) 為了介紹多媒體程序的設計,我們?yōu)榱私榻B多媒體程序的設計,我們先介紹一個非常簡單的例子,希望先介紹一個非常簡單的例子,希望讀者能夠通過這個簡單的例子,了讀者能夠通過這個簡單的例子,了解音頻文件的播放方法解音頻文件的播放方法 412.1.1 一個簡單的應用實例一個簡單的應用實例 【例例12-1】設計一個簡單的音頻播放程序,程設計一個簡單的音頻播放程序,程序啟動時,播放序啟動

2、時,播放windows系動啟動時候的音樂系動啟動時候的音樂1.創(chuàng)建工程文件創(chuàng)建工程文件MCIStart;打開;打開Stdafx.h文件,在文件,在#ifndef _AFX_NO_AFXCMN_SUPPORT語句的上一行頂頭加入語句的上一行頂頭加入語句語句#include 2.將將winmm.lib與應用程序鏈與應用程序鏈接起來接起來3.在在MCIStartDlg.cpp的的OnInitDialog()函數(shù)中的函數(shù)中的return TRUE之前加上代碼:之前加上代碼: sndPlaySound(SystemStart,SND_ASYNC); 512.1.2 幾個常用的音頻函數(shù)幾個常用的音頻函數(shù)

3、MessageBeep()函數(shù)函數(shù): :用來播放系統(tǒng)提示用來播放系統(tǒng)提示音音 sndPlaySound()函數(shù)函數(shù):播放播放wavwav音頻音頻 PlaySound()函數(shù)函數(shù):播放來自資源中的聲播放來自資源中的聲音音PlaySound()sndPlaySound()MessageBeep()功能包功能包含關系含關系612.1.3 用用MCI控制波形聲音的播放控制波形聲音的播放 MCIERROR mciSendCommand(MCIDEVICEID IDDevice, /接收命令消息的接收命令消息的MCI設備設備ID UINT uMsg, /發(fā)送的命令消息發(fā)送的命令消息 DWORD fdwCo

4、mmand, /命令消息的標志集命令消息的標志集 DWORD_PTR dwParam) /消息參數(shù)的結構體地址消息參數(shù)的結構體地址常用的常用的MCI設備消息設備消息 見教材表見教材表12-57在調用在調用MCI設備時可用設備時可用mciGetErrorString()檢檢測錯誤,該函數(shù)的原型如下:測錯誤,該函數(shù)的原型如下: BOOL mciGetErrorString( DWORD fdwError, /錯誤代碼錯誤代碼 LPTSTR lpszErrorText, /指向錯誤內容字串的指針指向錯誤內容字串的指針 UINT cchErrorText /錯誤內容的緩沖區(qū)容量錯誤內容的緩沖區(qū)容量)

5、8【例例12-212-2】編寫一個音頻播放器程序,可以選編寫一個音頻播放器程序,可以選擇音頻文件,并控制其播放、暫停播放、暫擇音頻文件,并控制其播放、暫停播放、暫停后的繼續(xù)播放以及停止播放的功能停后的繼續(xù)播放以及停止播放的功能 IDC_OPEN_BUTTON IDC_CLOSE_BUTTON IDC_START_BUTTON IDC_PAUSE_BUTTON IDC_STOP_BUTTON IDC_EXIT_BUTTON 91. 將頭文件將頭文件mmsystem.h加入到文件加入到文件Stdafx.h中,中,將多媒體函數(shù)庫將多媒體函數(shù)庫winmm.lib通過通過project菜單中的菜單中的s

6、eetings命令來與程序鏈接起來命令來與程序鏈接起來 2.在在CMCIPlayerDlg類上增加類上增加Protected類型的成員變量,類型的成員變量,具體如下:具體如下: BOOL m_PSign(作為判斷正在播放的標識)(作為判斷正在播放的標識) BOOL m_ASign(作為判斷正在播放的標識)、(作為判斷正在播放的標識)、DWORD dwError(用來儲存錯誤代碼)、(用來儲存錯誤代碼)、MCIDEVICEID m_MCIDeviceID(用來儲存打開設備的用來儲存打開設備的ID值值) charszErrorBufMAXERRORLENGTH(用來儲存出錯內容)用來儲存出錯內容)

7、 10BOOL CMCIPlayerDlg:OnInitDialog()CDialog:OnInitDialog();/ TODO: Add extra initialization herem_PSign=FALSE;/初始化正在播放標識初始化正在播放標識m_ASign=FALSE; /初始化正在暫停標識初始化正在暫停標識m_MCIDeviceID=0; /初始化設備標識初始化設備標識return TRUE;11void CMCIPlayerDlg:OnOpenButton() /打開一個文件打開一個文件CString ;/定義定義CString類的用來存儲文件名類的用來存儲文件名CStri

8、ng ;/定義定義CString類的用來存儲文件擴展名類的用來存儲文件擴展名MCI_OPEN_PARMS mciOpenParms;/定義結構體變量用來存儲打定義結構體變量用來存儲打開文件的信息和返回的設備標識信息開文件的信息和返回的設備標識信息DWORD dwError;/定義定義dwError用來儲存返回的錯誤標識用來儲存返回的錯誤標識static char szFilter=波形音頻文件波形音頻文件(*.wav)|*.wav|MIDI序列序列(*.mid)|*.mid0;C dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,s

9、zFilter);/通過打開按鈕時顯示的內容通過打開按鈕時顯示的內容12if (dlg.DoModal()=IDOK) ();/獲取打開的文件名獲取打開的文件名 ();/獲取打開的文件擴展名獲取打開的文件擴展名 if (m_PSign) /如果程序正在播放,則關閉如果程序正在播放,則關閉 dwError=mciSendCommand(m_MCIDeviceID,MCI_CLOSE,0,NULL);/關閉正在播放的聲音關閉正在播放的聲音if (dwError) /如果關閉不成功,則顯示出錯的原因如果關閉不成功,則顯示出錯的原因 if(mciGetErrorString(dwError,(LPST

10、R)szErrorBuf,MAXERRORLENGTH)MessageBox(szErrorBuf,MCI出錯出錯,MB_ICONWARNING); elseMessageBox(不明錯誤標識不明錯誤標識,MCI出錯出錯,MB_ICONWARNING);/給出相應報告給出相應報告return; 13/如果沒有聲音正在播放,則獲取打開文件的后輟,并如果沒有聲音正在播放,則獲取打開文件的后輟,并根據(jù)后輟決定相應的打開類型根據(jù)后輟決定相應的打開類型if (!strcmp(wav,)/當后輟為當后輟為wav時時mciOpenParms.lpstrDeviceType=waveaudio;else if

11、 (!strcmp(mid,)/當后輟為當后輟為mid時時mciOpenParms.lpstrDeviceType=sequencer;mciOpenParms.lpstrElementName=;/將打開的文件名存入將打開的文件名存入mciOpenParms結構體中結構體中dwError=mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpenParms);/發(fā)送打開文件命令,發(fā)送打開文件命令,MCI_OPEN_TYPE參數(shù)說明設備類參數(shù)說明設備類型名包含在型名包含在mciOpen

12、Parms結構體中,結構體中,/MCI_OPEN_ELEMENT參數(shù)說明要打開的文件名包含在參數(shù)說明要打開的文件名包含在mciOpenParams結構體中結構體中14if (dwError)/如果打開不成功,則顯示出錯的原因如果打開不成功,則顯示出錯的原因if (mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)MessageBox(szErrorBuf,MCI出錯出錯,MB_ICONWARNING);else MessageBox(不明錯誤標識不明錯誤標識,MCI出錯出錯,MB_ICONWARNING);return;m_M

13、CIDeviceID=mciOpenParms.wDeviceID;/將獲取的設備將獲取的設備ID值賦給全局變量值賦給全局變量m_MCIDeviceIDm_PSign=FALSE;/設置正在播放標識為設置正在播放標識為FALSEm_ASign=FALSE;/設置正在暫停標識為設置正在暫停標識為FALSE 15void CMCIPlayerDlg:OnStartButton() /從頭開始播放從頭開始播放 MCI_PLAY_PARMS mciPlayParms;/結構體變量存儲播放相關信息結構體變量存儲播放相關信息 if (!m_PSign)/如果沒有正在播放的聲音如果沒有正在播放的聲音 mci

14、PlayParms.dwCallback=(long)GetSafeHwnd();/為發(fā)送為發(fā)送MM_MCINOTIFY消息指定窗口句柄消息指定窗口句柄 mciPlayParms.dwFrom=0;/設置播放位置從頭開始設置播放位置從頭開始dwError=mciSendCommand(m_MCIDeviceID,MCI_PLAY,MCI_FROM|MCI_NOTIFY,(DWORD)(LPVOID)&mciPlayParms); /開始播放聲音,參數(shù)開始播放聲音,參數(shù)MCI_FROM說明開始播放的位置說明開始播放的位置包含在包含在mciPlayParms結構體中結構體中 /參數(shù)參數(shù)MC

15、I_NOTIFY的意義是播放完后發(fā)送的意義是播放完后發(fā)送MM_MCINOTIFY消息消息 16if (dwError) if (mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH) MessageBox(szErrorBuf,MCI出錯出錯,MB_ICONWARNING); else MessageBox(不明錯誤標識不明錯誤標識,MCI出錯出錯,MB_ICONWARNING); return; m_PSign=TRUE;/設置正在播放標識為設置正在播放標識為TRUE 17void CMCIPlayerDlg:OnPauseBu

16、tton() if (m_PSign)/如果有正在播放的聲音如果有正在播放的聲音if (!m_ASign)/如果不是暫停狀態(tài)如果不是暫停狀態(tài)dwError=mciSendCommand(m_MCIDeviceID,MCI_PAUSE,0,NULL);/則暫停播放則暫停播放if (dwError)if (mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH) MessageBox(szErrorBuf,MCI出錯出錯,MB_ICONWARNING); else MessageBox(不明錯誤標識不明錯誤標識,MCI出錯出錯,MB_I

17、CONWARNING);return;m_ASign=TRUE;/設置正在暫停標識為設置正在暫停標識為TRUE 18else/如果已經(jīng)是暫停狀態(tài)如果已經(jīng)是暫停狀態(tài)dwError=mciSendCommand(m_MCIDeviceID,MCI_RESUME,0,NULL);/則繼續(xù)播放則繼續(xù)播放 if (dwError) if (mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)MessageBox(szErrorBuf,MCI出錯出錯,MB_ICONWARNING); else MessageBox(不明錯誤標識不明錯誤標識

18、,MCI出錯出錯,MB_ICONWARNING);return; m_ASign=FALSE;/設置正在暫停標識為設置正在暫停標識為FALSE 19void CMCIPlayerDlg:OnStopButton() dwError=mciSendCommand(m_MCIDeviceID,MCI_STOP,MCI_WAIT,NULL);/發(fā)送停止命令消息,參數(shù)發(fā)送停止命令消息,參數(shù)MCI_WAIT說明當命令執(zhí)行結說明當命令執(zhí)行結束后函數(shù)才返回值束后函數(shù)才返回值if (dwError)if (mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERROR

19、LENGTH)MessageBox(szErrorBuf,MCI出錯出錯,MB_ICONWARNING); else MessageBox(不明錯誤標識不明錯誤標識,MCI出錯出錯,MB_ICONWARNING);return;m_PSign=FALSE;/設置正在播放標識為設置正在播放標識為FALSEm_ASign=FALSE;/設置正在暫停標識為設置正在暫停標識為FALSEMessageBox(如要播放新的文件,請在打開前先關閉如要播放新的文件,請在打開前先關閉現(xiàn)有文件現(xiàn)有文件,注意注意,MB_ICONQUESTION);/提請用戶注意先關閉現(xiàn)有文件提請用戶注意先關閉現(xiàn)有文件20void

20、CMCIPlayerDlg:OnCloseButton() /關閉當前設備關閉當前設備if (m_MCIDeviceID) /若什么文件都沒有打開過,就不執(zhí)行關閉操作若什么文件都沒有打開過,就不執(zhí)行關閉操作 dwError=mciSendCommand(m_MCIDeviceID,MCI_STOP,MCI_WAIT,NULL); if (dwError) if (mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)MessageBox(szErrorBuf,MCI出錯出錯,MB_ICONWARNING); else Messag

21、eBox(不明錯誤標識不明錯誤標識,MCI出錯出錯,MB_ICONWARNING);return; dwError=mciSendCommand(m_MCIDeviceID,MCI_CLOSE,0,NULL);if (dwError) if (mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)MessageBox(szErrorBuf,MCI出錯出錯,MB_ICONWARNING); else MessageBox(不明錯誤標識不明錯誤標識,MCI出錯出錯,MB_ICONWARNING);return; m_MCIDevice

22、ID=0;/關閉文件后將變量設為關閉文件后將變量設為 0 21void CMCIPlayerDlg:OnExitButton()void CMCIPlayerDlg:OnExitButton()/點擊確定的響應點擊確定的響應 OnCloseButton();OnCloseButton();/先執(zhí)行關閉文件的操作先執(zhí)行關閉文件的操作CDialog:OnOK();CDialog:OnOK();/關閉窗口關閉窗口 22手動加入手動加入MM_MCINOTIFY消息的處理函數(shù)消息的處理函數(shù)在在MCIPlayerDlg.h中的函數(shù)中的函數(shù)class CMCIPlayerDlg : public CDial

23、og()的()的“/AFX_MSG”和和“DECLARE_MESSAGE_MAP()”語句之間加入如下代碼:語句之間加入如下代碼: afx_msg LRESULT MciNotify(WPARAM wParam,LPARAM lParam);23在在MCIPlayerDlg.cpp中的消息映射入口處加入如下代碼:中的消息映射入口處加入如下代碼: ON_MESSAGE(MM_MCINOTIFY,MciNotify)。樣式如下:樣式如下:BEGIN_MESSAGE_MAP(CMCIPlayerDlg, CDialog)/AFX_MSG_MAP(CMCIPlayerDlg)ON_WM_SYSCOMM

24、AND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_OPEN_BUTTON, OnOpenButton)ON_BN_CLICKED(IDC_START_BUTTON, OnStartButton)ON_BN_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

25、,MciNotify)END_MESSAGE_MAP() 24 將函數(shù)將函數(shù)MciNotify加入應用程序中加入應用程序中:LRESULT CMCIPlayerDlg:MciNotify(WPARAM wParam,LPARAM lParam) if (wParam=MCI_NOTIFY_SUCCESSFUL)/成功播放完成后重置標識成功播放完成后重置標識 m_PSign=FALSE;/設置正在播放標識為設置正在播放標識為FALSE m_ASign=FALSE;/設置正在暫停標識為設置正在暫停標識為FALSE return 0; return -1;/否則返回錯誤否則返回錯誤2512.2 12

26、.2 利用利用Windows Media PlayerWindows Media Player控件實控件實現(xiàn)多媒體程序設計現(xiàn)多媒體程序設計 【例例12-312-3】編編寫應用程序,寫應用程序,使得用戶可使得用戶可以分別選擇以分別選擇一個視頻文一個視頻文件和一個音件和一個音頻文件來同頻文件來同時播放或者時播放或者分別播放分別播放 26為為CPlayMediaView類添加四個成員,兩個用來播放多類添加四個成員,兩個用來播放多媒體文件,兩個用來保存待播放的文件名,修改后的媒體文件,兩個用來保存待播放的文件名,修改后的CPlayMediaView.h文件如下:文件如下:class CWMPPlaye

27、r4; / 前示聲明前示聲明class CPlayMediaView : public CView protected: / create from serialization only CPlayMediaView(); DECLARE_DYNCREATE(CPlayMediaView) / Attributespublic:CPlayMediaDoc* GetDocument();CWMPPlayer4* m_Video;/ 用來播放視頻用來播放視頻CWMPPlayer4* m_Music;/ 用來播放音頻用來播放音頻CStringm_strVideo; / 視頻文件名視頻文件名CStri

28、ngm_strMusic; / 音頻文件名音頻文件名/ Operations; 27初始化和釋放指針,修改初始化和釋放指針,修改PlayMedia.cpp文件:文件:#include wmpplayer4.h#include wmpcontrols.h#include wmpsettings.h CPlayMediaView:CPlayMediaView()/ TODO: add construction code herem_Video = new CWMPPlayer4;m_Music = new CWMPPlayer4; CPlayMediaView:CPlayMediaView() d

29、elete m_Video;delete m_Music; 28 對于對于m_Video和和m_Music兩個變量,兩個變量,由于對應的是由于對應的是ActiveX控件,因此控件,因此不不但需要但需要new來初始化指針來初始化指針,還需要使,還需要使用它的用它的Create函數(shù)來創(chuàng)建初始化函數(shù)來創(chuàng)建初始化ActiveX控件??丶?由于兩個控件是作為由于兩個控件是作為View的子窗的子窗口運行的,通常它們的創(chuàng)建是在口運行的,通常它們的創(chuàng)建是在View的的OnCreate函數(shù)中完成,因此需函數(shù)中完成,因此需要響應要響應View的的WM_CREATE消息,并消息,并在其中創(chuàng)建兩個控件:在其中創(chuàng)建兩

30、個控件:29int CPlayMediaView:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CView:OnCreate(lpCreateStruct) = -1)return -1;/ TODO: Add your specialized creation code hereHCURSOR hCursor=:LoadCursor(NULL, IDC_ARROW);/ 獲得標準箭頭鼠標指針獲得標準箭頭鼠標指針m_Video-Create(AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS

31、 | CS_PARENTDC, hCursor, 0, 0), NULL, WS_VISIBLE|WS_CHILD, CRect(0,0,0,0), this, 0); / 創(chuàng)建視頻窗口創(chuàng)建視頻窗口/ 由于使用單獨的音頻來播放,將視頻設置為靜音模式由于使用單獨的音頻來播放,將視頻設置為靜音模式m_Video-GetSettings().SetMute(TRUE);m_Music-Create(AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_PARENTDC, hCursor, 0, 0), NULL, WS_VISIB

32、LE|WS_CHILD, CRect(0,0,0,0), this, 0); / 創(chuàng)建音頻窗口創(chuàng)建音頻窗口m_Music-ShowWindow(SW_HIDE); / 將音頻窗口設置為不可見將音頻窗口設置為不可見return 0; 30們添加們添加“操作操作”及相關菜單及相關菜單項項 ID_OPER_OPENVID_OPER_PLAYVID_OPER_STOPVID_OPER_OPENAID_OPER_PLAYAID_OPER_STOPA31void CPlayMediaView:OnOperOpenv() static char BASED_CODE szFilter = Video Fil

33、es (*.avi;*.mpg;*.mpeg)|*.avi;*.mpg;*.mpeg|;/ 只允許打開視頻文件只允許打開視頻文件C (TRUE, NULL, NULL, OFN_HIDEREADONLY, szFilter); if() = IDOK) m_strVideo = ();/ 獲得視頻文件名獲得視頻文件名 void CPlayMediaView:OnOperPlayv() m_Video-GetControls().stop(); / 首先停止正在播放的首先停止正在播放的 m_Video-GetSettings().SetAutoStart(TRUE); / 準備播放準備播放 m_

34、Video-SetUrl(m_strVideo);/ 載入視頻文件自動播放載入視頻文件自動播放32void CPlayMediaView:OnOperStopv() m_Video-GetControls().stop(); / 停止播放停止播放 void CPlayMediaView:OnOperOpena() / 只允許打開音頻文件只允許打開音頻文件 static char BASED_CODE szFilter = Audio Files (*.wav;*.mp3)|*.wav;*.mp3|;C(TRUE, NULL, NULL, OFN_HIDEREADONLY, szFilter);

35、 if() = IDOK) m_strMusic = ();/ 獲得音頻文件名獲得音頻文件名33void CPlayMediaView:OnOperPlaya() m_Music-GetControls().stop(); / 首先停止正在播放的首先停止正在播放的 m_Music-GetSettings().SetAutoStart(TRUE); / 準備播放準備播放 m_Music-SetUrl(m_strMusic); / 載入視頻文件自動播放載入視頻文件自動播放 void CPlayMediaView:OnOperStopa() m_Music-GetControls().stop();

36、 / 停止播放停止播放 34 有了以上代碼,程序還不能夠正常運行,需要為播有了以上代碼,程序還不能夠正常運行,需要為播放視頻的控件設置窗口尺寸。為此需要響應放視頻的控件設置窗口尺寸。為此需要響應View的的WM_SIZE消息,該消息響應函數(shù)如下:消息,該消息響應函數(shù)如下: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_Vid

37、eo-MoveWindow(rect); 在播放視頻時,該控件會自動顯示出在播放視頻時,該控件會自動顯示出MediaPlayer的的控制面板,可以通過在控制面板,可以通過在OnCreate函數(shù)中,在函數(shù)中,在m_Video創(chuàng)創(chuàng)建之后調用建之后調用SetMode函數(shù)來隱藏該控件的控制面板。函數(shù)來隱藏該控件的控制面板。 m_Video-SetUiMode(none);3512.312.3常見格式圖片的顯示常見格式圖片的顯示 Windows程序中經(jīng)常要顯示各種圖片,對于程序中經(jīng)常要顯示各種圖片,對于普通的普通的BMP、DIB等位圖格式文件,等位圖格式文件,GDI的的LoadImage,LoadBit

38、map函數(shù)已經(jīng)提供了支函數(shù)已經(jīng)提供了支持,但是對于網(wǎng)頁中常見的持,但是對于網(wǎng)頁中常見的PNP、JPG、GIF以及矢量格式的以及矢量格式的WMF圖片,圖片,Visual C+自帶自帶了一個實現(xiàn)這個功能的函數(shù)了一個實現(xiàn)這個功能的函數(shù)OleLoadPicture。但是由于。但是由于MSDN中只提到中只提到該函數(shù)支持該函數(shù)支持BMP、ICO、WMF格式,因此該格式,因此該函數(shù)經(jīng)常被大家忽視,這里將介紹如何使用該函數(shù)經(jīng)常被大家忽視,這里將介紹如何使用該函數(shù)來顯示各種格式的圖片。函數(shù)來顯示各種格式的圖片。 36【例例12-4】使用使用AppWizard創(chuàng)建創(chuàng)建MFC SDI應用程序,用來應用程序,用來裝載

39、并顯示圖片。裝載并顯示圖片。創(chuàng)建創(chuàng)建ImageViewer工程文件。為顯示圖片,為工程文件。為顯示圖片,為CImageViewerView添加成員添加成員m_pPicture以裝載圖形,并以裝載圖形,并定義載入圖片的函數(shù)的聲明:定義載入圖片的函數(shù)的聲明: LPPICTURE m_pPicture;private:void LoadPicture(CString strFile); 接下來為接下來為m_pPicture成員添加初始化和釋放的代碼:成員添加初始化和釋放的代碼: CImageViewerView:CImageViewerView()m_pPicture = NULL;CImageVi

40、ewerView:CImageViewerView() if (m_pPicture)m_pPicture-Release();37為實現(xiàn)打開文件,我們添加為實現(xiàn)打開文件,我們添加“操作操作&O”菜單,增加菜單菜單,增加菜單項項“載入圖片載入圖片”,其,其ID為為ID_OPER_OPEN,然后映射消,然后映射消息響應函數(shù):息響應函數(shù):void CImageViewerView:OnOperOpen() TCHAR sz;/ 保存文件名的緩沖保存文件名的緩沖 ZeroMemory(szFile, MAX_PATH);/ 初始化該緩沖初始化該緩沖 OPEN ofn;/ 打開文件的關鍵結構打

41、開文件的關鍵結構 ZeroMemory(&ofn, sizeof(OPEN); / 初始化該結構初始化該結構 ofn.lStructSize= sizeof(OPEN);/ 設置該結構的大小設置該結構的大小 / 設置屬性:文件必須存在、路徑必須存在、隱藏只讀文件設置屬性:文件必須存在、路徑必須存在、隱藏只讀文件 ofn.Flags= OFN_ | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY; ofn.hwndOwner= m_hWnd;/ 設置該文件框的父窗口設置該文件框的父窗口38ofn.lpstrFilter= _T(Supported Files T

42、ypes(*.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(選擇圖片選擇圖片);/ 對話框標題對話框標

43、題ofn.lpstrFile = szFile;/ 設置返回文件名的緩沖設置返回文件名的緩沖ofn.nMaxFile= MAX_PATH;/ 設置緩沖的長度設置緩沖的長度if (IDOK = GetOpen(&ofn)/ 調用對話框調用對話框LoadPicture(szFile);/ 載入該文件載入該文件 39下面實現(xiàn)關鍵函數(shù)下面實現(xiàn)關鍵函數(shù)LoadPicture:void CImageViewerView:LoadPicture(CString strFile) HANDLE h(str); /打開文件打開文件_ASSERTE(INVALID_HANDLE_VALUE != hFil

44、e);DWORD dw = Get(hFile, NULL); / 獲得文件大小獲得文件大小_ASSERTE(-1 != dw);LPVOID pvData = NULL;HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dw); / 分配全局內存,獲得內存句柄分配全局內存,獲得內存句柄_ASSERTE(NULL != hGlobal);pvData = GlobalLock(hGlobal); /鎖定內存,獲得內存指針鎖定內存,獲得內存指針_ASSERTE(NULL != pvData);40DWORD dwBytesRead = 0;BOOL bRe

45、ad = Read, pvData, dw, &dwBytesRead, NULL); / 讀取文件讀取文件_ASSERTE(FALSE != bRead);GlobalUnlock(hGlobal);CloseHandle(hFile);LPSTREAM pstm = NULL;HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm); /從內存數(shù)據(jù)創(chuàng)建從內存數(shù)據(jù)創(chuàng)建IStream*_ASSERTE(SUCCEEDED(hr) & pstm);41if (m_pPicture) / 創(chuàng)建創(chuàng)建IPicturem_p

46、Picture-Release();/ 從從IStream接口中載入圖片到接口中載入圖片到IPicture中中hr = :OleLoadPicture(pstm, dw, FALSE, IID_IPicture, (LPVOID *)&m_pPicture);_ASSERTE(SUCCEEDED(hr) & m_pPicture);pstm-Release(); / 釋放釋放IStream接口接口Invalidate(); / 強制重新繪制窗口強制重新繪制窗口 通過以上調用,我們通過以上調用,我們的程序已經(jīng)將位圖文的程序已經(jīng)將位圖文件成功載入到件成功載入到m_pPicture變

47、量中了變量中了 42 下面就是顯示的步驟,與一般的繪圖程序下面就是顯示的步驟,與一般的繪圖程序類似,顯示代碼也是在類似,顯示代碼也是在OnDraw中完成。中完成。#define HIMETRIC_INCH2540void CImageViewerView:OnDraw(CDC* pDC) CImageViewerDoc* 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(),LOGPIXELSY), HIMETRIC_INCH); CRect rc; GetClientRec

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論