




已阅读5页,还剩55页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 菜单 菜单是重要的用户界面对象 用户通常从菜单栏中选择命令来使用应用程序 Windows98支持三种类型的菜单 1 菜单栏 主菜单 菜单栏横放在窗口的顶部 2 弹出式子菜单 弹出式菜单是从主菜单下弹出的菜单 3 上下文菜单 通过鼠标右键弹出的自由浮动菜单 2 1 菜单的机制与功能 菜单可以用多种方法创建 一般存在在资源脚本中 在程序运行时才调入 就像其他资源一样 1 1菜单消息菜单被选中时发送消息给Windows 再由Windows传送给应用程序的消息映像 Win32API提供4个菜单消息 但在MFC消息映像中 只有两个菜单消息WM COMMAND和ON UPDATE COMMAND UI MFC自动处理其他两个消息 3 1 处理WM COMMAND消息用户选中了菜单项会产生WM COMMAND消息MFC的框架窗口类要确保每一个菜单项都有WM COMMAND消息的处理函数 对缺少处理函数的菜单项 MFC使其变灰 消息映射ON COMMAND项采用以下形式 ON COMMAND MenuID ClassMethod MenuID是菜单项的标识符 ClassMethod是处理菜单项WM COMMAND消息定义的方法 命令处理函数 4 2 处理UPDATE COMMAND UI消息在许多情况下菜单项可能有多个状态 例如某一个时刻可用 正常 而某一个时刻不可用 菜单变灰 菜单项可以加注标记 以表明被选中或未被选中 UPDATE COMMAND UI是MFC所特有的 如果想根据应用程序的当前状态激活或者使菜单项无效 或者在程序运行的某一刻反映菜单项的可用性 就要由自己处理这条消息 此消息和Win32API的WM INITPOPUPMENU消息相对应 ON UPDATE COMMAND UI项采用以下形式 ON UPDATE COMMAND UI MenuID ClassMethod MenuID是菜单项的标识符 ClassMethod是处理菜单UPDATE COMMAND UI消息定义的方法 更新处理函数 5 该消息值适合弹出式菜单项的菜单项 而对于顶层菜单项则不适用 例如不能使用该消息来禁止 文件 菜单项 如果菜单项有更新处理函数 那么它被调用进行更新 如果没有 那么框架检查命令处理函数是否存在 若不存在 则使菜单变灰 必须提供一个菜单处理函数或更新函数 6 1 2基于菜单栏的程序设计1Menuitem程序为一个单文档的应用程序 程序启动后 单击 graph 菜单中的 rectangle 则在当前的客户区中显示一个矩形 单击 graph 菜单中的 Ellipse 则在当前的客户区中显示一个椭圆 1 利用AppWizard 生成一个MFC的单文档工程 Menuitem 2 单击 Workspace 窗口的 ResourceView 标签 找到 Menu 项 双击 ID MAINFRAME 对菜单资源进行编辑 用右键单击菜单项最右边的虚线框 在弹出式菜单中选择 Propertis 命令 在 MenuItemProperties 窗体中在 Caption 一栏中输入 graph 7 用同样方法 设计其下的两个菜单项 第一个子菜单项 ID 为 ID GRAPH REC Caption 为 Rectangle 第二个子菜单项 ID 为 ID GRAPH ELLIPSE Caption 为 Ellipse 3 在 CMenuitemView 类中加入一些数据成员 public boolm rectangle boolm ellipse COLORREFm crbk 8 4 编辑 MenuitemView cpp 文件中的构造函数 初始化数据成员 加入下面代码 CMenuitemView CMenuitemView m rectangle TRUE m ellipse FALSE m crbk RGB 255 0 0 5 利用ClassWizard为视图类加入命令消息控制函数及更新命令UI消息控制函数 9 6 编辑 MenuitemView cpp 文件里的菜单命令控制函数 OnGraphRec函数用m crbk颜色来填充客户区矩形 并设置布尔型变量m rectangle m ellipse的值 10 VoidCMenuitemView OnGraphRec CClientDCdc this CPennewpen oldpen newpen CreatePen PS SOLID 2 RGB 255 255 0 oldpen dc SelectObject 11 对应的更新命令UI控制函数OnUpdateGraphRec根据变量m rectangle的值来控制菜单的有效性状态 决定菜单项 rectangle 什么时候有效 voidCMenuitemView OnUpdateGraphRec CCmdUI pCmdUI pCmdUI Enable m rectangle 12 OnGraphEllipse函数用m crbk颜色来填充客户区 并设置布尔型变量m ellipse m rectangle的值 VoidCMenuitemView OnGraphEllipse CClientDCdc this CPennewpen oldpen newpen CreatePen PS SOLID 2 RGB 255 255 0 oldpen dc SelectObject 13 m rectangle TRUE m ellipse FALSE dc SelectObject pOldBrush dc SelectObject oldpen deletepNewBrush 14 对应的更新命令UI控制函数OnUpdateGraphEllipse 根据变量m ellipse的值来控制菜单的有效性状态 决定菜单项 ellipse 什么时候有效voidCMenuitemView OnUpdateGraphEllipse CCmdUI pCmdUI pCmdUI Enable m ellipse 15 1 3菜单消息的处理路径 MFC中拥有菜单的框架窗口不必处理每一个菜单项的消息 相反 菜单消息可由拥有这个菜单命令资源的其他对象来处理 例如 CCmdTarget派生类对象 如窗口和视窗 以及应用对象 由CWinApp派生 对于支持文档 视窗架构的应用程序 文档对象和视窗对象也能处理菜单消息 尽管任何由CCmdTarget派生的类对象都能接受菜单消息 但并不是所有这类对象都可以同时接收到菜单消息 菜单消息是按照一定的路径传送的 下表列出了当MFC发送命令消息给非文档 视窗结构的应用 单文档应用以及多文档应用时 查找消息映射表的次序 16 查找消息映射表的次序 17 应用程序收到一个菜单命令时 它按照一定的顺序传递该命令 该顺序依次为 视窗类 文档类 主框架类和应用类 首先是视窗类获得处理该命令的机会 然后是文档类 再接着是主框架类 最后是应用类 如果某个类没有相应的菜单命令 则该命令返回给上一个类处理 直到返回到应用类 如果其中有一个类处理了该命令 则直接返回系统 其他类就没有机会再处理了 18 1 4弹出式菜单 浮动的弹出式菜单是一种新的用户界面设计风格 用户按下鼠标右键 然后就会弹出一个浮动菜单 用资源编辑器和MFC库的CMenu TrackPopupMenu函数可以创建弹出式菜单 该函数的原型 BOOLTrackPopupMenu UNITnFlags intx inty CWnd pWnd LPCRECTlpRct NULL 其中参数nFlags为弹出式菜单的标志 例如若其值为TPM RIGHTALIGN 表示创建的弹出式浮动菜单 其右边界位于X处 若其值为TPM LEFTALIGN 表示其左边界位于X处 参数X与Y表示屏幕坐标 19 1 浮动菜单的创建 创建菜单对象需要两步 第一步 分配一个C 对象 第二部 初始化该对象 下面为创建并初始化一个CMenu类对象的典型代码 为浮动菜单申请一个对象空间CMenupContexMenu 初始化CMenu对象pContexMenu LoadMenu IDR MENU1 20 2 浮动菜单的显示 浮动菜单创建和初始化后 在用户单击了鼠标右键时显示 下面的WM RBUTTONDOWN消息处理函数就可以显示出上面例子中的浮动菜单 voidMyMainFrame OnRButtonDown UNITnFlags CPointpoint 首先将客户区坐标转换成屏幕坐标ClientToScreen 21 1 5弹出式菜单设计 按照如下步骤创建弹出式菜单 1 选择 Insert Resource 菜单命令 将弹出 InsertResource 窗体 选中 Menu 选项 然后单击 New 将产生一个空的 ID MENU1 菜单 2 双击选择 IDR MAINFRAME 菜单 然后右键单击 graph 菜单项 在弹出式菜单中选择 Copy 命令 3 双击选择 ID MENU1 菜单 右键单击第一个空的菜单 在弹出菜单中选择 Paste 命令 将产生一个菜单项 22 4 用ClassWizard在视图类中加入WM RBUTTONDOWN消息控制函数 然后加入程序代码如下 voidCTest1View OnRButtonDown UINTnFlags CPointpoint CMenumenu menu LoadMenu IDR MENU1 ClientToScreen 5 编译运行程序 在运行的窗口中 右键单击 即可显示出弹出式菜单 并执行相应的命令 23 2 CMenu类 2 1CMenu类简介MFC是靠CMenu来管理菜单的 CMenu对象可以代表每个Windows菜单 其中包括顶级菜单项以及与之相关联的弹出式菜单 当窗口的Create或LoadFrame函数被调用的时候 菜单的资源是直接附加到框架窗口的 CWnd成员函数GetMenu返回一个临时CMenu指针 利用该指针 可以自由地访问和更新菜单对象 ID MAINFRAME是标识资源脚本中的初始菜单 如果想在应用程序启动之后想要第二个菜单 可以使用菜单编辑器创建一个具有自己的资源ID的菜单资源 然后在程序中构造一个CMenu对象 使用CWnd LoadMenu函数从这个资源中加载菜单 调用CWnd SetMenu函数将新菜单附加到框架窗口 然后调用Detach成员函数来分离该对象的HMENU句柄 这样当CMenu对象超出范围的时候 菜单就不会被破坏了 24 菜单对象实际上是由一个子菜单的嵌套结构组成的 可以使用GetSubMenu成员函数来获得指向包含在主CMenu对象的弹出式菜单的指针 CMenu GetMenuString函数返回对应于基于0的索引或命令ID的菜单项字符串 如果使用的是命令ID选项 那么菜单连同任何子菜单一起被搜索 25 2 2动态改变菜单 有时需要在运行时为响应程序状态的改变而频繁地动态增加或删除菜单项 在运行时为响应出现的状态而改变的菜单项称为动态菜单 动态菜单的好处是它给用户提供了一套适合于程序当前状态的选项列表 26 1 获得菜单的指针增加或删除一个菜单时 需要菜单的指针 为获得菜单的指针 应使用GetMenu 函数 CMenu CWnd GetMenu const如果CWnd对象没有菜单 则返回值为NULL 如果CWnd对象是一个子窗口 则返回值是无意义的 该函数返回的指针是临时性的 不要把它保存下来长期使用 给出窗口的主菜单的指针后 就可以使用GetSubMenu 函数来简单地获得包含在主菜单内的弹出式子菜单的指针 该函数的原型如下 27 CMenu GetSubMenu intnPos const 该函数用于获得一个弹出式菜单的CMenu对象的指针 若指定位置有一个弹出式菜单 则返回一个指向CMenu对象的指针 该对象的m hMenu成员包含弹出菜单的指针 否则返回NULL 若CMenu对象不存在 则生成一个模板 CMenu指针将被保留 在获得菜单的指针后 就可以为菜单添加或删除菜单项了 28 2 给菜单中增加菜单项为了在运行时给菜单增加菜单项 应当使用InsertMenu 函数 该函数的原型如下 BOOLInsertMenu UINTnPosition UNITnFlags UNITnIDNewItem 0 LPCTSTRlpszNewItem NULL BOOLInsertMenu UNITnPosition NUITnFlags UNITnIDNewItem constCBitmap pBmp 该函数用于向一个菜单中nPosition指定的位置处插入一个菜单 并把其他项向后移 其应用程序可以用对nFlags赋值的办法设置此菜单项的状态 nIDNewItem指定插入菜单项的ID值 LpszNewItem指定菜单项的显示文本只要当窗口中的菜单发生了变化 无论窗口是否显示 时 就要调用CWnd DrawMenuBar 函数 第二种形式的InsertMenu 函数的pBmp指定图形菜单项所用的位图 29 3 删除菜单项为了删除菜单项 应当使用DeleteMenu 函数 该函数原型如下所示 BOOLDeleteMenu UNITnPosition UNITnFlags 若菜单项有一隶属弹出式菜单时 DeleteMenu将破坏该弹出式菜单 释放由此弹出菜单所占用的内存 30 4 获得菜单的菜单项数在动态处理菜单时 需要频繁地知道一个菜单中有多少菜单项 为了获得菜单项的数目 应当使用如下的GetmenuItemCont 函数 CMenu GetMenuItemCountUINTGetMenuItemCount const该函数确定顶层或弹出式菜单项的项数 31 5 使菜单项有效或无效有时候 一些菜单项只适用于某些状态 而不适用于其他的状态 在这种情况下 需要使之暂时无效 之后再使其有效 为此可使用EnableMenuItem 函数 CMenu EnableMenuItemUNITEnableMenuItem UNITnIDEnableItem UNITnEnable 该函数可以设置菜单项 使菜单项可用 禁止或变灰 nIDEnableItem确定要改动的菜单项 该函数调用成功时 返回先前的状态 MF DISSABLED MF ENABLE或MF GRAYED 调用失败时返回 1 32 2 3动态菜单设计 菜单既可以从资源模板中加载 也可以在程序中通过动态方式进行创建 本节将通过在graph菜单项下动态增加三个子菜单项 来改变显示区的背景颜色 具体方法如下 1 选择菜单项 View ResourceSymbols New 在 Name 文本编辑框中输入 ID COLOR1 系统自动子在 Value 框中加入一个值 单击 OK 关闭 NewSymbol 用同样方法 加入 ID COLOR2 ID COLOR3 的定义 2 在视图类中加入OnInitialUpdate函数 加入程序代码如下 33 CMenu pColorMenu NULL CMenu pTopMenu AfxGetMainWnd GetMenu intiPos iPos pTopMenu GetMenuItemCount 1 pColorMenu pTopMenu GetSubMenu iPos pColorMenu AppendMenu MF STRING ID COLOR1 White pColorMenu AppendMenu MF STRING ID COLOR2 Purple pColorMenu AppendMenu MF STRING ID COLOR3 Blue 该程序代码首先获得指向框架窗口菜单的指针 然后获得指向graph菜单的指针 然后通过AppendMenu 函数来增加3个菜单项 34 3 用ClassWizard在视图中加入 OnCmdMsg 然后加入程序代码如下 BOOLCTest1View OnCmdMsg UINTnID intnCode void pExtra AFX CMDHANDLERINFO pHandlerInfo if pHandlerInfo NULL if nID ID COLOR1 if nCode CN COMMAND DoSelectColor 0 elseif nCode CN UPDATE COMMAND UI DoUpdateSelectColor 0 CCmdUI pExtra returnTRUE 35 elseif nID ID COLOR2 if nCode CN COMMAND DoSelectColor 1 elseif nCode CN UPDATE COMMAND UI DoUpdateSelectColor 1 CCmdUI pExtra returnTRUE elseif nID ID COLOR3 if nCode CN COMMAND DoSelectColor 2 elseif nCode CN UPDATE COMMAND UI DoUpdateSelectColor 2 CCmdUI pExtra returnTRUE returnCView OnCmdMsg nID nCod pExtra pHandlerInfo 36 该函数用于传递3个菜单命令的WM COMMAND和UPDATE COMMAND UI消息到函数DoSelectColor i DoUpdateSelectColor i CCmdUI pExtra 6 右键点 CmenuitemView 类 在弹出的窗口里选择 AddMenmberFunction 菜单项 在 AddMenmberFunction 窗口的 FunctionType 框中输入 void 在 FunctionDeclaration 框中输入 DoSelectColor intiColor 其余接受缺省设置 用同样方式设置DoUpdateSelectColor intiColor CCmdUI pCmdUI 函数 设置完成后 加入下面代码 37 VoidCMenuitemView DoSelectColor intiColor ASSERT iColor 0 函数设置成员变量m crbk的值 并调用相应函数显示 38 VoidCMenuitemView DoUpdateSelectColor intiColor CCmdUI pCmdUI ASSERT iColor 0 该函数更新相应菜单项设置 7 编译运行该应用程序 然后分别测试3个颜色菜单项是否满足要求 39 工具栏 40 工具栏是一系列工具按钮的组合 借助它们可以提高用户的工作效率 VC6 0系统保存了每个工具栏相应的位图 其中包括所有按钮的图像 它们具有相同的尺寸 高15像素 宽16像素 它们在位图中的排列次序与屏幕上按钮在工具栏上的次序相同 41 1使用工具栏编辑器 选择菜单 文件 打开工作区 将前面的单文档应用程序调入 在项目工作区窗口中选择ResourceView页面 双击 Toolbar 项中的IDR MAINFRAME则工具栏编辑器出现在主界面的右边 空按钮 图形工具箱 颜色工具箱 42 1使用工具栏编辑器 1 1创建一个新的工具栏按钮在新建的工具栏中 最右端总有一个空按钮 双击该按钮弹出其属性对话框 在ID框中输入其标识符名称 其右端又出现一个新的空按钮 单击按钮 在资源编辑器的工具按钮设计窗口可以进行工具按钮的位图绘制 1 2移动一个按钮在工具栏中移动一个按钮 用鼠标左键点中它并拖动至相应位置即可 如果用户拖动它离开工具栏位置 则此按钮从工具栏中消失 若在移动一个按钮的同时 按下Ctrl键 则在新位置复制一个按钮 新位置可以是同一个工具栏中的其他位置 也可在不同的工具栏中 43 1使用工具栏编辑器 1 3删除一个按钮将选取中的按钮拖离工具栏 则该按钮就消失了 但若选中按钮后 单击Delete键并不能删除一个按钮 只是将按钮中的图形全部以背景色填充 44 1使用工具栏编辑器 1 4 在工具栏中插入空格在工具栏中插入空格有以下几种情况 如果按扭前没有任何空格 拖动该按钮向右移动并当覆盖相邻按钮的一半以上时 释放鼠标键 则此按钮前出现空格 如果按钮前有空格而按钮后没有空格 拖动该按钮向左移动并当按钮的左边界接触到前面按钮时 释放鼠标键 则此按钮后将出现空格 如果按钮前后均有空格 拖动该按钮向右移动并当接触到相邻按钮时 则此按钮前的空格保留 按钮后的空格消失 相反 拖动该按钮向左移动并当接触到前一个相邻按钮时 则此按钮前面的空格消失 后面的空格保留 45 1使用工具栏编辑器 1 5 工具栏按钮属性的设置双击某按钮弹出其属性对话框 如图所示 46 2工具按钮和菜单项相结合 工具按钮和菜单项相结合是指当选择工具按钮或菜单命令时 操作结果是一样的 结合的方法 在工具按钮的属性对话框中将按钮的ID号设置为相关联的菜单项ID 例 在前面程序基础上 通过两个工具按钮分别显示主菜单IDR MAINFRAME和菜单IDR MENU1 1 打开前面的单文档应用程序 2 利用工具栏编辑器设计两个工具按钮 47 2工具按钮和菜单项相结合 3 双击刚才设计的第一个工具按钮 弹出该工具按钮的属性对话框 将该工具按钮的ID号设为ID TEST RETURN 在提示框内键入 返回应用程序主菜单 n返回主菜单 4 双击刚才设计的第二个工具按钮 弹出该工具按钮的属性对话框 将该工具按钮的ID号设为ID VEW TEST 在提示框内键入 显示测试菜单 n显示测试菜单 48 2工具按钮和菜单项相结合 5 编译运行并测试 程序运行后 将鼠标移至刚才设计的第一个工具按钮处 这时在状态栏上显示出 返回应用程序主菜单 信息 若稍等片刻会弹出提示小窗口 显示出 返回主菜单 字样 单击新添加的这两个按钮 会执行相应的菜单命令 49 3多个工具栏的使用 在用MFCAppWizard创建的文档应用程序中往往只有一个工具栏 但在实际应用中 常常需要多个工具栏 例 在前面程序基础上 当显示主菜单IDR MAINFRAME时 只显示MFCAppWizard创建的工具栏 当显示菜单IDR MENU1时 则只显示新添加的工具栏 1 在项目工作区的ResourceView页面中 展开Toolbar 工具栏 资源 用鼠标单击IDR MAINFRAME不松开 按下Ctrl键 移动鼠标将IDR MAINFRAME拖到Toolbar资源名称上 复制了工具栏默认资源IDR MAINFRAME 复制后的资源标识系统自动设为IDR MAINFRAME1 50 3多个工具栏的使用 2 右击工具栏资源IDR MAINFRAME1 从弹出的快捷菜单中选择Properties命令 如图所示 将ID设为IDR TOOLBAR1 3 双击IDR TOOLBAR1 打开工具栏资源 按图删除不要的工具按钮 51 3多个工具栏的使用 4 在CMainFrame类中添加一个成员变量m wndTestBar 变量类型为CToolBar CToolBar类封装了工具栏的操作 5 在CMainFrame OnCreate函数中添加工具栏创建代码 intCMainFrame OnCreate LPCREATESTRUCTlpCreateStruct if CFrameWnd OnCreate lpCreateStruct 1 return 1 52 3多个工具栏的使用 intnRes m wndTestBar CreateEx this TBSTYLE FLAT WS CHILD WS VISIBLE CBRS TOP CBRS GRIPPER CBRS TOOLTIPS CBRS FLYBY CBRS SIZE DYNAMIC CRect 0 0 0 0 AFX IDW TOOLBAR 10 if nRes m wndTestBar LoadToolBar IDR TOOLBAR1 TRACE0 Failedtocreatetoolbar n return 1 failtocreate 53 3多个工具栏的使用 m wndToolBar EnableDocking CBRS ALIGN ANY m wndTestBar EnableDocking CBRS ALIGN ANY EnableDocking CBRS ALIGN ANY DockControlBar EnableDocking是CWnd类成员函数 用来让工具栏或其他控制条在窗口进行停靠操作 参数CBRS ALIGN ANY表示可以停靠在窗口的任一边 DockControlBar是CFrameWnd类的成员函数 用来将指定的工具栏或其他控制条进行停靠 54 3多个工具栏的使用 CreateEx是CToolBar类的成员函数 用来创建一个工具栏对象 第1个参数用来指定工具栏所在的父窗口指针 this表示当前的CMainFrame类窗口指针 第2个参数用来指定工具按钮的风格 当为TBSTYLE FLAT时表示工具按钮是 平面的 第3个参数用来指定工具栏的风格 由于这里的工具栏是CMainFrame的子窗口 因此需要指定WS CHILD WS VISIBLE CBRS TOP表示工具栏放置在父窗口的顶部 CBRS GRIPPER表示工具栏前面有一个 把手 CBRS TOOLTIPS表示允许有工具提示 CBRS FLYBY表示在状态栏显示工具提示文本 CBRS SIZE DYNAMIC表示工具栏在浮动时 其大小是可以动态改变的 55 3多个工具栏的使用 第4个参数是用来指
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 金融衍生品市场创新与风险防范:2025年金融风险管理技术发展报告
- 2025年能源行业储能技术多元化在储能电站运营中的设备维护与成本优化报告
- 2025年生态保护修复资金申请与生态修复工程可持续发展研究报告
- 好天气坏天气课件
- 2025年中考数学一轮讲练测-章节综合训练六 圆(测试)(原卷版)
- 澳洲税务基础知识培训课件
- 澧县公共基础知识培训课件
- 2025短视频项目短视频IP授权与运营合作合同
- 2025版煤矿转让买卖居间合同(含安全生产标准)
- 二零二五年度办公室水电工程安全风险评估与节能改造合同
- EPC工程总承包招标
- 抗结核药物所致肝损伤
- 抗菌药物临床应用指导原则(2023年版)
- 城市道路工程设计规范-局部修订稿(完整资料)
- 神的《全备之救》
- GA 38-2021银行安全防范要求
- 第一章数字印刷概述课件
- 【医院管理】-科研创新助推学科建设课件
- 《卷烟原料配方设计》配套教学课件
- 介入诊疗质量安全计划与指标
- 新课标高考英语词汇表3500
评论
0/150
提交评论