




已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
基于openGl的三維旋轉(zhuǎn)魔方源代碼/* *This Code Was Created By Jeff Molofee 2000 *A HUGE Thanks To Fredric Echols For Cleaning Up *And Optimizing The Base Code, Making It More Flexible! *If Youve Found This Code Useful, Please Let Me Know. *Visit My Site At */ Header File For Standard Input/Output #include MoFang.hHDChDC=NULL;/ Private GDI Device ContextHGLRChRC=NULL;/ Permanent Rendering ContextHWNDhWnd=NULL;/ Holds Our Window HandleHINSTANCEhInstance;/ Holds The Instance Of The Applicationboolkeys256;/ Array Used For The Keyboard Routineboolactive=TRUE;/ Window Active Flag Set To TRUE By Defaultboolfullscreen=TRUE;/ Fullscreen Flag Set To Fullscreen Mode By DefaultGLfloatxrot;/ X Rotation ( NEW )GLfloatyrot;/ Y Rotation ( NEW )GLfloatzrot;/ Z Rotation ( NEW )GLfloat RX;GLfloat RY;GLuinttexture24;/ Storage For One Texture ( NEW )GLboolean b_RX,b_RY;LRESULTCALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);/ Declaration For WndProcAUX_RGBImageRec *LoadBMP(char *Filename)/ Loads A Bitmap ImageFILE *File=NULL;/ File Handleif (!Filename)/ Make Sure A Filename Was Givenreturn NULL;/ If Not Return NULLFile=fopen(Filename,r);/ Check To See If The File Existsif (File)/ Does The File Exist?fclose(File);/ Close The Handlereturn auxDIBImageLoad(Filename);/ Load The Bitmap And Return A Pointerreturn NULL;/ If Load Failed Return NULLint LoadGLTextures()/ Load Bitmaps And Convert To Texturesint Status=FALSE;/ Status IndicatorAUX_RGBImageRec *TextureImage1;/ Create Storage Space For The Texturememset(TextureImage,0,sizeof(void *)*1); / Set The Pointer To NULL/ Load The Bitmap, Check For Errors, If Bitmaps Not Found Quitif (TextureImage0=LoadBMP(Data/NeHe.bmp)Status=TRUE;/ Set The Status To TRUEglGenTextures(1, &texture0);/ Create The Texture/ Typical Texture Generation Using Data From The BitmapglBindTexture(GL_TEXTURE_2D, texture0);glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage0-sizeX, TextureImage0-sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage0-data);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);if (TextureImage0)/ If Texture Existsif (TextureImage0-data)/ If Texture Image Existsfree(TextureImage0-data);/ Free The Texture Image Memoryfree(TextureImage0);/ Free The Image Structurereturn Status;/ Return The Statusint LoadGLTextures(char *file,int index)/ Load Bitmaps And Convert To Texturesint Status=FALSE;/ Status IndicatorAUX_RGBImageRec *TextureImage1;/ Create Storage Space For The Texturememset(TextureImage,0,sizeof(void *)*1); / Set The Pointer To NULL/ Load The Bitmap, Check For Errors, If Bitmaps Not Found Quitif (TextureImage0=LoadBMP(file)Status=TRUE;/ Set The Status To TRUEglGenTextures(1, &textureindex);/ Create The Texture/ Typical Texture Generation Using Data From The BitmapglBindTexture(GL_TEXTURE_2D, textureindex);glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage0-sizeX, TextureImage0-sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage0-data);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);if (TextureImage0)/ If Texture Existsif (TextureImage0-data)/ If Texture Image Existsfree(TextureImage0-data);/ Free The Texture Image Memoryfree(TextureImage0);/ Free The Image Structurereturn Status;/ Return The StatusGLvoid ReSizeGLScene(GLsizei width, GLsizei height)/ Resize And Initialize The GL Windowif (height=0)/ Prevent A Divide By Zero Byheight=1;/ Making Height Equal OneglViewport(0,0,width,height);/ Reset The Current ViewportglMatrixMode(GL_PROJECTION);/ Select The Projection MatrixglLoadIdentity();/ Reset The Projection Matrix/ Calculate The Aspect Ratio Of The WindowgluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);glMatrixMode(GL_MODELVIEW);/ Select The Modelview MatrixglLoadIdentity();/ Reset The Modelview Matrixint InitGL(GLvoid)/ All Setup For OpenGL Goes Hereif (!LoadGLTextures(Data/y1.bmp,0)/ Jump To Texture Loading Routine ( NEW )return FALSE;/ If Texture Didnt Load Return FALSEif (!LoadGLTextures(Data/y2.bmp,1)/ Jump To Texture Loading Routine ( NEW )return FALSE;/ If Texture Didnt Load Return FALSEif (!LoadGLTextures(Data/y3.bmp,2)/ Jump To Texture Loading Routine ( NEW )return FALSE;/ If Texture Didnt Load Return FALSEif (!LoadGLTextures(Data/y4.bmp,3)/ Jump To Texture Loading Routine ( NEW )return FALSE;/ If Texture Didnt Load Return FALSEif (!LoadGLTextures(Data/y5.bmp,4)/ Jump To Texture Loading Routine ( NEW )return FALSE;/ If Texture Didnt Load Return FALSEif (!LoadGLTextures(Data/y6.bmp,5)/ Jump To Texture Loading Routine ( NEW )return FALSE;/ If Texture Didnt Load Return FALSEif (!LoadGLTextures(Data/y7.bmp,6)/ Jump To Texture Loading Routine ( NEW )return FALSE;/ If Texture Didnt Load Return FALSEif (!LoadGLTextures(Data/y8.bmp,7)/ Jump To Texture Loading Routine ( NEW )return FALSE;/ If Texture Didnt Load Return FALSE glEnable(GL_TEXTURE_2D);/ Enable Texture Mapping ( NEW )glShadeModel(GL_SMOOTH);/ Enable Smooth ShadingglClearColor(0.0f, 0.0f, 0.0f, 0.5f);/ Black BackgroundglClearDepth(1.0f);/ Depth Buffer SetupglEnable(GL_DEPTH_TEST);/ Enables Depth TestingglDepthFunc(GL_LEQUAL);/ The Type Of Depth Testing To DoglHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);/ Really Nice Perspective Calculationsreturn TRUE;/ Initialization Went OKvoid DrawObject1(GLfloat X,GLfloat Y,GLfloat Z)glBegin(GL_QUADS);/ Front FaceglTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f + X, -1.0f + Y, 1.0f + Z);glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f + X, -1.0f + Y, 1.0f + Z);glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f + X, 1.0f + Y, 1.0f + Z);glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f + X, 1.0f + Y, 1.0f + Z);/ Back FaceglTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f + X, -1.0f + Y, -1.0f + Z);glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f + X, 1.0f + Y, -1.0f + Z);glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f + X, 1.0f + Y, -1.0f + Z);glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f + X, -1.0f + Y, -1.0f + Z);/ Top FaceglTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f + X, 1.0f + Y, -1.0f + Z);glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f + X, 1.0f + Y, 1.0f + Z);glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f + X, 1.0f + Y, 1.0f + Z);glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f + X, 1.0f + Y, -1.0f + Z);/ Bottom FaceglTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f + X, -1.0f + Y, -1.0f + Z);glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f + X, -1.0f + Y, -1.0f + Z);glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f + X, -1.0f + Y, 1.0f + Z);glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f + X, -1.0f + Y, 1.0f + Z);/ Right faceglTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f + X, -1.0f + Y, -1.0f + Z);glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f + X, 1.0f + Y, -1.0f + Z);glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f + X, 1.0f + Y, 1.0f + Z);glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f + X, -1.0f + Y, 1.0f + Z);/ Left FaceglTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f + X, -1.0f + Y, -1.0f + Z);glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f + X, -1.0f + Y, 1.0f + Z);glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f + X, 1.0f + Y, 1.0f + Z);glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f + X, 1.0f + Y, -1.0f + Z);glEnd(); void DrawObject(int ID)stPoint *CubePoint = CubeID.CubePoint;glBegin(GL_QUADS);/ Front FaceglTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint0.p);glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint1.p);glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint2.p);glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint3.p);/ Back FaceglTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint4.p);glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint5.p);glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint6.p);glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint7.p);/ Top FaceglTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint5.p);glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint3.p);glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint2.p);glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint6.p);/ Bottom FaceglTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint4.p);glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint7.p);glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint1.p);glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint0.p);/ Right faceglTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint7.p);glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint6.p);glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint2.p);glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint1.p);/ Left FaceglTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint4.p);glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint0.p);glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint3.p);glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint5.p);glEnd(); int DrawGLScene(GLvoid)/ Heres Where We Do All The DrawingglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/ Clear The Screen And The Depth BufferglLoadIdentity();/ Reset The ViewglTranslatef(0.0f,0.0f,-12.0f);glTranslatef(RX,0.0f,0.0f); glTranslatef(0.0,RY,0.0); glRotatef(xrot,1.0f,0.0f,0.0f); glRotatef(yrot,0.0f,1.0f,0.0f); glRotatef(zrot,0.0f,0.0f,1.0f); /glBindTexture(GL_TEXTURE_2D, texture0); DrawObject(0);glBindTexture(GL_TEXTURE_2D, texture1); DrawObject(1);glBindTexture(GL_TEXTURE_2D, texture2); DrawObject(2);glBindTexture(GL_TEXTURE_2D, texture3); DrawObject(3);glBindTexture(GL_TEXTURE_2D, texture4); DrawObject(4);glBindTexture(GL_TEXTURE_2D, texture5); DrawObject(5);glBindTexture(GL_TEXTURE_2D, texture6); DrawObject(6);glBindTexture(GL_TEXTURE_2D, texture7); DrawObject(7);/*/ xrot+=0.15f; yrot+=0.1f; zrot+=0.2f;return TRUE;/ Keep GoingGLvoid KillGLWindow(GLvoid)/ Properly Kill The Windowif (fullscreen)/ Are We In Fullscreen Mode?ChangeDisplaySettings(NULL,0);/ If So Switch Back To The DesktopShowCursor(TRUE);/ Show Mouse Pointerif (hRC)/ Do We Have A Rendering Context?if (!wglMakeCurrent(NULL,NULL)/ Are We Able To Release The DC And RC Contexts?MessageBox(NULL,Release Of DC And RC Failed.,SHUTDOWN ERROR,MB_OK | MB_ICONINFORMATION);if (!wglDeleteContext(hRC)/ Are We Able To Delete The RC?MessageBox(NULL,Release Rendering Context Failed.,SHUTDOWN ERROR,MB_OK | MB_ICONINFORMATION);hRC=NULL;/ Set RC To NULLif (hDC & !ReleaseDC(hWnd,hDC)/ Are We Able To Release The DCMessageBox(NULL,Release Device Context Failed.,SHUTDOWN ERROR,MB_OK | MB_ICONINFORMATION);hDC=NULL;/ Set DC To NULLif (hWnd & !DestroyWindow(hWnd)/ Are We Able To Destroy The Window?MessageBox(NULL,Could Not Release hWnd.,SHUTDOWN ERROR,MB_OK | MB_ICONINFORMATION);hWnd=NULL;/ Set hWnd To NULLif (!UnregisterClass(OpenGL,hInstance)/ Are We Able To Unregister ClassMessageBox(NULL,Could Not Unregister Class.,SHUTDOWN ERROR,MB_OK | MB_ICONINFORMATION);hInstance=NULL;/ Set hInstance To NULL/*This Code Creates Our OpenGL Window. Parameters Are:* *title- Title To Appear At The Top Of The Window* *width- Width Of The GL Window Or Fullscreen Mode* *height- Height Of The GL Window Or Fullscreen Mode* *bits- Number Of Bits To Use For Color (8/16/24/32)* *fullscreenflag- Use Fullscreen Mode (TRUE) Or Windowed Mode (FALSE)*/ BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)GLuintPixelFormat;/ Holds The Results After Searching For A MatchWNDCLASSwc;/ Windows Class StructureDWORDdwExStyle;/ Window Extended StyleDWORDdwStyle;/ Window StyleRECTWindowRect;/ Grabs Rectangle Upper Left / Lower Right ValuesWindowRect.left=(long)0;/ Set Left Value To 0WindowRect.right=(long)width;/ Set Right Value To Requested WidthWindowRect.top=(long)0;/ Set Top Value To 0WindowRect.bottom=(long)height;/ Set Bottom Value To Requested Heightfullscreen=fullscreenflag;/ Set The Global Fullscreen FlaghInstance= GetModuleHandle(NULL);/ Grab An Instance For Our Windowwc.style= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;/ Redraw On Size, And Own DC For Window.wc.lpfnWndProc= (WNDPROC) WndProc;/ WndProc Handles Messageswc.cbClsExtra= 0;/ No Extra Window Datawc.cbWndExtra= 0;/ No Extra Window Datawc.hInstance= hInstance;/ Set The Instancewc.hIcon= LoadIcon(NULL, IDI_WINLOGO);/ Load The Default Iconwc.hCursor= LoadCursor(NULL, IDC_ARROW);/ Load The Arrow Pointerwc.hbrBackground= NULL;/ No Background Required For GLwc.lpszMenuName= NULL;/ We Dont Want A Menuwc.lpszClassName= OpenGL;/ Set The Class Nameif (!RegisterClass(&wc)/ Attempt To Register The Window ClassMessageBox(NULL,Failed To Register The Window Class.,ERROR,MB_OK|MB_ICONEXCLAMATION);return FALSE;/ Return FALSEif (fullscreen)/ Attempt Fullscreen Mode?DEVMODE dmScreenSettings;/ Device Modememset(&dmScreenSettings,0,sizeof(dmScreenSettings);/ Makes Sure Memorys CleareddmScreenSettings.dmSize=sizeof(dmScreenSettings);/ Size Of The Devmode StructuredmScreenSettings.dmPelsWidth= width;/ Selected Screen WidthdmScreenSettings.dmPelsHeight= height;/ Selected Screen HeightdmScreenSettings.dmBitsPerPel= bits;/ Selected Bits Per PixeldmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;/ Try To Set Selected Mode And Get Results. NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)/ If The Mode Fails, Offer Two Options. Quit Or Use Windowed Mode.if (MessageBox(NULL,The Requested Fullscreen Mode Is Not Supported BynYour Video Card. Use Windowed Mode Instead?,NeHe GL,MB_YESNO|MB_ICONEXCLAMATION)=IDYES)fullscreen=FALSE;/ Windowed Mode Selected. Fullscreen = FALSEelse/ Pop Up A Message Box Letting User Know The Program Is Closing.MessageBox(NULL,Program Will Now Close.,ERROR,MB_OK|MB_ICONSTOP);return FALSE;/ Return FALSEif (fullscreen)/ Are We Still In Fullscreen Mode?dwExStyle=WS_EX_APPWINDOW;/ Window Extended StyledwStyle=WS_POPUP;/ Windows StyleShowCursor(FALSE);/ Hide Mouse PointerelsedwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;/ Window Extended StyledwStyle=WS_OVERLAPPEDWINDOW;/ Windows StyleAdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);/ Adjust Window To True Requested Size/ Create The Windowif (!(hWnd=CreateWindowEx(dwExStyle,/ Extended Style For The WindowOpenGL,/ Class Nametitle,/ Window TitledwStyle |/ Defined Window StyleWS_CLIPSIBLINGS |/ Required Window StyleWS_CLIPCHILDREN,/ Required Window Style0, 0,/ Window PositionWindowRect.right-WindowRect.left,/ Calculate Window WidthWindowRect.bottom-WindowRect.top,/ Calculate Window HeightNULL,/ No Parent WindowNULL,/ No MenuhInstance,/ InstanceNULL)/ Dont Pass Anything To WM_CREATEKillGLWindow();/ Reset The DisplayMessageBox(NULL,Window Creation Error.,ERROR,MB_OK|MB_ICONEXCLAMATION);return FALSE;/ Return FALSEstaticPIXELFORMATDESCRIPTOR pfd=/ pfd Tells Windows How We Want Things To Besizeof(PIXELFORMATDESCRIPTOR),/ Size Of This Pixel Format Descriptor1,/ Version NumberPFD_DRAW_TO_WINDOW |/ Format Must Support WindowPFD_SUPPORT_OPENGL |/ Format Must Support OpenGLPFD_DOUBLEBUFFER,/ Must Support Double BufferingPFD_TYPE_RGBA,/ Request An RGBA Formatbits,/ Select Our Co
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 金融科技監(jiān)管科技企業(yè)制定與實施新質(zhì)生產(chǎn)力項目商業(yè)計劃書
- 軍事歷史戰(zhàn)役模擬營行業(yè)深度調(diào)研及發(fā)展項目商業(yè)計劃書
- 生物可降解塑料行業(yè)深度調(diào)研及發(fā)展項目商業(yè)計劃書
- 銀行資產(chǎn)處置服務(wù)企業(yè)制定與實施新質(zhì)生產(chǎn)力項目商業(yè)計劃書
- 高速信號分析儀行業(yè)跨境出海項目商業(yè)計劃書
- 脈動前行引領(lǐng)未來脈沖變壓器在商業(yè)領(lǐng)域的升級探索
- 2025年盤園兒鋼項目發(fā)展計劃
- 花卉種植的可持續(xù)發(fā)展路徑
- 遠程客服的技巧與實戰(zhàn)經(jīng)驗分享
- 幼兒園混齡教育實踐研究
- 新中國史智慧樹知到期末考試答案章節(jié)答案2024年大連海事大學(xué)
- 敬畏生命-道德與法治市公開課一等獎省賽課微課金獎?wù)n件
- 武漢市2024屆高中畢業(yè)生四月調(diào)研考試(四調(diào))政治試卷(含答案)
- 多發(fā)傷救治及進展
- 2024中國醫(yī)藥行業(yè)人才發(fā)展報告-智聯(lián)招聘-202404
- 光伏電站巡檢記錄表完整
- 全新版《大學(xué)英語》綜合教程-第一冊-教案
- 2024年01月青海大學(xué)附屬醫(yī)院招考聘用116人預(yù)選筆試近6年高頻考題難、易錯點薈萃答案帶詳解附后
- 中考數(shù)學(xué)一輪復(fù)習題型歸納課件專題16 與圓有關(guān)的計算(含答案)
- 專題03 根據(jù)音標寫單詞常考易錯100題-譯林版七年級上學(xué)期英語期末考點復(fù)習專項訓(xùn)練
- 公司產(chǎn)品與服務(wù)的特點與優(yōu)勢
評論
0/150
提交評論