第20章_基于组件的开发技术(zxq第3稿060316).doc_第1页
第20章_基于组件的开发技术(zxq第3稿060316).doc_第2页
第20章_基于组件的开发技术(zxq第3稿060316).doc_第3页
第20章_基于组件的开发技术(zxq第3稿060316).doc_第4页
第20章_基于组件的开发技术(zxq第3稿060316).doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1、第20章 基于组件的开发技术第20章 基于组件的开发技术 在软件开发领域,组件技术以前所未有的方式提高了软件产业的生产效率。由于组件技术的成熟,软件产业的形式也随之发生了很大的变化。很多相对较为专业但用途广泛的软件,几乎都以组件的形式组装和扩散到一般的软件产品中。 在VS2005中,已经提供了相当丰富的组件,包括具有界面功能的组件控件。常用的组件已经放到工具箱中,可以直接使用。但是有时也需要自己开发一些组件或控件,本章将简要介绍与此相关的技术和设计技巧。20.1 组件和控件 这一节主要介绍组件、控件以及特性的基本概念。1. 组件 在.NET Framework中,组件是指实现System.Co

2、mponentModel.IComponent接口的类,或从实现IComponent的类中直接或间接派生的类。在软件开发中,组件是指可重复使用并且可以和其他对象进行交互的对象。.NET Framework组件除了满足这些要求外,还提供了设计时支持,即作为组件的类可直接添加到VS2005工具箱中,也可将组件拖放到某个窗体上,并在设计界面上对组件进行操作。 从组件的概念可知,组件也是由类实现的,但一个类要成为组件,必须实现System.ComponentModel.IComponent接口,并提供一个没有参数的构造方法。在VS2005环境下开发的类,如果生成为.DLL后缀的文件,则这些类就自动变为

3、组件了。2. 控件 控件是提供或实现用户界面功能的组件。控件肯定是组件,但只有提供用户界面的组件才称之为控件。.NET Framework为控件提供两个基类:一个是System.Windows.Forms.Control,用于客户端Windows窗体控件;另一个是System.Web.UI.Control,用于ASP.NET服务器控件。.NET Framework类库中的所有控件直接或间接从这两个类派生。3. 特性 在.NET框架中,特性(Attribute)是一种标记,用于提供属性或方法的一些信息。在组件设计中,当需要在设计时显示控件及其成员时,就可以利用特性提供有价值的信息。 特性声明在方

4、括号中,在System.ComponentModel名称空间下定义了特性和事件的一组标准属性,当创建一个Windows窗体时,系统会自动在代码中添加对此名称空间的引用。 在属性声明的上方,可以直接声明特性,例如:/默认值DefaultValue(null)/属性窗口底部的描述以及其所在分组的分类名称Description(校验错误时的提示文本信息。), Category(验证)public string ErrorMessage get . set . 表20-1列出了部分特性。表20-1 .NET Framework提供的部分特性属性说明举例Browsable用一个布尔值指定某个属性或事件是

5、否显示在属性窗口中,默认为trueBrowsable(false)Bindable用一个布尔值指定将属性绑定到数据对可视化设计器是否有意义,默认为falseBindable(true)即则该属性可显示在“数据绑定”对话框中。Category指定在可视化设计器的属性浏览器中属性分在哪一类Category(外观) 表示属性浏览器在“外观”类别中显示该属性。Description当用户在属性窗口中选中该属性或事件时,显示在属性窗口底部的此属性的简短描述Description(设定渐变的起始色)DefaultValue指定属性的默认值。此值应与从属性访问器(getter)返回的默认值相同Default

6、Value(null)或DefaultValue()DefaultProperty指定组件的默认属性(Property)。在可视化设计器中,当在设计界面上单击控件时,属性浏览器通常突出显示此默认属性DefaultProperty(Text)DefaultEvent在可视化设计器中指定控件的默认事件DefaultEvent(Submit)Localizable指定本地化属性对可视化设计器是否有意义。对控件轮询可本地化的属性时,设计器会将此属性值保存到非特定于区域性的资源文件或其他本地化源中。Localizable(false|true)例如:Localizable (true),可视化设计器会在

