第1章C图形开发基础ppt课件

上传人:hs****ma 文档编号:568829800 上传时间:2024-07-27 格式:PPT 页数:49 大小:3.15MB
返回 下载 相关 举报
第1章C图形开发基础ppt课件_第1页
第1页 / 共49页
第1章C图形开发基础ppt课件_第2页
第2页 / 共49页
第1章C图形开发基础ppt课件_第3页
第3页 / 共49页
第1章C图形开发基础ppt课件_第4页
第4页 / 共49页
第1章C图形开发基础ppt课件_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《第1章C图形开发基础ppt课件》由会员分享,可在线阅读,更多相关《第1章C图形开发基础ppt课件(49页珍藏版)》请在金锄头文库上搜索。

1、第第1章章 C#图形开发基础图形开发基础1.1 Windows图形图形1.2 C#图形开发基础图形开发基础1.3 C#画图初步画图初步1.1 Windows图形图形1.1.1图形子系统基本原理图形子系统基本原理Windows操作系统中包含了一个图形子系统,专门用于管理各种图形输出设备,包括显示器,打印机,绘图仪等。由于Windows系统启用保护模式,应用程序没有权限直接访问计算机硬件,因此都必须调用Windows的图形子系统来操作图形设备。图1.1所示的就是Windows环境下图形软件的基本原理。1.1.1图形子系统基本原理图形子系统基本原理计算机中打开“控制面板”,打开其中的“显示”项目,在

2、“显示 属性”对话框中切换到“设置”标签页,点击其中的“高级”按钮,则能显示“监视器”的属性对话框,切换到“监视器”标签页,则显示如图1.2所示的设置,可以看到“屏幕刷新频率”的设置。1.1.2图形设备上下文图形设备上下文1. 句柄句柄对Windows编程有所了解的读者应该知道,Windows API是一个个C语言样式的函数,应用程序访问大部分的操作系统资源是通过一种叫句柄的整数类型数据。2. 图形设备上下文句柄图形设备上下文句柄应用软件进行图形操作时也得使用API函数申请一个图形设备上下文句柄,以后所有的图形操作都是针对这个句柄来进行的,应用软件完成图形操作后一定要使用API释放这个图形设备

3、上下文句柄。3. 软件设计模式软件设计模式这种抽象概念应用到不同的具体应用,是一种软件设计模式。比如在C#中有一个抽象类“System.IO.Stream”, 它表示一个抽象的流的概念,而.NET框架中在这个抽象概念的流上面实现了各种具体的流,比如针对文件,HTTP资源,内存等等。1.1.3用户界面事件用户界面事件1. 窗体重绘事件窗体重绘事件如图1.3所示,窗体2覆盖了窗体1,此时我的控件有一部分被覆盖了,当用户设置了窗体1靠前显示时,我的控件原先被窗体2覆盖的部分给显示出来了,此时形成了一个剪切矩形,程序需要重新绘制我的控件的用户界面,1.1.3用户界面事件用户界面事件2. NET用户界面

4、事件原理用户界面事件原理计算机用户经常操作鼠标和键盘来试图干涉和控制应用程序的运行。而应用程序需要感知鼠标和键盘的状态来响应用户的操作意图。此时开发人员需要进行鼠标和键盘事件处理。图1.4所示的是.NET应用程序处理鼠标和键盘事件的原理图。1.1.3用户界面事件用户界面事件3. 鼠标事件鼠标事件开发人员需要响应控件的鼠标事件,此时需要绑定控件的MouseDown事件或重写OnMouseDown方法来处理鼠标按键按下事件,绑定控件的MouseMove事件或重写OnMouseMove方法来处理鼠标移动事件,绑定控件的MouseUp事件或重写OnMouseUp方法来处理鼠标按键松开事件,绑定控件的M

5、ouseWheel事件或重写OnMouseWheel方法来处理鼠标滚轮事件。4. 键盘事件键盘事件用户也经常要求能使用键盘来进行操作,比如对于文本编辑器,用户需要使用键盘来输入大量的文本字符,移动光标等等。5. 其他事件其他事件在C#中开发人员还可以处理其他的事件,比如开发人员可以在窗体中放置了一个定时器控件,则可以处理它的定时器事件来固定的每隔一段时间进行操作。用户从Windows资源管理器中拖拽一个文件到应用程序界面上时,开发人员可以响应控件的OLE拖拽事件来接受拖拽过来的文件的数据。1.1.4图形用户界面闪烁图形用户界面闪烁假设显卡刷新频率是50HZ,也就是每20毫秒读取显存刷新屏幕。有

