版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1第8章多媒體應(yīng)用程序的設(shè)計(jì)
多媒體的概念大家應(yīng)該比較熟悉,但電腦上的視聽(tīng)播放軟件都是現(xiàn)成的應(yīng)用軟件,這些軟件是如何設(shè)計(jì)的呢?如何設(shè)計(jì)定制功能的多媒體軟件呢?
由于時(shí)下的主流PC的多媒體性能已經(jīng)大大提升,程序中經(jīng)常要播放一段視頻或者一段音頻,對(duì)于專(zhuān)業(yè)的需要控制音頻或者視頻到幀這個(gè)單位的程序可以選擇DirectX或者傳統(tǒng)的Windows多媒體API。
對(duì)于簡(jiǎn)單的播放則只需要添加幾行代碼即可完成此任務(wù)。238.1利用音頻函數(shù)實(shí)現(xiàn)多媒體程序設(shè)計(jì)
為了介紹多媒體程序的設(shè)計(jì),我們先介紹一個(gè)非常簡(jiǎn)單的例子,希望讀者能夠通過(guò)這個(gè)簡(jiǎn)單的例子,了解音頻文件的播放方法48.1.1一個(gè)簡(jiǎn)單的應(yīng)用實(shí)例
【例8-1】設(shè)計(jì)一個(gè)簡(jiǎn)單的音頻播放程序,程序啟動(dòng)時(shí),播放c:\\windows\\media\\ring09.wav1.創(chuàng)建8_1;在文件framework.h中加入語(yǔ)句#include<mmsystem.h>2.在圖中將與mmsystem.h文件對(duì)應(yīng)的多媒體函數(shù)庫(kù)winmm.lib與應(yīng)用程序鏈接起來(lái),(操作:“項(xiàng)目”菜單中“8_1屬性”菜單項(xiàng),在打開(kāi)的“8_1屬性頁(yè)”對(duì)話(huà)框中窗口中選擇“配置屬性”->”鏈接器”->“輸入”,在“附加依賴(lài)項(xiàng)”的編輯框中輸入winmm.lib,然后確定3.在11_1Dlg.cpp的OnInitDialog()函數(shù)中的returnTRUE之前加上代碼:sndPlaySound(L"c:\\windows\\media\\ring09.wav",SND_ASYNC);5PlaySound()sndPlaySound()8.1.2幾個(gè)常用的音頻函數(shù)
MessageBeep()函數(shù):用來(lái)播放系統(tǒng)提示音
sndPlaySound()函數(shù):播放wav音頻
PlaySound()函數(shù):播放來(lái)自資源中的聲音MessageBeep()功能包含關(guān)系(1)MessageBeep6該函數(shù)是VisualC++中最簡(jiǎn)單的音頻函數(shù),但其功能也是最少的,該函數(shù)的原型為:BOOLMessageBeep(UINTuType)uType參數(shù)值說(shuō)明0xFFFFFFFF系統(tǒng)默認(rèn)聲音MB_ICONINFORMATIONMB_ICONASTERISK與出現(xiàn)信息消息框時(shí)對(duì)應(yīng)的聲音MB_ICONEXCLAMATIONMB_ICONWARNING與出現(xiàn)警告消息框時(shí)對(duì)應(yīng)的聲音MB_ICONHANDMB_ICONSTOPMB_ICONERROR與出現(xiàn)錯(cuò)誤消息框時(shí)對(duì)應(yīng)的聲音MB_ICONQUESTION與出現(xiàn)詢(xún)問(wèn)消息框時(shí)對(duì)應(yīng)的聲音MB_OK系統(tǒng)默認(rèn)聲音(2)sndPlaySound()函數(shù)7該函數(shù)可通過(guò)指定文件名或指定在注冊(cè)表中注冊(cè)了的條目來(lái)播放wav音頻。該函數(shù)的原型如下:BOOLsndPlaySound(LPCSTRlpszSound,UINT
fuSound)fuSound參數(shù)值說(shuō)明SND_ASYNC采用異步播放的方式播放聲音,在聲音播放后函數(shù)立即返回。如要終止時(shí)通過(guò)再次調(diào)用這個(gè)函數(shù),在第一個(gè)參數(shù)處寫(xiě)入文件名,第二個(gè)參數(shù)處為NULL。本章開(kāi)始時(shí)的例子就是這種播放方式,如要終止則可執(zhí)行語(yǔ)句:sndPlaySound("SystemStart",NULL);SND_LOOP循環(huán)播放聲音,必須與參數(shù)SND_ASYNC同時(shí)使用(SND_ASYNC|SND_LOOP),停止方法與上面同SND_MEMORY說(shuō)明第一個(gè)參數(shù)指定的是wav聲音在內(nèi)存中的映象SND_NODEFAULT當(dāng)無(wú)法正常播放聲音時(shí),不播放系統(tǒng)默認(rèn)聲音SND_NOSTOP如果有聲音正在播放,則函數(shù)立即返回FALSE,終止運(yùn)行。SND_SYNC采用同步播放的方式播放聲音,只有在聲音播放完成后函數(shù)才返回。(3)PlaySound()函數(shù)該函數(shù)的原型如下:BOOLPlaySound(LPCSTRpszSound,HMODULEhmod,DWORDfdwSound);8pszSound為指定播放的聲音,它可以是文件名、注冊(cè)條目或資源標(biāo)識(shí),播放聲音的來(lái)源通過(guò)參數(shù)fdwSound來(lái)決定。如果沒(méi)有指定,則首先在注冊(cè)表中尋找,如果沒(méi)有找到,則認(rèn)為指定的是一個(gè)文件名。如果這個(gè)參數(shù)為NULL,則停止任何當(dāng)前正在播放的wav聲音;而要想停止非wav聲音,必須在第三個(gè)參數(shù)中加入SND_PURGE;hmod為包含被加載資源的文件的句柄。當(dāng)?shù)谌齻€(gè)參數(shù)中沒(méi)有SND_RESOURCE時(shí),這個(gè)參數(shù)必須為NULL;
fdwSound為播放聲音的標(biāo)識(shí),sndPlaySound()函數(shù)中的參數(shù)值在PlaySound()中全部可用。除此以外,PlaySound()函數(shù)還增加有許多參數(shù)值,如下表所示。9fdwSound參數(shù)值說(shuō)明SND_ALIAS播放的聲音來(lái)源為注冊(cè)條目SND_RESOURCE播放的聲音來(lái)源為資源SND_FILENAME播放的聲音來(lái)源為文件名SND_NOWAIT如果設(shè)備正被使用,立即返回不再播放SND_APPLICATION使用應(yīng)用程序指定的音頻SND_PURGE停止聲音播放SND_ALIAS_ID預(yù)先確定的聲音標(biāo)識(shí)108.1.3用MCI控制波形聲音的播放
MCIERRORmciSendCommand( MCIDEVICEIDIDDevice,//接收命令消息的MCI設(shè)備ID UINTuMsg, //發(fā)送的命令消息
DWORDfdwCommand,//命令消息的標(biāo)志集
DWORD_PTRdwParam)//消息參數(shù)的結(jié)構(gòu)體地址常用的MCI設(shè)備消息見(jiàn)教材使用mciSendCommand函數(shù)時(shí)要添加如下兩個(gè)語(yǔ)句:#include<MMSystem.h>#pragmacomment(lib,"WINMM.LIB")//鏈接WINMM.LIB庫(kù)
11在調(diào)用MCI設(shè)備時(shí)可用mciGetErrorString()檢測(cè)錯(cuò)誤,該函數(shù)的原型如下:
BOOLmciGetErrorString(DWORDfdwError,//錯(cuò)誤代碼
LPTSTRlpszErrorText,//指向錯(cuò)誤內(nèi)容字串的指針
UINTcchErrorText//錯(cuò)誤內(nèi)容的緩沖區(qū)容量)12【例8-2】編寫(xiě)一個(gè)用MCI控制音頻播放的程序,實(shí)現(xiàn)選擇音頻文件、控制其播放/暫停、停止的功能。在播放狀態(tài)下,點(diǎn)擊“播放”按鈕實(shí)現(xiàn)暫停/繼續(xù)的功能,按對(duì)象IDCaption其他編輯框IDC_EDIT_FILENAME
ReadOnly按鈕IDC_BUTTON_OPEN打開(kāi)
按鈕IDC_BUTTON_PLAY播放
按鈕IDC_BUTTON_STOP停止
鈕名稱(chēng)也顯示為對(duì)應(yīng)的暫停或繼續(xù);在停止?fàn)顟B(tài)下,點(diǎn)擊“播放”按鈕,重新開(kāi)始播放音樂(lè)。13(1)加入頭文件:在頭文件framework.h中加入多媒體系統(tǒng)的定義:
#include<mmsystem.h>(2)配置“附加依賴(lài)項(xiàng)”選擇“項(xiàng)目”“屬性”“配置屬性””鏈接器”“輸入”“附加依賴(lài)項(xiàng)”輸入winmm.lib。
添加成員變量及消息響應(yīng)函數(shù)14控件ID類(lèi)型成員注釋初始值自定義變量CStringm_fileext打開(kāi)文件的擴(kuò)展名
自定義變量CStringm_filepath打開(kāi)文件的路徑
自定義變量BOOLm_isPlay是否在播放FALSE自定義變量BOOLm_isOpen是否打開(kāi)文件FALSE自定義變量BOOLm_isPause是否為暫停狀態(tài)FALSE自定義變量DWORDdwError存儲(chǔ)錯(cuò)誤代碼
自定義變量MCIDEVICEIDm_MCIDeviceID存儲(chǔ)打開(kāi)設(shè)備的ID值
自定義變量CStringszErrorBuf存儲(chǔ)出錯(cuò)內(nèi)容
IDC_EDIT_FILENAMECstringm_filename編輯框中顯示文件名
變量m_filename,在添加的時(shí)候,是針對(duì)控件添加的,跟添加自定義變量的方法有所不同,是在對(duì)話(huà)框中鼠標(biāo)右擊編輯框控件,然后,進(jìn)行添加操作。15(a)“打開(kāi)”按鈕的消息響應(yīng)voidCMy8_2Dlg::OnBnClickedButtonOpen(){//TODO:在此添加控件通知處理程序代碼
MCI_OPEN_PARMS
mciOpenParms{};//定義結(jié)構(gòu)體變量用來(lái)存儲(chǔ)打開(kāi)文件的信息和返回的設(shè)備標(biāo)識(shí)信息CFileDialogdlg(TRUE,NULL,L"*.*",OFN_FILEMUSTEXIST,L"MP3File(*.mp3)|*.mp3|"L"WAVFile(*.wav)|*.wav|"L"MIDIFile(*.mid)|*.mid|"L"所有文件(*.*)|*.*||");//通過(guò)打開(kāi)按鈕時(shí)顯示的內(nèi)容if(dlg.DoModal()==IDOK){m_filename=dlg.GetFileName();//獲取打開(kāi)的文件名m_fileext=dlg.GetFileExt();//獲取打開(kāi)的文件擴(kuò)展名m_filepath=dlg.GetPathName();//獲取打開(kāi)文件的路徑}UpdateData(FALSE);
if(m_isOpen){//如果文件已經(jīng)打開(kāi),則關(guān)閉dwError=mciSendCommand(m_MCIDeviceID,MCI_CLOSE,0,NULL);//關(guān)閉正在播放的聲音if(dwError){//如果關(guān)閉不成功,則顯示出錯(cuò)的原因if(mciGetErrorString(dwError,szErrorBuf.GetBuffer(),MAXERRORLENGTH))MessageBox(szErrorBuf,_T("MCI出錯(cuò)"),MB_ICONWARNING);else
MessageBox(_T("不明錯(cuò)誤標(biāo)識(shí)"),_T("MCI出錯(cuò)"),MB_ICONWARNING);}}//獲取打開(kāi)文件的后輟,并根據(jù)后輟決定相應(yīng)的打開(kāi)類(lèi)型if(!_tcscmp(_T("mp3"),m_fileext))//當(dāng)后輟為mp3時(shí)mciOpenParms.lpstrDeviceType=_T("mpegvideo");elseif(!_tcscmp(_T("wav"),m_fileext))//當(dāng)為wav時(shí)mciOpenParms.lpstrDeviceType=_T("waveaudio");elseif(!_tcscmp(_T("mid"),m_fileext))//當(dāng)為mid時(shí)mciOpenParms.lpstrDeviceType=_T("sequencer");17
mciOpenParms.lpstrElementName=m_filepath;//將打開(kāi)路徑存入mciOpenParms結(jié)構(gòu)體中dwError=mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT,(DWORD_PTR)&mciOpenParms);if(dwError){//如果打開(kāi)不成功,則顯示出錯(cuò)的原因if(mciGetErrorString(dwError,szErrorBuf.GetBuffer(),MAXERRORLENGTH))MessageBox(szErrorBuf,_T("MCI出錯(cuò)"),MB_ICONWARNING);else
MessageBox(_T("不明錯(cuò)誤標(biāo)識(shí)"),_T("MCI出錯(cuò)"),MB_ICONWARNING);return;}m_MCIDeviceID=mciOpenParms.wDeviceID;//將獲取的設(shè)備ID值賦給全局變量m_MCIDeviceIDm_isOpen=TRUE;//文件已打開(kāi)m_isPlay=FALSE;//未播放狀態(tài)m_isPause=FALSE;//未暫停狀態(tài)SetDlgItemText(IDC_BUTTON_PLAY,_T("播放"));//按鈕顯示為“播放”18(b)“播放”按鈕的消息響應(yīng)voidCMy11_2Dlg::OnBnClickedButtonPlay(){//TODO:在此添加控件通知處理程序代碼MCI_PLAY_PARMSmciPlayParms{};//定義變量存儲(chǔ)播放相關(guān)信息if(!m_isPlay)//如果沒(méi)有正在播放的聲音{mciPlayParms.dwCallback=(DWORD_PTR)GetSafeHwnd();//為發(fā)送MM_MCINOTIFY消息指定窗口句柄
mciPlayParms.dwFrom=0;//設(shè)置播放位置為0,即從頭開(kāi)始播放dwError=mciSendCommand(m_MCIDeviceID,MCI_PLAY,MCI_FROM|MCI_NOTIFY,(DWORD_PTR)&mciPlayParms);if(dwError){if(mciGetErrorString(dwError,szErrorBuf.GetBuffer(),MAXERRORLENGTH))MessageBox(szErrorBuf,_T("MCI出錯(cuò)"),MB_ICONWARNING);else
MessageBox(_T("不明錯(cuò)誤標(biāo)識(shí)"),_T("MCI出錯(cuò)"),MB_ICONWARNING);return;}19m_isPlay=TRUE;//設(shè)置正在播放標(biāo)識(shí)為T(mén)RUESetDlgItemText(IDC_BUTTON_PLAY,_T("暫停"));}else{//播放狀態(tài)下
if(!m_isPause){dwError=mciSendCommand(m_MCIDeviceID,MCI_PAUSE,0,NULL); //暫停播放SetDlgItemText(IDC_BUTTON_PLAY,_T("繼續(xù)"));m_isPause=TRUE;}else{dwError=mciSendCommand(m_MCIDeviceID,MCI_RESUME,0,NULL);//繼續(xù)播放SetDlgItemText(IDC_BUTTON_PLAY,_T("暫停"));m_isPause=FALSE;}if(dwError){if(mciGetErrorString(dwError,szErrorBuf.GetBuffer(),MAXERRORLENGTH))
MessageBox(szErrorBuf,_T("MCI出錯(cuò)"),MB_ICONWARNING);else
MessageBox(_T("不明錯(cuò)誤標(biāo)識(shí)"),_T("MCI出錯(cuò)"),MB_ICONWARNING);return;}}MCI_PLAY_PARMS數(shù)據(jù)結(jié)構(gòu),這是一個(gè)自定義結(jié)構(gòu)體,它的定義如下:typedefstruct{DWORD_PTRdwCallback; //指定用于MCI_NOTIFY標(biāo)志的窗口句柄DWORDdwFrom; //要開(kāi)始播放的位置DWORDdwTo; //要結(jié)束播放的位置}MCI_PLAY_PARMS;MCIERRORmciSendCommand(MCIDEVICEIDwIDDevice,UINTuMsg,DWORDfdwCommand,DWORDdwParam);//若成功則返回0,否則返回錯(cuò)誤碼其中:wIDDevice設(shè)備的ID:在打開(kāi)設(shè)備時(shí)不用該參數(shù)uMsg:命令消息,命令消息比較多,請(qǐng)大家參見(jiàn)響應(yīng)的手冊(cè)。常用的有播放MCI_PLAY,暫停MCI_PAUSE,暫停后重啟MCI_RESUME,停止播放MCI_STOP等f(wàn)dwCommand:命令消息的標(biāo)志dwParam:指向包含命令消息參數(shù)的結(jié)構(gòu)(c)“停止”按鈕的消息響應(yīng)voidCMy8_2Dlg::OnBnClickedButtonStop(){//TODO:在此添加控件通知處理程序代碼//發(fā)送停止命令消息,參數(shù)MCI_WAIT說(shuō)明當(dāng)命令執(zhí)行結(jié)束后函數(shù)才返回值
dwError=mciSendCommand(m_MCIDeviceID,MCI_STOP,MCI_WAIT,NULL);if(dwError){if(mciGetErrorString(dwError,szErrorBuf.GetBuffer(),MAXERRORLENGTH))
MessageBox(szErrorBuf,_T("MCI出錯(cuò)"),MB_ICONWARNING);else
MessageBox(_T("不明錯(cuò)誤標(biāo)識(shí)"),_T("MCI出錯(cuò)"),MB_ICONWARNING);return;}m_isPlay=FALSE;m_isPause=FALSE;SetDlgItemText(IDC_BUTTON_PLAY,_T("播放"));23(d)手動(dòng)加入MM_MCINOTIFY消息的處理函數(shù)在類(lèi)CMy8_2Dlg中加入public成員函數(shù):afx_msgLRESULTOnMmMcinotify(WPARAMwParam,LPARAMlParam);(e)接著在82Dlg.cpp中的消息映射入口處加入代碼:ON_MESSAGE(MM_MCINOTIFY,&CMy82Dlg::OnMmMcinotify)(f)最后編寫(xiě)OnMmMcinotify函數(shù)代碼afx_msgLRESULTCMy11_2Dlg::OnMmMcinotify(WPARAMwParam,LPARAMlParam)if(wParam==MCI_NOTIFY_SUCCESSFUL){//成功播放完成后重置標(biāo)識(shí)m_isPlay=FALSE;//設(shè)置正在播放標(biāo)識(shí)為FALSEm_isPause=FALSE;//設(shè)置正在暫停標(biāo)識(shí)為FALSESetDlgItemText(IDC_BUTTON_PLAY,_T("播放"));return0;}returnafx_msgLRESULT();}248.2利用WindowsMediaPlayer控件實(shí)現(xiàn)多媒體程序設(shè)計(jì)
【例8-3】編寫(xiě)應(yīng)用程序,使得用戶(hù)可以分別選擇一個(gè)視頻文件和一個(gè)音頻文件來(lái)同時(shí)播放或者分別播放
1.建立基于對(duì)話(huà)框的應(yīng)用程序2.對(duì)話(huà)框中單擊鼠標(biāo)右鍵,從快捷菜單中選擇“插入ActiveX控件”,并選擇“WindowsMediaPlayer”,3.在應(yīng)用程序中加入支持播放視頻/音頻的類(lèi)。為工程文件“添加”->新建項(xiàng)->在“添加新項(xiàng)”對(duì)話(huà)框中選擇“MFC”及“ActiveX控件中的MFC類(lèi)”,25文件的位置是:”c:\windows\system32\wmp.dll”,接著在“可用接口”列表框中的找到“IWMPPlayer4”添加到“實(shí)現(xiàn)接口”的列表框中。4.在8_3Dlg.h文件的頭部加入#include"CWMPPlayer4.h"266.為WindowsMediaPlay控件添加鼠標(biāo)雙擊事件處理程序,當(dāng)程序運(yùn)行時(shí)雙擊該控件,就出現(xiàn)一個(gè)選擇視頻/音頻文件的文件對(duì)話(huà)框,選擇正確格式的文件后就會(huì)播放文件。雙擊事件代碼如下:5.在對(duì)話(huà)框類(lèi)中為WindowsMediaPlay控件添加變量m_mediaPlay;或直接在8_3Dlg.h文件中添加如下代碼:public:CWMPPlayer4m_mediaPlay;然后添加數(shù)據(jù)交換關(guān)系:
voidCMy113Dlg::DoDataExchange(CDataExchange*pDX){CDialogEx::DoDataExchange(pDX);DDX_Control(pDX,IDC_OCX1,m_mediaPlay);}voidCMy8_3Dlg::DoubleClickOcx1(shortnButton,shortnShiftState,longfX,longfY){CFileDialogdlg(TRUE,NULL,L"*.*",OFN_FILEMUSTEXIST, L"ActiveStreamingFormat(*.asf)|*.asf|" L"AudioVideoInterleaveFormat(*.avi)|*.avi|" L"RealAudio/RealVideo(*.rm)|*.rm|" L"WaveAudio(*.wav)|*.wav|" L"MIDIFile(*.mid)|*.mid|" L"所有文件(*.*)|*.*||");
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 乳品發(fā)酵工崗前崗中水平考核試卷含答案
- 金箔制作工崗前理論評(píng)估考核試卷含答案
- 海底管道防腐工安全檢查測(cè)試考核試卷含答案
- 織布上軸工持續(xù)改進(jìn)評(píng)優(yōu)考核試卷含答案
- 2025年橡膠板、桿、型材合作協(xié)議書(shū)
- 大學(xué)活動(dòng)請(qǐng)假條格式
- 2025年綜合零售服務(wù)項(xiàng)目發(fā)展計(jì)劃
- 2026年生物多樣性互動(dòng)展覽項(xiàng)目可行性研究報(bào)告
- 2026年迷你綠植盆栽項(xiàng)目評(píng)估報(bào)告
- 環(huán)境監(jiān)理培訓(xùn)課件
- (2025年)保安員(初級(jí))證考試題庫(kù)及答案
- 福建省廈門(mén)市部分學(xué)校2025-2026學(xué)年九年級(jí)歷史上學(xué)期期末聯(lián)考試卷(含答案)
- 2025浙江杭州臨平環(huán)境科技有限公司招聘49人筆試模擬試題及答案解析
- 2026年浙江省軍士轉(zhuǎn)業(yè)崗位履職能力考點(diǎn)練習(xí)題及答案
- 生活垃圾焚燒廠運(yùn)管管理規(guī)范
- 江蘇省南京市2025-2026學(xué)年八年級(jí)上學(xué)期期末數(shù)學(xué)模擬試卷(蘇科版)(解析版)
- 箱式變電站安裝施工工藝
- 2025年安徽省普通高中學(xué)業(yè)水平合格性考試數(shù)學(xué)試卷(含答案)
- 2026屆四川省成都市2023級(jí)高三一診英語(yǔ)試題(附答案和音頻)
- 油罐圍欄施工方案(3篇)
- 國(guó)家開(kāi)放大學(xué)2025年(2025年秋)期末考試真題及答案
評(píng)論
0/150
提交評(píng)論