7、对本地化资源进行序列化时包含该属性。ToolboxData指定ASP.NET类元素的格式字符串。如果在工具箱中双击控件或将其从工具箱拖动到设计界面上时,该字符串将成为控件的标记。ToolboxData() 例如: AspNetHostingPermission代码访问安全特性。该特性使JIT编译器检查链接到控件的代码是否具有AspNetHostingPermission权限。所有的公共ASP.NET类均使用此属性标记。应将AspNetHostingPermission特性应用于控件,以对部分受信任的被调用方进行安全检查。AspNetHostingPermission(SecurityActio

8、n.Demand,Level=AspNetHostingPermissionLevel.Minimal)或 AspNetHostingPermission(SecurityAction.InheritanceDemand,Level=AspNetHostingPermissionLevel.Minimal)20.2 组件的设计 在VS2005中,可以非常轻松的开发自定义组件,由于所有内容都封装在类中,所以也可以叫做类库。组件编译后生成的扩展名为DLL,它本身并不能单独运行。本节将通过简单的示例,让读者熟悉组件的开发和调用方法。20.2.1 组件设计的一般方法【例20-1】简单组件设计。 1)

9、在VS2005中,选择【新建项目】,在【项目类型】中选择【Visual C#项目】,在【模板】中选择【类库】,输入文件名TestComponent,选择相应保存路径,完成上述操作后单击【确定】,进入代码编辑窗口。 2) 将源代码改为如下内容。using System;using System.Collections.Generic;using System.Text;using System.Data;using System.Data.SqlClient;namespace TestComponent public class MyDataBase /返回表中记录数 public int G

10、etRecordCount(string connString, string tableName) int number = -1; SqlConnection conn = new SqlConnection(connString); SqlCommand command = new SqlCommand(select count(*) from + tableName, conn); try conn.Open(); number = (int)command.ExecuteScalar(); conn.Close(); catch (Exception err) throw new E

11、xception(err.Message); return number; /根据Select语句自动生成其他SQL语句 public void BuildAdapter(ref SqlDataAdapter adapter) SqlCommandBuilder builder = new SqlCommandBuilder(adapter); adapter.DeleteCommand = builder.GetDeleteCommand(); adapter.InsertCommand = builder.GetInsertCommand(); adapter.UpdateCommand

12、= builder.GetUpdateCommand(); 3) 单击【生成】菜单,选择【生成TestComponent】,即得到了TestComponent.dll组件,以后就可以通过引用使用该组件了。20.2.2 在Windows应用程序中调用设计的组件【例20-2】Windows应用程序中组件调用。 1) 新建一个Windows应用程序项目,向Form1设计窗体中拖放一个DataGridView控件和一个Label控件,调整为适当大小。 2) 鼠标右键单击【解决方案资源管理器】中的项目名,选择【添加】【添加现有项】,在弹出的窗体中选择添加的文件类型为“数据文件”,找到第8章例8-1创建的

13、项目文件夹,将MyDatabase.mdf添加到当前项目中,在【数据源配置向导】中,直接单击【完成】。 3) 选择【解决方案资源管理器】,右击【引用】,单击【添加引用】【浏览】,找到TestComponent.dll组件,然后单击【确定】。 4) 在Form1.cs类代码中添加下列名称空间引用。using System.Data.SqlClient; 5) 修改构造函数为下列内容。public Form1() InitializeComponent(); string connString = Properties.Settings.Default.MyDatabaseConnectionSt

14、ring; TestComponent.MyDataBase me = new TestComponent.MyDataBase(); label1.Text = 总记录数: + me.GetRecordCount(connString, MyTable2); SqlConnection conn = new SqlConnection(connString); SqlDataAdapter adapter = new SqlDataAdapter(select * from MyTable2, conn); me.BuildAdapter(ref adapter); DataSet ds =

15、 new DataSet(); adapter.Fill(ds, MyTable2); dataGridView1.DataSource = ds.TablesMyTable2; 在这段代码中,首先创建一个TestComponent.MyDataBase组件的实例,然后调用组件中提供的方法,在Label控件中显示数据表中记录数。同时,根据创建的SqlDataAdapter对象,从Select语句中自动生成Insert、Update、Delete语句。最后,在dataGridView1中显示数据表并提供编辑功能。运行结果如图20-1所示。图20-1 Windows应用程序中调用组件运行界面20.