6、一个程序,中间显示了一张图片,先由于某种原因,程序需要重新绘制用户界面。于是经历了以下绘制过程:(1) 第0毫秒,马上要绘制图片了,显卡刷新屏幕,如图1.5所示。1.1.4图形用户界面闪烁图形用户界面闪烁(2) 第20毫秒,绘制了白色背景,显卡刷新屏幕,如图1.6所示。1.1.4图形用户界面闪烁图形用户界面闪烁(3) 第40毫秒,绘制了一半,显卡刷新屏幕,如图1.7所示。1.1.4图形用户界面闪烁图形用户界面闪烁(4) 第60毫秒,终于绘制完成了,显卡刷新屏幕,如图1.8所示。1.1.4图形用户界面闪烁图形用户界面闪烁1. 剪切矩形技术剪切矩形技术应用程序受操作系统的请求而绘制用户界面,此时应

7、用程序会从操作系统获得一个剪切矩形,该矩形说明了用户界面需要重新绘制的区域,很多时候应用程序不需要重新绘制整个的用户界面,而是只要绘制其中的某个部分即可维护用户界面的完整性,而从操作系统获得的剪切矩形就指明了要绘制的区域。2. 脏矩形技术脏矩形技术脏矩形技术是用于主动触发重绘的,当应用程序根据状态需要重新绘制用户界面时,大部分情况下是无需重新绘制整个用户界面即可完成功能,此时需要计算出一个尽可能小的矩形区域,只有该区域中的用户界面是“脏”的,需要重新绘制,而后告诉操作系统在未来的绘制用户界面的时候使用该脏矩形作为剪切矩形。1.1.4图形用户界面闪烁图形用户界面闪烁3. 双缓存技术双缓存技术双缓

8、冲技术是解决用户界面闪烁的最方便可靠的方法。闪烁是应用程序绘制用户界面过程缓慢而造成的,但并不是应用程序所有的软件模块运行缓慢就造成闪烁,仅仅是绘图过程缓慢才造成闪烁。1.2 C#图形开发基础1.2.1 GDI+概述概述利用.NET框架所提供的GDI+(Graphics Device Interface Plus)类库,可以很容易绘制各种图形,包括绘直线和形状、处理位图图像和各种图像文件(bmp、jpg、ico、gif、wmf等),还可以显示各种风格的文字。GDI+类库最早出现在Windows 2000中,现在已成为.NET框架的重要组成部分。GDI+包括一系列处理图形、文字和图像的类,它提供

9、了二维图形绘制、图像处理的大量功能,但不包括三维图形处理功能,要处理三维图形,仍然需要通过COM接口调用DirectX类库来完成。1.2.2 矢量图和位图矢量图和位图对于计算机来说,矢量图处理复杂,但数据量小,可无级缩放;而位图显示过程简单,存储格式简单,但数据量大,而且放大时显示效果差,会出现锯齿。例如在记事本中输入文本“C# Discovery”,采用不同的字体,其显示的文字效果也不同,如表1.1所示。字体字体显示结果显示结果大小为12的Fixedsys大小为40的Fixedsys大小为12的宋体大小为40的宋体1.2.3 图形坐标系统图形坐标系统图形中每个图形元素都由若干个(X,Y)坐标

10、值和宽度高度值来确定。比如一个点用一对(X,Y)值来确定位置,而一个线段用两个(X,Y)值来定位,而矩形用一个(X,Y)值以及宽度高度值来定位,而圆或椭圆则用一个外切矩形来确定。不同于数学上的坐标系左边,计算机系统中,坐标系是以左上点为原点的,X轴朝右,Y轴朝下,如图1.9所示。YX(0,0)1.2.3 图形坐标系统图形坐标系统2像素像素像素度量单位是和图形硬件相关的,图形显示设备具有一个DPI的参数,也就是一英寸所包含的设备像素个数。在显示器属性对话框中可以看到显示器的PDI设置,如图1.10所示。1.2.3 图形坐标系统图形坐标系统像素是光栅设备可以显示的最小单位。对单色设备来说,每个像素

