工具栏与状态栏第7章和_第1页
工具栏与状态栏第7章和_第2页
工具栏与状态栏第7章和_第3页
工具栏与状态栏第7章和_第4页
工具栏与状态栏第7章和_第5页
免费预览已结束,剩余20页可下载查看

下载本文档

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

文档简介

第7章和状态应用程序向导自动地为应用程序创建一个常用的,应用程序底部的状态栏也有个标准问题,只有Shift和Num键的状态在此处更新。本章中的例子讨论怎样定制这些栏。例22使用编辑器使用编辑器(ToolBarEditor)修改,以及创建新。例23启用和禁用按钮根据应用程序的状态,灰化和正常化按钮。为按钮添加字,在的按钮上添加文字,这样可表明按钮作用。非标准大小讨论改变按钮大小的方法例 保持按钮按下讨论保持按钮按下的方法,以指示该功能正在使 例28为添加非按钮控件添加一个组合框到 修改应用程序的状态栏用字符串表编辑器(StringTableEditor)修改应用程序的状例 更新状态栏窗格使用ClassWizard创建一个类,更新显示状态窗格上的文本消息例 为状态栏添加其他控件添加一个按钮和进度指示控件到一个状态栏例22使用编辑注意给应用程序添加的任何新的按钮,初始时显示灰色并且是无效的,直到添加一个处理该按钮令处理函数为止。例13显示了怎样添加一个菜单命令处理函应用DeveloperStudio要创建一个新的,单击DeveloperStudio的Insert/Resource菜单命令,打开Insert/Resource框,然后从列表中选取ToolBar,并单击New。编辑一个已有的,在应用程序资源的文件夹中找到它的ID,并双击它,这将打开ToolBarEditor。用编辑器添加一个新的按钮到,先用鼠标拖动末尾的空白①拖尾部的白按钮到 钮的位③双①拖尾部的白按钮到 钮的位③双击按钮打开它 图7-1添加一个间隔(spacer)到该(按钮间的空白区)。首先,确定当前哪个按钮正好在放置间隔的位置处,并用鼠标抓住它;然后稍微往右拖动该按钮,并放开它,此时应该出现一个空白间隔。要删除一个间隔,稍微拖动当前在它右边的按钮,并覆盖它。要删除一个按钮,只要把它拖离即可。如果出现误操作,则用DeveloperStudio的undo命令取消误操每个按钮的属性框显示与菜单项的属性框相同的ID和Prompt编辑框,关于它们的意义参见例12。尺寸编辑框(sizeeditbox)不仅允许改变该按钮的大小,而且可以改变每个按钮的大小,参见例25关于创建非标准按钮。为按钮添加一个命令处理函数,与添加一个菜单命令处理函数相同(参见例13)。实际上,按钮是一个菜单命令的图形表示,没有相应菜单的按钮几乎不存在,管统的技以个应钮。if(!m_wndToolBar1.Create(this){TRACE0("Failedtocreatetoolbar1\n");return-1; //failtocreate}m_wndToolBar1.SetBarStyle(m_wndToolBar1.GetBarStyle()|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC);新的一排接一排地垂直添加到应用程序的窗口中,如果使一个接一个水平地添加到窗口中,可以用下面的代码:参见7.1.5节DockControlBarLeftOf()的浮动可以从应用程序窗口中拖下来,“漂浮”在它自己的窗口里(事实上,是由MFC的CMiniFrameWnd类控制一个微型框架窗口)。如果用户按下浮动上的关闭按钮,则不像其他窗口一样被销毁,而只是被隐。要允许用户把拖回到原处,需要在应用程序的视图命令中,为每个新添加一个附加菜单命令,每个这样令只是重显个隐的,下面示。关怎添一个菜命令见例13。void{ShowControlBar(&m_wndToolBar1,m_wndToolBar1.GetStyle()&WS_VISIBLE)==0,FALSE);}还可以在当前可视的菜单项边上,放置一个复选标志。参见例16中有关怎样添加一个消息处理函数,以添加复选标志到菜单命令中。然后,可以用下面的代码填充该处理函数。voidCMainFrame::OnUpdateToolBar1(CCmdUI*{pCmdUI->SetCheck((m_wndToolBar1.GetStyle()&WS_VISIBLE)!=}除了用DockControlBarLeftOf()之外,还可以在CToolBar的Create()的调用变量中,指 (100,0)的地方。然而 CMainFrame可能把它移到别的地方if(!m_wndToolBar1.Create(this,100,0)::最后一步显示了在开始时,怎样把一个放置在另一个的左边。但是在与应用程序话间存户一确置请见例5。(见例13)。虽然可以用m_bAuto 它不能启用一个没有处理函数的按钮。CD在CD上没有本例的相—DockControlBarLeftOf(voidCMainFrame::DockControlBarLeftOf(CToolBar*Bar1,CToolBar*Bar2){CRectrect;}例23启用和禁用按启用或禁用一个按钮(禁用的按钮显示灰色)与菜单命令一样,在用ClassWizard添加一个命令处理函数到按钮之前,它将显示禁用状态(见例13)可以有条件地启用和禁用一个按钮。按照例13关于添加一个菜单命令处理函数所示的步骤,但是这时选用 UPDATE_COMMAND_UI,而不是COMMAND。添加下面的代码到新的处理函数中,如果要启用菜单项, m_bWzd为TRUEvoidCWzdView::OnUpdateWzdType(CCmdUI*{pCmdUI-}通过ID与按钮相关联的菜单项,随按钮一起被启用或禁用按钮的状态不被更新,并且,该过程只在应用程序空闲时被调用。如果不愿等待那么长时间,可以取得一个指向该类的指针(可能在MainFrame里),并调用它的Updateindow()有关MFC怎样更新用户界面的详细内容,参见第3后面的例子CD在CD上执行该工程时,将看到一个新按钮,它已被启用 (见图7-2)

图7-2添加一组文本串,以创建带使用CToolBarCtrl::AddStrings()给添加一组文本串(textstrings);然后用CToolBarCtrl::InsertButton()使每一个按钮与一个串相关联;继而用编辑器创建和编辑应用程序的,动态地使一个与它的串相关联。本例中,用ClassWizard把该功能封装到类中。用StringEditor添加一组新串到应用程序中,这些串是显示在按钮下的短标题,在CMainFrame类中定义一个数组,用它使一个令ID与上一步创建的串标题的ID相关联。本例中创建一个叫做TOOLTEXT的结构,用它进行关联,该结构只包含staticTOOLTEXTtooltext[]{ID_FILE_NEW,IDS_FILE_NEW,ID_FILE_OPEN,IDS_FILE_OPEN,ID_FILE_SAVE,IDS_FILE_SAVE,ID_EDIT_CUT,IDS_FILE_CUT,ID_EDIT_COPY,IDS_FILE_COPY,ID_EDIT_PASTE,IDS_FILE_PASTE,ID_FILE_PRINT,IDS_FILE_PRINT,ID_APP_ABOUT,IDS_APP_ABOUT,#defineTOOLTEXT_NUM现在,创建一个新的类,在该类中添加一个叫做LoadToolBarEx()的函数,它将装用ClassWizard创建一个派生于CToolBarCtrl的新类。实际上,该类应派生于CToolBarClassWizard不支持CToolBar,因此,在新类中,必须手工改变对CToolBarCtrl的为对CToolBar的。在类中添加一个叫做LoadToolBarEx的新成员函数,把前面的文本串表传递给它。在该函数开始处,用CToolBar::LoadToolBar()装入一个资源。BOOLCWzdToolBar::LoadToolBarEx(UINTnID,TOOLTEXT*pToolText,intnCnt){BOOLif{资源一旦装入,将面创建的标题表中循环。在那里,找到它所指向的工具栏命令ID;对于已经找到的,从串资源中装入该按钮的串。for(int{//findbutton mandToIndex(pToolText[] //gettextforbuttonCStringstr;str.LoadString(pToolText[接着,添加装入的串到控件//addasecondNULLtostringforAddStrings()intnLen=str.GetLength()+1;TCHAR*pStr=str.GetBufferSetLength(nLen);pStr[nLen]=0;//addnewbuttonusingAddStrings//(noModifyButton()function)}控件返回一个指向串的索引,并可以用该按钮。注意到AddStrings()在最后还应注意,因为没有ModifyButton()函数,须删除和重新每个按钮用 )使该中的按钮变大,以便它们能够适应新的标题。)的第一个变量表示每个按钮要求多少位图图像,第二个变量表示实际上使该按钮多大。//makebuttonslargertohandleaddedtextCSizesizeImage(16,15);CSizesizeButton(35,35);SetSizes(sizeButton,sizeImage);在CMainFrame中,用该新的类替换应用程序的初始类//callthenewCWzdToolBar::LoadToolBarEx()functionif(!m_wndToolBar.Create(this)||{TRACE0("Failedtocreatereturn- //failto}当鼠标在一个按钮上停留时间超过半分钟时,本例中添加的标题将添加到显示的气泡帮助标题中。CD在CD上执行该工程时,将看到按钮已被放大,并为每个按钮添加了一个描述词— 3A5CD903_E412_11D1_9B7D_00AA003D8695 #defineAFX_WZDTOOLBAR_H #if_MSC_VER>=#pragma#endif//_MSC_VER>=//WzdToolBar.h:header//CWzdToolBartypedefstruct{UINT UINTidString;}classCWzdToolBar:public{//ConstructionBOOLLoadToolBarEx(UINTnID,TOOLTEXT*pToolText,int////ClassWizardgeneratedvirtualfunction//Implementationvirtual//Generatedmessagemapfunctions//NOTE-theClassWizardwilladdandremovememberfunctions//DeveloperStudiowillinsertadditionaldeclarationsimmedia//beforetheprevious// //WzdToolBar.cpp:implementation#include"stdafx.h"#include"wzd.h"#include"WzdToolBar.h"#ifdef#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=FILE;//{}{} //NOTE-theClassWizardwilladdandremovemapmacros//CWzdToolBarmessageBOOLCWzdToolBar::LoadToolBarEx(UINTnID,TOOLTEXT*pToolText,int{BOOLif{//loopthroughtooltextaddingtexttobuttonsfor(inti=0;i<nCnt;i++){//findTBBUTTON //gettextforbuttonCStringstr;//addasecondNULLtostringforAddStrings()intnLen=str.GetLength()+1;TCHAR*pStr=str.GetBufferSetLength(nLen);pStr[nLen]=0;//addnewbuttonusingAddStrings//(noModifyButton()function)}//makebuttonslargertohandleaddedtextCSizesizeImage(16,15);CSizesizeButton(35,35);SetSizes(sizeButton,sizeImage);}return}例 非标准大16×16像 按16×16像 按32×32像按图7-3用编辑器增大按钮的大小,然后,在每个按钮表面重画一幅图像,或从别处剪切并粘贴一幅新图像。接着,讨论CoolBar::SetSizes(),它允许用程序设计方法改变按钮的大小。在应用程序资源的ToolBar文件夹中,找到要编辑的ID,双击它以打开ToolBarEditor,选择DeveloperStudio的Image/GridSettings⋯菜单命令以打开GridSetting网格设置)框,在那里可以设置新按钮的位图部分的大小,本例中为25×25像素。现在,拖动按钮右下角的移动框,直到它大小合适为止用编辑器把一个已有的按钮图像放大到新的大小。首先,用剪切工具选取图像;接着,拖动移动框,直到图像足够大;然后,修饰由此产生的图像。只是放大图像往往不能得到好的效果,因为没有足够像素自动创建一幅平滑图像,但可以从别的资源那里,切并粘贴一幅更大的图像到该按钮上。放大图像如上所述;而对于的放大,资源会自动告诉应用程序,使工具用CToolbar::SetSizes()改变按钮大有时,可能需要在运行时放大按钮,例24就是这样的一个例子。它要求放大按钮,//settoolbarsizeto32by32pixelsSIZEsizeButton,sizeImage;sizeImage.cx=25;sizeImage.cy=sizeButton.cx=sizeImage.cx+7;//allowforspacingaroundimagesizeButton.cy=sizeImage.cy+7;m_wndToolBar.SetSizes(sizeButton,sizeImage);,CD中包括了一个标准的放大版。要使用应用程序中的该图像,在另一个DeveloperStudio中打开该例子的工程,然后用剪切和粘贴的方法,把那些图像装到新的应用程序中。CD在CD上执行该工程时,可以看到按钮和图标都已被放大例 保持按钮按在按钮被单击后,使它保持按下状态(见图7-4)用ClassWizard

图7-4添加一个用户界面按照例24中的步骤,给应用程序添加一个用户界面处理函数,然后把下面的代码添加到该新处理函数中。voidCWzdView::OnUpdateWzdButton(CCmdUI*{//thissamecommandchecksany itemstoo}实际上,一个按下的按钮是对等于选中的菜单项的的,当选中一个菜单项时,便得到了一个按下的按钮。CCmdUI类对象被重载,以MFC更新一个工具栏按钮,而不是一个菜项时,不同的SetCheck()函数被每个菜单项和按钮调用。按钮的状态在应用程序空闲时更新(因此该例程被调用)。如果不愿等待那么长时间,可以获得一个指向类的指针(可能在CMainFrame中),并调用它的UpdateWindow()成员函数。有关MFC更新用户界面的详细讨论参见第3CD在CD上执行该工程时,可以看到一个按下的新按钮例 保持按钮组中一个按钮按保持按钮组中只有一个按钮按下,以表示应用程序处于一个特定的模式(见图7-5)用CCmdUI::SetRadio(,以按下合适的按钮。个命令处理函数(见例13),用这些处理函数void{

图7-5给一组中的每一个添加一个界面}void{}void{}用ClassWizard(见例15)。在每个处理函数中,根据当前模式,用SetRadio()告知一个按钮已被按下。voidCWzdView::OnUpdateWzd1Button(CCmdUI*{pCmdUI-}voidCWzdView::OnUpdateWzd2Button(CCmdUI*{pCmdUI-}voidCWzdView::OnUpdateWzd3Button(CCmdUI*{pCmdUI-}对于按钮来讲,使用SetCheck()或SetRadio()没有区别,两者都能保持一个按钮按下;但是,如果这些按钮用来与一组菜单项关联,则应使用SetRadio(),以便在菜单项边上显有关MFC更新用户界面的详细内容参见第3CD在CD上执行该工程时,单击中每一个Wzd按钮,按下一个按钮的同时,所有其他的例28为添加非按钮控添加一个组合框或其他控件窗口到(见图7-6)图7-6添加一个组合框到要放置别的控件窗口或任何子窗口到一个中,首先必须通知,在要放置窗口的地方放置一个足够大的间隔,然后在该位置手工创建一个控件窗口;要保持使用oolBarEditor编辑该的能力必须创建个特殊的按钮ID,当它被一个按钮使用时,可以用软件改变成一个组合框。该功能被封装到类中。用ClassWizard创建一个从CToolBarCtrl派生的类,然后用文本编辑器(TextEditor)在创建的.cpp和h文件中用CToolBar替换CToolBarCtrl。添加一个叫做LoadToolBarExBOOLCwzdToolBar::LoadToolBarEx(UINT在LoadToolBarEx()中,开始处用CToolBar::LoadToolBar()装入一个资源//loadtoolbarinfoBOOLbRet;接着,寻找一个特殊的按钮命令ID,本例中称为 BO。一个使用工栏编辑器创建的具有该ID的按钮,将被该新的类转变为一个组合框。在中寻找该ID,使用下面代码://findwhereourcomboboxwill 然后,用下面的代码把该按钮转变为一个非常宽的间隔//covertbuttonintoolbarintoaspacerforourcombo 这里的COMBOLEN是间隔以像素为单()//createcomboboxCRectrect;BODROP;//howfarwillcombodropdown?rect, 还应在该类中处理所有来自该组合框的控件通知,但是必须手工添加它们在CMainFrame中,用该新的类替换任何一个当前使用的类;在本例中,对CoolBar为CWzdToolBar在CMainFrame()的OnCreate()中把LoadoolBar()改为LoadoolBarEx()。使用ToolbarEditor在想要一个组合框的位置为添加一个新按钮,并赋予该按钮前面指定的特殊令ID,本例中是 BO。应用程序中的多个可还可以用该方法添加其他控件到一个中,只要它们的尺寸能放进中,包括按钮(下压、复选和单选/一个最初看起来好象是一个具有一些子窗口按钮的父窗口,事实上它是一个自身绘制了许多“按钮”的大的控件窗口,并为这些按钮处理所有的鼠标动作。CD在CD上执行该工程时,将在中看到一个新的组合框— #defineAFX_WZDTOOLBAR_H #if_MSC_VER>=#pragma#endif//_MSC_VER>=//WzdToolBar.h:header//CWzdToolBarclassCWzdToolBar:public{//ConstructionBOOLLoadToolBarEx(UINT//////ClassWizardgeneratedvirtualfunction//Implementationvirtual//Generatedmessagemapfunctionsafx_msg afx_msg //DeveloperStudiowillinsertadditionaldeclarationsimmedia//beforetheprevious// //WzdToolBar.cpp:implementation#include"stdafx.h"#include"wzd.h"#include"WzdToolBar.h"#ifdef#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=FILE;#defineCOMBOPOS3 //positionofcomboboxintoolbar#defineCOMBOLEN120 //lengthofcomboboxinpixels#defineCOMBODROP //lengthofdropofcomboboxin//{}{} //CWzdToolBarmessageBOOLCWzdToolBar::LoadToolBarEx(UINT{//loadtoolbarinfoBOOLbRet;//findwhereourcomboboxwill //covertbuttonintoolbarintoaspacerforourcombo //createcomboboxCRectrect;BODROP;//howfarwillcombodropdown?bo.Create(WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,rect,this,return}void {}void {intif {}{}}

bo.GetLBText(i,例29给应用程序的状态栏添加附加的指示器(见图7-7)添添加新的指示字符到状图7-7用字符串表编辑器和文本编辑器添加一个窗格到状态栏目前没有字符串表编辑器,若要添加指示器到一个状态栏中,首先必须用字符串表编辑器保存状态栏中有条件显示的文本,然后用文本编辑器,添加一行代码到CMainFrame告诉CStatusBar单击应用程序的ResourceView,并在StringTable文件夹中找到字符串表,双击符串表的ID,以产生tringTableEditor。要添加一个新的指示字符串到该表中,找到ID_INDICATOR_REC串,并单击Studio的Insert/NewString菜单命令。这样,既一个新字符串,同时还打开它的属性框(见图②②添加指示器名①改变特征ID为R_XXX格图7-8用字符串编辑器添加一个状态通常,还应赋予指示器ID一个类似于ID_INDICTOR_XXX的名称(这里的XXX描述指示器),然后在Caption栏输入一个文本字符串。当状态栏窗格有效时,该字符串将在状态栏中显示,该字符串的长度决定在状态栏中显示指示器的窗格的长度。如果在该标题的前后空格,则窗格将显得比文本字符串大。单击属性框的关闭按钮,这一改变将被保存到表里。在MainFrame把该指示器的ID添加到CMainFrame的indicators[]数组中,在MainFrm.cpp中找到该数staticUINTindicators[]{ //statuslineindicator //<<<<<<new>>>>>>>字符串编辑器中的水平线表示字符串的间隔,例如:ID_INDICTOR_REC值为59141ID_VIEW_TOOLBAR则跳到59392可以在这些水平线之一一个新字符串,即使已经选择ID_INDICTOR_NUM作为想要添StringTableEditor也会在ID_INDICTOR_REC后默认设置一个位置。CD在CD上没有该例子的例30(见图7-9)显显示状态栏窗格并用来指图7-9通过系统盒的图标启动状态栏的窗格,以指示应用程序状允许应用程序更新按钮状态的机理,同样也可以用来更新状态栏窗格的状态,但效果却不同。一个被无效化的状态栏窗格,不是显示灰色文本,而是根本不显示任何东西;因为目前ClassWizard不能处理状态栏指示器,因此,必须手工为每个需要启用或禁用的状态栏窗格,添加一个用户界面处理函数。BEGIN_MESSAGE_MAP(CWzdView,CV确保把这些宏放在ClassWizard使用的({{}})括弧之外,这里所用的ID是窗格的ID在.h//Generatedmessagemapfunctionsafx_msgvoidOnUpdateIndicatorWzd1(CCmdUI*pCmdUI);afx_msgvoidOnUpdateIndicatorWzd2(CCmdUI*pCmdUI);voidCWzdView::OnUpdateIndicatorWzd1(CCmdUI{pCCmdUI-}打开一个状态指示器,并把它的名称改 NEW或任何其他名称,可以用voidCWzdView::OnUpdateIndicatorWzd1(CCmdUI{}打开一个指示器并选取它(使它显得从屏幕中升起)voidCWzdView::OnUpdateIndicatorWzd2(CCmdUI{}同按钮一样,状态栏窗格在应用程序空闲时更新。若要使它更早些时候更新,可以用paeindo()。m_statusbar.UpdateWindow(在这里调用的SetCheck()函数,与更新菜和面时调用的SetCheck()函一样。事实上,这些SetCheck()的实例(和CCmdUI的其他成员函数)除了名字以外都是不同的。它们是CCmdUI基类的重载成员变量,还有其他四个从CCmdUI基类派生的类,用来处理每种类型的条或菜单。在一个条或菜单将要被更新的时候,为每个窗格、按钮或控件创建合适的CCmdUI派生类,并用第3章中描述的OnCmdMsg()机制,把它发送到处理函数。有关CCmdUI类和更新用户界面状态的详细内容,参见第3章。CD在CD上执行该工程时将会看到在状态栏上有两个新的窗格,一个是按下的,另一个是升起的。例 为状态栏添加其他控(见图7-10)图7-10添加控件到状态栏用前面例子中所示的方法,添加两个新项目到状态栏中。然而这次添加的文本将是空白文本字符串,它只是作为将要动态创建的控件窗口的空间占有者;然后用CStatusBar的GetItemRect()成员函数,获取空间占有者的尺寸,并在它们上面手工创建控件。在字符串表中创建两个叫做ID_INDICTOR_WZDPROGRESS和ID_INDICTOR_WZDBUTTON的新字符串,并定义它们为空白字符串。空格的数量将决定控件在状态栏中的大小。在需要它们在状态栏中显示的位置,添加这些串ID到CMainFrame的指示器数组//addnewid’stoindicatorsinMainfrm.cppstaticUINTindicators[]={ //statuslineindicator ID_INDICATOR_WZDPROGRESS,<<<<<<<<<<<<<<<使用ClassWizard创建从CStatusBar派生的CWzdStatusBar把新的控件该类中 使用ClassWizard给该类添加一个WM_CRETE消息处理函数,在该函数中创建这些插intCWzdStatusBar::OnCreaPCREATESTRUCT{if(CStatusBar::OnCreapCreateStruct)==-1)return-1;CRectrect(0,0,0,0);CFont*pFont=CFont::FromHandle((HFONT)::return}可以看到,这些控件窗口创建时的初始大小为0×0,因此,无论如何必须在创建后立即修用ClassWizard添加一个WM_SIZE消息处理函数到该类中,在那里为新的控件指定位voidCWzdStatusBar::OnSize(UINype,intcx,int{CStatusBar::OnSize(nType,cx,UINTinx;CRectrect;} mandToIndex()确定新控件将要占据的空间的索引,然后用CStatusBar::GetItemRect()获得那空间的尺寸,并用CWnd::MoveWindow()把控件窗口移到在CMainFrameprotected://controlbarembeddedmembers m_wndStatusBar;<<< 按钮控件把它令消息发

温馨提示

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

评论

0/150

提交评论