16、2.3 在Web应用程序中调用设计的组件 在ASP.NET Web网站中调用组件和Windows应用程序中调用组件的方法非常相似,例20-3演示了在ASP.NET Web网站中调用TestComponent.dll的实现方法。【例20-3】Web应用程序中组件调用。 1) 新建一个ASP.NET Web网站,向Default.aspx页面设计窗体中拖放一个Label控件,一个GridView控件。 2) 鼠标右键单击【解决方案资源管理器】中的项目名,选择【添加】【添加现有项】,在弹出的窗体中选择添加的文件类型为“数据文件”,找到第8章例8-1创建的项目文件夹,将MyDatabase.mdf添加

17、到当前项目中。 3) 向设计界面中拖放一个SqlDataSource控件,选择【配置数据源】【新建连接】【浏览】找到刚刚添加的数据库MyDatabase.mdf,然后单击【确定】,并完成对表MyTable2的配置。 4) 选择【解决方案资源管理器】,右击网站项目名,选择【添加引用】【浏览】,找到TestComponent.dll组件,选择之,然后单击【确定】。 5) 在Default.aspx.cs代码中添加下列名称空间引用。using System.Data.SqlClient; 6) 修改Page_load代码为下列内容。protected void Page_Load(object se

18、nder, EventArgs e) string connString = ConfigurationManager.ConnectionStringsMyDatabaseConnectionString.ConnectionString; TestComponent.MyDataBase me = new TestComponent.MyDataBase(); this.Label1.Text = 总记录数: + me.GetRecordCount(connString, MyTable2); SqlConnection conn = new SqlConnection(connStrin

19、g); SqlDataAdapter adapter = new SqlDataAdapter(select * from MyTable2, conn); me.BuildAdapter(ref adapter); DataSet ds = new DataSet(); adapter.Fill(ds, MyTable2); GridView1.DataSource = ds.Tables0; GridView1.DataBind(); 运行,结果如图20-2所示。图20-2 网站中调用组件运行界面20.3 用户控件 控件提供了一种创建和重用自定义图形界面的方法,它本质上是具有可视化表示形式

20、的组件。控件有用户控件、扩展控件和自定义控件三种形式。对于Windows窗体,用户控件默认继承自System.Windows.Forms.UserControl;对于ASP.NET Web窗体,用户控件默认继承自System.Web.UI.UserControl。 用户控件适用于直接在窗口中添加系统自带的控件并为其编写相应的代码。实际上,用户控件是一种特殊的自定义控件。20.3.1 Windows用户控件 Windows用户控件包含一个或多个Windows窗体控件、组件或代码块,它们能够通过验证用户输入、修改显示属性或执行自定义的其他任务来扩展功能。可以按照与工具箱中控件相同的方式,将用户控件

21、置于Windows窗体中。【例20-4】设计一个Windows用户控件,该用户控件在Windows应用程序中完成与Web服务器控件RegularExpressionVlidator相似的验证功能。其中有一个文本框验证控件和一个标签控件。该控件自定义三个供公开使用的属性:RegexText、ErrorMessage和ValidationExpression。用户可以验证该控件的输入值RegexText是否匹配正则表达式指定的模式ValidationExpression。 1) 运行VS2005,选择【新建项目】。在【模板】中选择【Windows控件库】,然后修改项目名为RegexValidato

22、r。 修改相应保存路径,按【确定】按钮,则系统默认有一个UserControl1用户控件,右击UserControl1.cs,将其重命名为RegexValidator.cs。 2) 设计如图20-3所示的画面。图20-3 用户控件设计界面textRegexTextMode:SingleLineText:空labelRegexForeColor:RedText:空 3) 程序代码如下:using System;using System.Collections.Generic;using System.ComponentModel;using System.Drawing;using System

23、.Data;using System.Text;using System.Windows.Forms;using System.Text.RegularExpressions;namespace RegexValidator public partial class RegexValidator : UserControl private string validationExpression; /属性RegexText的定义,归类到“验证”分组 Description(与控件关联的文本信息。),Category(验证) public string RegexText get return t