11、可以用一位(比特)表示,而对彩色设备,每个像素必须用多个位表示,位数越多,所表示的颜色越丰富,表1.2列出了部分设备中每个像素的位数及颜色数:像素位数像素位数颜色数颜色数典型设备典型设备12单色显示器、打印机416标准VGA8256256色VGA1632768或6553532K或64K色VGA2422424位真彩色设备3223232位真彩色设备1.2.3 图形坐标系统图形坐标系统3坐标转换坐标转换坐标系还可以转换,转换类型主要有平移、旋转和缩放。平移是指坐标原点(X和Y值都为0的点)上下左右移动,而坐标度量单位等属性不改变;旋转是指坐标系整体的以原点为中心,顺时针旋转一定的角度;而缩放则是将X

12、轴或Y轴方向进行缩小或放大,X方向和Y方向的缩放可以是独立的。4 图形界面基本元素图形界面基本元素实际图形开发中,主要的图形界面基本元素有文本,直线段,矩形,椭圆(包括正圆),椭圆弧(包括圆弧),还有一些其他曲线。基本的绘图操作有绘制线条和填充区域。1.2.4 图形开发基本原理图形开发基本原理1. 画布画布通过计算机软件,计算机系统还可以征用一大块内存创建一个二维数组来构造出一个画布对象。比如可以征用1024*768*4= 3145728字节的内存,也就是3MB的内存来模拟一个1024*768的画布。2. 画笔画笔计算机系统中定义一个画笔概念,它具有颜色、线条粗细、线条样式等属性。用于绘制一条

13、线段,或者沿着某条路径来描线。3. 画刷画刷计算机系统中定义了一个画刷概念,它具有颜色等属性,用于填充某块区域。计算机会计算出需要填充区域的像素区间,然后批量地设置区间中的像素的值为画刷的值。1.2.4 图形开发基本原理图形开发基本原理4. 颜色颜色图1.11所示的是RGB色彩模式原理图。红、绿、蓝三个分量组成一个颜色矩阵。最上面为白色,最下面为黑色。1.2.4 图形开发基本原理图形开发基本原理5. 度量度量在计算机图形开发中也存在度量,最简单的就是以像素为度量单位,而像素的大小和图形显示设备相关。比如长度为100个像素的线段,在屏幕上显示大致为2.6厘米,但打印时却只有1厘米甚至更短。因此像

14、素是一种和图形设备相关的度量单位,在使用不同的图形设备时需要进行度量单位的转换。1.2.5 C#图形开发基础图形开发基础.NET平台也能较好地处理测量图形的度量问题,枚举“System.Drawing.GraphicsUnit”就列出了一些标准的坐标度量单位。“GraphicsUnit”枚举列出的项目如表1.3所示。成成 员员描描 述述Display指定显示设备的度量单位。通常,视频显示使用的单位是像素;打印机使用的单位是 1/100 英寸。Document将文档单位(1/300 英寸)指定为度量单位。Inch将英寸指定为度量单位。Millimeter将毫米指定为度量单位。Pixel将设备像素

15、指定为度量单位。Point将打印机点(1/72 英寸)指定为度量单位。World将世界坐标系单位指定为度量单位。1.3 C#画图初步画图初步1.3.1 画布画布1Paint事件事件在为窗体编写Paint 事件处理程序时,图形对象作为一个 PaintEventArgs类的实例提供。下面的代码引用 Paint 事件的 PaintEventArgs 中的 Graphics 对象:private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs pe) /*声明图形对象并把它设置为PaintEventArgs事件提供

