1、王德俊 上海交通大学继续教育学院应用软件开发(C#)第8章 Active控件和自定义组建开发第第8章章 ActiveX控件和自定义组件开发控件和自定义组件开发 8.1 ActiveX控件控件8.2 自定义组件自定义组件应用软件开发(C#)第8章 Active控件和自定义组建开发ActiveX控件概念控件概念什么是什么是ActiveX控件控件ActiveX是是Microsoft对一系列策略性面向对象程序技术和工具的称呼,对一系列策略性面向对象程序技术和工具的称呼,是是“成品成品”的软件模块,可以简单理解为能够实现特定功能的的软件模块,可以简单理解为能够实现特定功能的“成品成品”控件。控件。Act
2、iveX控件控件是在是在OLE控件控件“对象链接与嵌入控件对象链接与嵌入控件”和和OCX控件的基础发控件的基础发展起来的,其重要作用是可以插入到网页或应用程序中使用。展起来的,其重要作用是可以插入到网页或应用程序中使用。应用软件开发(C#)第8章 Active控件和自定义组建开发什么是自定义组件什么是自定义组件严格来说,严格来说,ActiveX控件控件指的是指的是提供用户界面接口(提供用户界面接口(UI)功能的组件)功能的组件,而而一般一般所说的组件所说的组件是无用户界面组件是无用户界面组件,此类组件定义时只需定义为宿,此类组件定义时只需定义为宿主程序所调用的属性和方法,无需考虑如何显示界面。
3、主程序所调用的属性和方法,无需考虑如何显示界面。应用软件开发(C#)第8章 Active控件和自定义组建开发ActiveX控件通常控件通常以以dll或或ocx文件文件的形式存在,自定义无界面组的形式存在,自定义无界面组件通常以件通常以dll的形式存在,它们不能独立运行,相应的的形式存在,它们不能独立运行,相应的依赖程依赖程序称为宿主程序序称为宿主程序。宿主程序在使用控件和组件时,不需要编译,只需要按照既定的格式宿主程序在使用控件和组件时,不需要编译,只需要按照既定的格式说明进行调用即可。说明进行调用即可。开发语言:开发语言:ActiveX控件可以用各种编程语言来开发,如控件可以用各种编程语言来
4、开发,如C、C+,也包括,也包括.NET中中的的C、VB.NET等。等。开发和使用开发和使用应用软件开发(C#)第8章 Active控件和自定义组建开发(1)选择选择“文件文件”|“新建新建”|“项目项目”命令,在打开的命令,在打开的“新建项新建项目目”对话框的模板框中选择对话框的模板框中选择“类库类库”模版,模版,并并设置组件名称,设置组件名称,【确定确定】(2)在对应的类文件中,在对应的类文件中,添加添加具有一定功能的具有一定功能的public方法方法作为组作为组件访问接口件访问接口(3)选择选择“生成生成”|“生成组件名称生成组件名称”菜单命令,即可在程序根菜单命令,即可在程序根目录的目
5、录的“组件名称组件名称binRelease”或或“组件名称组件名称binDebug”子子目录下生成目录下生成以文件以文件“组件名称组件名称.dll”存在的存在的组件组件。应用软件开发(C#)第8章 Active控件和自定义组建开发(1)创建应用程序,如:窗体应用程序创建应用程序,如:窗体应用程序(2)选择菜单)选择菜单“项目项目”|“添加引用添加引用”命令,在打开的命令,在打开的“添加添加引用引用”对话框中打开对话框中打开“浏览浏览”选项卡选项卡,定位到定位到“组件名称组件名称.dll”文件文件所在的目录,选择该文件,所在的目录,选择该文件,【确定确定】,引入引入已创建的已创建的组件组件(3)
6、在应用程序中)在应用程序中创建组件类的对象调用其接口创建组件类的对象调用其接口方法。方法。应用软件开发(C#)第8章 Active控件和自定义组建开发【例例8.1】开发具有对英文文本进行加密和解密功能的组件。开发具有对英文文本进行加密和解密功能的组件。设计思想设计思想:这里假设英文文本是由大小写字母、逗号、点号和空格:这里假设英文文本是由大小写字母、逗号、点号和空格组成。加密的原理是,先将这些字符随机地排成一圈,为叙述方便组成。加密的原理是,先将这些字符随机地排成一圈,为叙述方便,不妨假设排成如下的圈(表示空格):,不妨假设排成如下的圈(表示空格):令令key表示密钥(这里为整数),对于英文文
7、本(明文)中的每表示密钥(这里为整数),对于英文文本(明文)中的每个字符,用其在圈中所在位置后面的第个字符,用其在圈中所在位置后面的第key个字符表示。个字符表示。例如,如果例如,如果key为为4,则文本,则文本“I am a boy.”加密后就变成密文加密后就变成密文“MdeqdedfsCc”。应用软件开发(C#)第8章 Active控件和自定义组建开发解密方法:只需将密文中的字符用其在圈中所在位置前面的解密方法:只需将密文中的字符用其在圈中所在位置前面的第第key字符来表示即可。字符来表示即可。解密用户必须知道密钥解密用户必须知道密钥key。【例例8.1】(续续)应用软件开发(C#)第8章
8、 Active控件和自定义组建开发【例例8.1】(续续)步骤如下:步骤如下:(1)“新建项目新建项目”,选择选择“类库类库”,然后将,然后将项目名设置为项目名设置为EnDecrypting,单击,单击【确定确定】按钮。按钮。(2)命名空间命名空间采用默认设置采用默认设置EnDecrypting,而将,而将类名改为类名改为EnDecryptingClass;然后;然后在该类中添加在该类中添加一个一个私有成员私有成员:private string matrix=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.;应用软件开发(C#)第8章
9、Active控件和自定义组建开发【例例8.1】(续续)(3)接着在)接着在EnDecryptingClass类中添加两个方法,分别用于类中添加两个方法,分别用于实现加密和解密:实现加密和解密:public string Encrypting(string plaintext,int keycode)/加密加密public string Decrypting(string ciphertext,int keycode)/解密解密应用软件开发(C#)第8章 Active控件和自定义组建开发【例例8.1】(续续)publicpublic stringstring Encrypting(Encrypt
10、ing(string string plaintextplaintext,int,int keycode)keycode)/加密方法加密方法 charchar chars=matrix.ToCharArray();chars=matrix.ToCharArray();char char ciphertext_arr=plaintext.ToCharArray();ciphertext_arr=plaintext.ToCharArray();/将明文散列到字符数组中将明文散列到字符数组中 intint i=0,j=0;i=0,j=0;for for(i=0;i ciphertext_arr.Le
11、ngth;i+)(i=0;i ciphertext_arr.Length;i+)for for(j=0;j chars.Length;j+)(j=0;j chars.Length;j+)if if(matrixj=ciphertext_arri)(matrixj=ciphertext_arri)break break;if if(j=matrix.Length)throw new Exception(j=matrix.Length)throw new Exception(明文中包含非法字符!明文中包含非法字符!););intint k=0;k=0;whilewhile(k keycode)(k
12、 keycode)k+;k+;j+;j+;if(j=matrix.Length)j=0;if(j=matrix.Length)j=0;ciphertext_arri=matrixj;ciphertext_arri=matrixj;/明文转换为密文明文转换为密文 return newreturn new String(ciphertext_arr);String(ciphertext_arr);/返回密文返回密文 待加密文本待加密文本 密钥密钥应用软件开发(C#)第8章 Active控件和自定义组建开发【例例8.1】(续续)public stringpublic string Decryptin
13、g(Decrypting(stringstring ciphertext,ciphertext,intint keycode)keycode)/解密方法解密方法 charchar chars=matrix.ToCharArray();chars=matrix.ToCharArray();char char plaintext_arr=ciphertext.ToCharArray();plaintext_arr=ciphertext.ToCharArray();/将密文散列到字符数组中将密文散列到字符数组中 intint i=0,j=0;i=0,j=0;for for(i=0;i plainte
14、xt_arr.Length;i+)(i=0;i plaintext_arr.Length;i+)for for(j=0;j chars.Length;j+)(j=0;j=0)(k=0)k-;k-;j-;j-;if if(j=-1)j=matrix.Length-1;(j=-1)j=matrix.Length-1;plaintext_arri=matrixj;plaintext_arri=matrixj;/密文转换为明文密文转换为明文 return newreturn new String(plaintext_arr);String(plaintext_arr);/返回明文返回明文 密钥密钥待解
15、密文本待解密文本应用软件开发(C#)第8章 Active控件和自定义组建开发【例例8.1】(续续)(4)生成加密、解密组件:选择菜单)生成加密、解密组件:选择菜单“生成生成”|“生成生成EnDecrypting”命令,即可在程序根目录的命令,即可在程序根目录的EnDecryptingbinRelease子目录子目录下生成以下生成以文件文件EnDecrypting.dll存在的加密、解密组件。存在的加密、解密组件。应用软件开发(C#)第8章 Active控件和自定义组建开发【例例8.2】(续续)【例例8.2】调用在例调用在例8.1中创建的加密、解密组件中创建的加密、解密组件EnDecryptin
16、g,实现对给定英文文本的加密和解密功能。实现对给定英文文本的加密和解密功能。(1)创建名为)创建名为testEnDecrypting的窗体应用程序,然后选择菜的窗体应用程序,然后选择菜单单“项目项目”|“添加引用添加引用”命令,在打开的命令,在打开的“添加引用添加引用”对话框对话框中打开中打开“浏览浏览”选项卡选项卡,定位到定位到EnDecrypting.dll文件文件所在的目所在的目录,并选择该文件,录,并选择该文件,【确定确定】按钮即可引入已创建的组件,以按钮即可引入已创建的组件,以后就可以直接调用它了。后就可以直接调用它了。应用软件开发(C#)第8章 Active控件和自定义组建开发【例
17、例8.2】(续续)(2)在窗体上分别)在窗体上分别添加添加三个三个TextBox控件控件和三个和三个Label控件以及控件以及两个两个Button控件,并对它们的有关属性、位置和大小作适当的控件,并对它们的有关属性、位置和大小作适当的设置和调整,并将窗体的设置和调整,并将窗体的Text属性值设置为属性值设置为“加密、解密程加密、解密程序序”,结果如下图所示。,结果如下图所示。应用软件开发(C#)第8章 Active控件和自定义组建开发【例例8.2】(续续)(3)制作用于输入密钥的对话框。方法是:在程序中再)制作用于输入密钥的对话框。方法是:在程序中再添加添加一个窗体一个窗体,形成窗体,形成窗体
18、Form2,并在该窗体上,并在该窗体上添加添加一个一个TextBox控控件件和一个和一个Label控件,并作适当的调整和设置,结果如下图所示。控件,并作适当的调整和设置,结果如下图所示。应用软件开发(C#)第8章 Active控件和自定义组建开发【例例8.2】(续续)(4)为了使窗体)为了使窗体Form2中输入的数据能传递到中输入的数据能传递到Form1中,需要编写相关代码中,需要编写相关代码:public partial class Form2:Form public Form2()InitializeComponent();private int keycode=-1;public int
19、 keycodeValue /Form1利用该属性可以访问利用该属性可以访问Form2中输入的数据中输入的数据 get return keycode;private void button1_Click(object sender,EventArgs e)keycode=Convert.ToInt16(textBox1.Text);this.Close();应用软件开发(C#)第8章 Active控件和自定义组建开发【例例8.2】(续续)(5)编写相关事件的处理函数,需要做以下几项工作:)编写相关事件的处理函数,需要做以下几项工作:l编写显示用于输入密钥的对话框的实现函数编写显示用于输入密钥的
20、对话框的实现函数ShowForm2Dia()l为为【加密加密】和和【解密解密】按钮编写事件处理函数按钮编写事件处理函数 /显示用于输入密钥的对话框的实现代码显示用于输入密钥的对话框的实现代码 private int ShowForm2Dia()Form2 frm2=new Form2();frm2.MaximizeBox=false;frm2.MinimizeBox=false;frm2.FormBorderStyle=FormBorderStyle.FixedSingle;frm2.Text=密钥密钥;frm2.ShowDialog();return frm2.keycodeValue;应用
21、软件开发(C#)第8章 Active控件和自定义组建开发【例例8.2】(续续)/【加密加密】按钮事件处理函数按钮事件处理函数 private void button1_Click(object sender,EventArgs e)int keycode=ShowForm2Dia();try EnDecrypting.EnDecryptingClass obj=new EnDecrypting.EnDecryptingClass();textBox2.Text=obj.Encrypting(textBox1.Text,keycode);catch(Exception ex)MessageBox
22、.Show(ex.ToString();应用软件开发(C#)第8章 Active控件和自定义组建开发【例例8.2】(续续)/【解密解密】按钮事件处理函数按钮事件处理函数 private void button2_Click(object sender,EventArgs e)int keycode=ShowForm2Dia();try EnDecrypting.EnDecryptingClass obj=new EnDecrypting.EnDecryptingClass();textBox3.Text=obj.Decrypting(textBox2.Text,keycode);catch(Exception ex)MessageBox.Show(ex.ToString();应用软件开发(C#)第8章 Active控件和自定义组建开发【例例8.2】(续续)执行该程序:执行该程序:应用软件开发(C#)第8章 Active控件和自定义组建开发本讲小结本讲小结 ActiveX控件控件自定义组件自定义组件