24、extBoxRegex.Text; set textBoxRegex.Text = value; /属性ErrorMessage的定义,归类到“验证”分组 Description(校验错误时的文本提示信息。), Category(验证) public string ErrorMessage get return labelRegex.Text; set labelRegex.Text = value; /属性ValidationExpression的定义,归类到“验证”分组 DefaultValue(null) Description(指定验证时的正则表达式。), Category(验证) p

25、ublic string ValidationExpression get return validationExpression; set try Regex r = new Regex(value); validationExpression = value; catch MessageBox.Show(this,正则表达式语法错误!,错误, MessageBoxButtons.OK, MessageBoxIcon.Warning); validationExpression = null; public RegexValidator() InitializeComponent(); /当

26、焦点从文本框离开时执行的验证操作 private void textBoxRegex_Leave(object sender, EventArgs e) labelRegex.Visible = !Regex.IsMatch(textBoxRegex.Text, validationExpression); if (labelRegex.Visible) MessageBox.Show(请按要求输入, , MessageBoxButtons.OK, MessageBoxIcon.Hand); textBoxRegex.Focus(); else MessageBox.Show(注册验证成功,

27、, MessageBoxButtons.OK, MessageBoxIcon.Warning); 3) 运行程序,在对应的用户控件测试容器中测试生成的RegexValidator控件,直到满足要求。 4) 选择菜单的【生成】【生成解决方案】,生成用户控件RegexValidator.dll。 5) 新建一个Windows应用程序,在工具箱中新建一个名为“验证控件”的选项卡,鼠标右击该选项卡,选择【选择项】【.NET Framework组件】【浏览】找到生成的用户控件RegexValidator.dll,添加到工具箱。 6) 拖放RegexValidator控件到Windows窗体上,按照定义分

28、别设置属性框中自定义分组【验证】里的三个属性的值(RegexText、ErrorMessage和ValidationExpression),然后运行程序,查看结果。20.3.2 ASP.NET Web用户控件 ASP.NET Web用户控件是能够在其中放置标记和Web服务器控件的容器。可以将Web用户控件作为一个单元对待,为其定义属性和方法。 ASP.NET Web用户控件与完整的ASP.NET网页(.aspx文件)相似,同时具有用户界面页和代码。可以采取与创建ASP.NET网页相似的方式创建用户控件,然后向其中添加所需的标记和子控件。ASP.NET Web用户控件可以像页面一样包含对其内容进

29、行操作(包括执行数据绑定等任务)的代码。 当然,Web用户控件和ASP.NET网页也有很多不同之处: 1) Web用户控件的文件扩展名为.ascx,而不是.aspx; 2) Web用户控件没有Page指令,而是包含Control指令,该指令对配置及其他属性进行定义; 3) Web用户控件不能作为独立文件运行,而必须像处理任何其他控件一样,添加到ASP.NET页中; 4) Web用户控件中没有html、body或form元素,这些元素必须位于宿主页中。 可以在Web用户控件上使用与在ASP.NET网页上所用相同的HTML元素(html、body或form元素除外)和Web控件。例如,如果要创建一

30、个将用作工具栏的用户控件,则可以将一系列Web服务器控件Button放在该用户控件上,并创建这些按钮的事件处理程序。【例20-5】设计一个ASP.NET Web用户控件。该用户控件显示一个只读文本框,其中有一个数字和两个箭头,用户可以单击这两个箭头来增加和减少文本框中的值。该控件公开三个可在宿主页中使用的属性:MinValue、MaxValue和CurrentValue。 1) 新建一个网站,输入名称TestWebUserControl,单击【确定】。 2) 选择【解决方案资源管理器】右击项目名【添加新项】【Web用户控件】,输入用户控件名NumberUpDown.cs。 3) 设计图20-4

31、所示的界面。图20-4 Web用户控件设计界面textBoxNumberEnabled:falseReadOnly:trueTextMode:SingleLinebuttonDownText:buttonUpText: 4) 在用户控件NumberUpDown.ascx的代码隐藏类NumberUpDown.ascx.cs中添加成员声明及属性:private int m_minValue;private int m_maxValue = 100;private int m_currentNumber = 0;public int MinValue get return m_minValue; s