16、的图形对象*/Graphics g = pe.Graphics;1.3.1 画布画布2CreateGraphics方法方法使用控件或窗体的CreateGraphics()方法获取对Graphics对象的引用,该对象表示这个控件或窗体的绘图表面。例如:Graphics g;g = this.CreateGraphics();/把g设为一个图形对象,来表示控件或窗体的绘图平面3Graphics.FromImage方法方法从Image类派生的任何对象创建图形对象,调用Graphics.FromImage()方法即可。例如:Bitmap myBitmap = new Bitmap(C:myPic.bm

17、p);Graphics g = Graphics.FromImage(myBitmap);Graphics类的常用属性和方法分别如表1.4和表1.5所示。1.3.2 画笔画笔画笔Pen类用于绘制直线和曲线,此类无法继承,在System.Drawing命名空间中。画笔可用于绘制线条、曲线以及勾勒形状轮廓。下面的代码创建一支基本的黑色画笔:Pen myPen = new Pen(Color.Black); /创建一个默认宽度为1的黑画笔Pen myPen = new Pen(Color.Black, 5); /创建一个宽度为5的黑画笔也可以通过已存在的刷子对象创建画笔。下面的代码创建基于已存在画刷

18、(名为 myBrush)的画笔:Pen myPen = new Pen(myBrush); /创建一个画笔,与myBrush有相同的属性,并且默认宽度为1Pen myPen = new Pen(myBrush, 5); /创建一个画笔,与myBrush有相同的属性,并且宽度为51.3.3 画刷画刷几种不同类型的画刷如表1.6所示。Brush 类类 的的 子子 类类说说 明明SolidBrush画笔的最简单形式,它用纯色进行绘制HatchBrush类似于SolidBrush,但是该类允许从大量预设的图案中选择绘制时要使用的图案,而不是纯色TextureBrush使用纹理(如图像)进行绘制Line

19、arGradientBrush使用渐变混合的两种颜色进行绘制PathGradientBrush基于开发人员定义的唯一路径,使用复杂的混合色渐变进行绘制1.3.3 画刷画刷【例例1.1】设计WinForm应用程序分别使用笔和画笔画出以坐标(30,30)和(130,30)为起点的长为70,高为50的矩形。 设计步骤:(1) 新建WinForm项目运行VS2008,依次展开菜单项“文件”“新建”“项目”,在弹出的“新建项目”对话框中选择“Windows窗体应用程序”,项目命名为“EX1_1”。(2) 添加控件并设置属性在Form1的设计视图中将此窗体调整到适当的大小并将 “Text”属性设为“画笔与

20、画刷”。从工具箱中拖放2个Button控件到窗体中,如图6.4布局控件。button1和button2的Text属性值分别设置为“画笔”和“画刷”。1.3.3 画刷画刷(3) 添加事件及及其事件代码分别双击“画笔”和“画刷”按钮,其事件代码如下所示: private void button1_Click(object sender, EventArgs e) Pen myPen = new Pen(Color.Black);/定义颜色为黑色的画笔 Graphics g = this.CreateGraphics();/创建Graphics对象 g.DrawRectangle(myPen,30,

21、30,70,50);/利用画笔画矩形 private void button2_Click(object sender, EventArgs e) Graphics g = this.CreateGraphics();/创建Graphics对象 SolidBrush mySBrush = new SolidBrush(Color.Red); /定义颜色为红色的刷子 g.FillRectangle(mySBrush, 130, 30, 70, 50);/利用刷子画矩形 1.3.3 画刷画刷(4) 运行程序分别单击“画笔”和“画刷”按钮,运行前后结果如图1.12所示。 1.3.4 颜色颜色1系统定

22、义的颜色系统定义的颜色可以通过 Color 结构访问若干系统定义的颜色。下面的语句将myColor分配给所指定名称的系统定义的红色。Color myColor = Color.Red;2用户定义的颜色用户定义的颜色可以使用 Color.FromArgb()方法创建用户定义的颜色,颜色用红色、蓝色和绿色的强度表示。下面的语句生成用户定义的颜色为略带蓝色的灰色。Color myColor= Color.FromArgb(23,56,78);1.3.4 颜色颜色3Alpha 混合处理(透明度)混合处理(透明度)Alpha 表示所呈现图形后面的对象透明度。Alpha 混合处理的颜色对于各种底纹和透明度

23、效果很有用。如果需要指定 Alpha 部分,则它应为 Color.FromArgb()方法中4个参数的第一个参数,并且是0255 之间的一个整数。例如:Color myColor = Color.FromArgb(127, 23, 56, 78);1.3.5 绘制直线绘制直线它主要用来绘制一条连接由坐标对指定的两个点的线条,其常用格式有以下两种:(1)绘制一条连接两个Point结构的线 Graphics g = this.CreateGraphics(); g.DrawLine(Pen myPen,Point pt1,Point pt2);(2)绘制一条连接由坐标对指定的两个点的线条 Grap

