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