32、et if (value = this.MaxValue) throw new Exception(MinValue must be less than MaxValue.); else m_minValue = value; public int MaxValue get return m_maxValue; set if (value = this.MinValue) throw new Exception(MaxValue must be greater than MinValue.); else m_maxValue = value; public int CurrentNumber

33、get return m_currentNumber; 5) 添加如下方法:/显示当前值protected void DisplayNumber() textBoxNumber.Text = this.CurrentNumber.ToString(); /获取状态信息的字典,这些信息可以在同一个页的多个请求间 /保存和还原服务器控件的视图状态 ViewStatecurrentNumber = this.CurrentNumber.ToString(); 6) 在Page_Load事件中添加代码:protected void Page_Load(Object sender, EventArgs

34、e) if (IsPostBack) m_currentNumber = Int16.Parse(ViewStatecurrentNumber.ToString(); else m_currentNumber = this.MinValue; DisplayNumber(); 7) 添加按钮【】和【】的Click事件:protected void buttonUp_Click(Object sender, EventArgs e) if (m_currentNumber = this.MaxValue) m_currentNumber = this.MinValue; else m_curre

35、ntNumber += 1; DisplayNumber();protected void buttonDown_Click(Object sender, EventArgs e) if (m_currentNumber = this.MinValue) m_currentNumber = this.MaxValue; else m_currentNumber -= 1; DisplayNumber(); 8) 保存文件,然后在【解决方案资源管理器】中,将NumberUpDown.ascx控件拖放到Default.aspx的设计界面,这时创建了一个实例NumberUpDown1,修改其MaxV

36、alue和MinValue的属性值,预览页面查看结果。 当然,也可以像例20-4那样,通过【新建项目】【Visual C#】【Windows】【Web控件库】,将此ASP.NET Web用户控件添加到一个单独的项目当中。20.4 自定义控件 与用户控件相比,自定义控件则相对复杂一些,Windows自定义控件默认继承自System.Windows.Forms.Control,而Web自定义控件则分为两类:如果要呈现用户界面元素或任何其他客户端可见的元素,则应从System.Web.UI.WebControls.WebControl(或派生类)继承该控件;如果控件要呈现在客户端浏览器中不可见的元素

37、(如隐藏元素或meta元素),则应从System.Web.UI.Control继承该控件。实际上,WebControl类是从System.Web.UI.Control派生,并添加了与样式相关的属性,如Font、ForeColor和BackColor。 当从Control继承时,将继承使控件能够运行的最基本的功能。Control类的固有功能可处理用户通过键盘和鼠标的输入,定义控件的边界和大小,提供窗口句柄,以及提供信息处理和安全等等。它没有包含任何绘图功能(在此指的是控件图形界面的实际呈现),也没有包含任何特定用户的交互功能,必须通过自定义代码提供所有这些功能,但是实现比较灵活。20.4.1 自

38、定义Windows控件 Windows的自定义控件是继承于Control类,继承了能使控件运行的最基本的功能,比如:处理用户通过键盘和鼠标的输入,定义控件的边界和大小,提供窗口句柄,以及提供信息处理和安全等等。但是没有包含任何绘图功能(在此指的是控件用户界面的绘制),也没有包含任何特定用户的交互功能。1. 设计Windows自定义控件 .NET Framework2.0在System.Windows.Forms命名空间中包含了能够使用视觉样式绘制公共控件的部件和状态的类。这些类中的每一个都包含一些static方法,这些方法使用操作系统的当前视觉样式绘制处于特定状态的控件或控件的部件。比如But

39、tonRenderer类,CheckBoxRenderer类,GroupBoxRenderer类和RadioButtonRenderer类等等。 在VS2005中创建Windows应用程序时,默认情况下在Program类中将在创建任何控件之前调用Application.EnableVisualStyles()来启动可视化样式。例20-6介绍了如何用ButtonRenderer类绘制自定义按钮控件的用户界面。【例20-6】创建自定义控件CustomButton,使用DrawButton方法来绘制用户界面,单击此控件则在原始控件的边界内绘制一个较小的CustomButton按钮,以此来完成类似于B