24、hics g = this.CreateGraphics(); g.DrawLine(Pen myPen,int x1,int y1,int x2,int y2);1.3.5 绘制直线绘制直线DrawLine方法中各参数及说明如表1.7所示。参参 数数说说 明明pen确定线条的颜色、宽度和样式xl第一个点的x坐标yl第一个点的y坐标x2第二个点的x坐标y2第二个点的y坐标1.3.5 绘制直线绘制直线【例例1.2】设计WinForm应用程序分别使用以上介绍的方法绘制直线。 设计步骤:(1) 新建WinForm项目新建WinForm项目并命名为“EX1_2”。(2) 添加控件并设置属性在Form1

25、的设计视图中将此窗体调整到适当的大小并将 “Text”属性设为“绘制直线”。从工具箱中拖放3个Button控件到窗体中。button1、button2和button3的Text属性值分别设置为“画横线”、“画竖线”和“画斜线”。(3) 添加事件及及其事件代码在窗体设计器中分别双击“画横线”、“画竖线”和“画斜线”按钮,代码所示。1.3.5 绘制直线绘制直线(4) 运行程序按【Ctrl+F5】组合键运行程序,分别单击“画横线”、“画竖线”和“画斜线”按钮,运行结果如图1.13所示。1.3.6 绘制矩形绘制矩形该方法为可重载方法,由坐标对、宽度和高度指定矩形,其常用格式有以下两种。(1) 绘制由R

26、ectangle结构指定的矩形Graphics g = this.CreateGraphics();g.DrawRectangle(Pen myPen,Rectangle rect);(2) 绘制由坐标对、宽度和高度指定的矩形 Graphics g = this.CreateGraphics(); g.DrawRectangle(Pen myPen, int x,int y, int width, int int height);DrawRectangle方法中各参数及说明如表1.8所示。参参 数数说说 明明myPen笔Pen的对象,确定矩形的颜色、宽度和样式x要绘制矩形的左上角的x坐标y要绘

27、制矩形的左上角的y坐标width要绘制矩形的宽度height要绘制矩形的高度1.3.6 绘制矩形绘制矩形【例例1.3】设计WinForm应用程序分别使用以上介绍的方法绘制矩形。设计步骤:(1) 新建WinForm项目新建WinForm项目并命名为“EX1_3”。(2) 添加控件并设置属性在Form1的设计视图中将此窗体调整到适当的大小并将 “Text”属性设为“绘制矩形”。从工具箱中拖放3个Button控件到窗体中。button1、button2和button3的Text属性值分别设置为“画矩形方法一”、“画矩形方法二”和“画实心矩形”。(3) 添加事件及及其事件代码在窗体设计器中分别双击“画

28、矩形方法一”、“画矩形方法二”和“画实心矩形”按钮,其事件代码所示。1.3.6 绘制矩形绘制矩形(4) 运行程序按【Ctrl+F5】组合键运行程序,分别单击三个按钮,运行结果如图1.14所示。1.3.7 绘制椭圆绘制椭圆该方法为可重载方法,椭圆绘制边界由Rectangle结构指定,其常用格式有以下两种。(1) 绘制边界由Rectangle结构指定的椭圆 Graphics g = this.CreateGraphics(); g.DrawEllipse(Pen myPen,Rectangle rect);(2) 绘制一个由边框(该边框由一对坐标、高度和宽度指定)指定的椭圆 Graphics g

29、= this.CreateGraphics(); g.DrawEllipse(Pen myPen,int x,int y,int width,int height);DrawEllipse方法中各参数及说明如表1.9所示。参参 数数说说 明明myPen确定曲线的颜色、宽度和样式x定义椭圆边框的左上角的x坐标y定义椭圆边框的左上角的y坐标width定义椭圆边框的宽度height定义椭圆边框的高度1.3.7 绘制椭圆绘制椭圆【例例1.4】设计WinForm应用程序分别使用以上介绍的方法绘制椭圆。设计步骤:(1) 新建WinForm项目新建WinForm项目并命名为“EX1_4”。(2) 添加控件并