40、utton按钮的视觉效果。 1) 运行VS2005,选择【新建项目】。在【Visual C#】中选择【Windows控件库】,然后修改项目名为CustomWinControls。 修改相应保存路径,按【确定】按钮,则系统默认有一个CustomControl1的自定义控件,右击CustomControl1.cs,将其重命名为CustomButton.cs。 2) 右击CustomButton控件,选择【查看代码】,在代码中添加命名空间引用:using System.Windows.Forms.VisualStyles; 3) 添加字段声明和属性定义:private Rectangle click

41、RectangleValue = new Rectangle();/指定用视觉样式绘制的按钮的视觉状态private PushButtonState state = PushButtonState.Normal;/定义单击按钮后的小按钮矩形边界public Rectangle ClickRectangle get clickRectangleValue.X = ClientRectangle.X + (int)(.2 * ClientRectangle.Width); clickRectangleValue.Y = ClientRectangle.Y + (int)(.2 * ClientRe

42、ctangle.Height); clickRectangleValue.Width = ClientRectangle.Width - (int)(.4 * ClientRectangle.Width); clickRectangleValue.Height = ClientRectangle.Height - (int)(.4 * ClientRectangle.Height); return clickRectangleValue; 4) 重写从Control继承的受保护的OnPaint方法,根据目前的按钮视觉状态即PushButtonState的值,绘制大的或小的按钮用户界面:prot

43、ected override void OnPaint(PaintEventArgs pe) base.OnPaint(pe); / 如果按钮被按下去,则绘制小的按钮图形界面 if (state = PushButtonState.Pressed) /Application.RenderWithVisualStyles属性获取当前应用程序 /是否使用可视样式绘制控件;当未启动时,设置为其父级的背景色 this.BackColor = Application.RenderWithVisualStyles ? Color.Azure : this.Parent.BackColor; /变为小按钮后

44、,原按钮的一部分将显现出来, /需要调用DrawParentBackground方法重新绘制 /使其变为父级的背景。 ButtonRenderer.DrawParentBackground(pe.Graphics, ClientRectangle, this); ButtonRenderer.DrawButton(pe.Graphics, ClickRectangle, this.Text, this.Font, true, state); /绘制大的未被按下去的按钮图形界面 else ButtonRenderer.DrawButton(pe.Graphics, ClientRectangle

45、, this.Text, this.Font, false, state); 5) 重写鼠标的处理事件:protected override void OnMouseDown(MouseEventArgs e) base.OnMouseDown(e); /设置按钮视觉状态为按下状态 state = PushButtonState.Pressed; Invalidate();protected override void OnMouseEnter(EventArgs e) base.OnMouseEnter(e); /设置按钮状态为激活状态 state = PushButtonState.Hot

46、; Invalidate();protected override void OnMouseLeave(EventArgs e) base.OnMouseLeave(e); state = PushButtonState.Normal; Invalidate();protected override void OnMouseUp(MouseEventArgs e) base.OnMouseUp(e); OnMouseEnter(e);protected override void OnMouseMove(MouseEventArgs e) base.OnMouseMove(e); / 鼠标左键

47、按下并且光标从按下的按钮上离开时, / 恢复按钮的正常外观。 if (e.Button & MouseButtons.Left) = MouseButtons.Left & !ClientRectangle.Contains(e.Location) & state = PushButtonState.Pressed) OnMouseLeave(e); 6) 选择菜单的【生成】【生成解决方案】,生成Windows自定义控件CustomWinControls.dll。 自此,自定义控件就设计好了。此时可以观察到,在项目的bindebug目录下已经生成了CustomWinControls.dll文件

48、。2. 调用Windows自定义控件 将自定义控件添加到工具箱的方法与将COM组件添加到工具箱的方法相似,为了能在Windows应用程序中看到控件的及时变化,可以将控件的测试程序建立在同一个解决方案下面。【例20-7】调用自定义控件示例。 1) 在例20-6的CustomWinControls解决方案下,新建一个Windows应用程序项目TestCustomButton; 2) 在解决方案资源管理器中,右击项目CustomWinControls,选择【重新生成】,则会重新生成CustomWinControls.dll; 3) 切换到项目TestCustomButton的Form1窗体,打开工具箱会发现,已经自动添加了一个名为【CustomWinControls组件

温馨提示

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

最新文档

评论

0/150

提交评论