30、设置属性在Form1的设计视图中将此窗体调整到适当的大小并将 “Text”属性设为“绘制椭圆”。从工具箱中拖放2个Button控件到窗体中。button1、button2和button3的Text属性值分别设置为“画椭圆方法一”、“画椭圆方法二”和“画实心椭圆”。(3) 添加事件及及其事件代码在窗体设计器中分别双击“画椭圆方法一”、“画椭圆方法二”和“画实心椭圆”按钮,其事件代码所示。1.3.7 绘制椭圆绘制椭圆(4) 运行程序按【Ctrl+F5】组合键运行程序,分别单击三个按钮,运行结果如图1.15所示。1.3.8 绘制圆弧绘制圆弧该方法为可重载方法。绘制一段弧线,其常用格式有以下两种。(1

31、)由Rectangle结构指定的椭圆的一部分绘制一段弧线 Graphics g = this.CreateGraphics(); g.DrawArc(Pen myPen, Rectangle rect, startAngle, sweepAngle);DrawArc方法中各参数及说明如表1.10所示。参参 数数说说 明明myPenPen对象,它确定弧线的颜色、宽度和样式rectRectangle结构,它定义椭圆的边界startAngle从x轴到弧线的起始点沿顺时针方向度量的角(以度为单位)sweepAngle从startAngle参数到弧线的结束点沿顺时针方向度量的角(以度为单位)1.3.8

32、绘制圆弧绘制圆弧(2)由一对坐标、宽度和高度指定的椭圆部分绘制一段弧线Graphics g = this.CreateGraphics(); g.DrawArc(Pen myPen, int x,int y,int width,int height, startAngle, sweepAngle);DrawArc方法中各参数及说明如表1.11所示。参参 数数说说 明明myPen确定弧线的颜色、宽度和样式x义椭圆边框的左上角的x坐标y定义椭圆边框的左上角的y坐标width定义椭圆边框的宽度height定义椭圆边框的高度startAngle从x轴到弧线的起始点沿顺时针方向度量的角(以度为单位)sw

33、eepAngle从startAngle参数到弧线的结束点沿顺时针方向度量的角(以度为单位)1.3.8 绘制圆弧绘制圆弧【例例1.5】设计WinForm应用程序分别使用以上介绍的方法绘制圆弧。设计步骤:(1) 新建WinForm项目新建WinForm项目并命名为“EX1_5”。(2) 添加控件并设置属性在Form1的设计视图中将此窗体调整到适当的大小并将 “Text”属性设为“绘制圆弧”。从工具箱中拖放2个Button控件到窗体中。button1和button2的Text属性值分别设置为“画圆弧方法一”和“画圆弧方法二”。(3) 添加事件及及其事件代码在窗体设计器中分别双击“画圆弧方法一”和“画

34、圆弧方法二”按钮,其事件代码所示。1.3.8 绘制圆弧绘制圆弧(4) 运行程序按【Ctrl+F5】组合键运行程序,分别单击三个按钮,运行结果如图1.16所示。1.3.9 绘制多边形绘制多边形其常用格式有以下两种:(1) 绘制由一组Point结构定义的多边形 Graphics g = this.CreateGraphics(); g.DrawPolygon (Pen myPen, Pointpoints);(2 ) 绘制由一组PointF结构定义的多边形Graphics g = this.CreateGraphics(); g.DrawPolygon (Pen myPen, PointFpoin

35、ts);1.3.9 绘制多边形绘制多边形【例例1.6】设计WinForm应用程序分别使用以上介绍的方法绘制多边形。设计步骤:(1) 新建WinForm项目新建WinForm项目并命名为“EX1_6”。(2) 添加控件并设置属性在Form1的设计视图中将此窗体调整到适当的大小并将 “Text”属性设为“绘制多边形”。从工具箱中拖放2个Button控件到窗体中。button1和button2的Text属性值分别设置为“绘制多边形方法一”和“绘制多边形方法二”。(3) 添加事件及及其事件代码分别双击“绘制多边形方法一”和“绘制多边形方法二”按钮,其事件代码所示。1.3.9 绘制多边形绘制多边形(4) 运行程序按【Ctrl+F5】组合键运行程序,分别单击“绘制多边形方法一”和“绘制多边形方法二”按钮,运行结果如图1.17所示。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号