saptechnique

Better late than never. - 郭富

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

VS2005集成了强大的安装程序制作工具,相信大家在使用中也确实感到方便了不少。但是,如果发布一个产品,就不能直接使用VS2005的安装程序了,因为,我们需要先将所有的程代码先进行混淆。并且,由于本人一直从事SBOADDON开发,ADDON的安装程序必须由自己创建,并最终将所有的文件嵌入进一个文件中才能在SBO中正确安装,因此,创建一个自己的安装程序势在必行。

 

目录

创建一个自己的安装程序,需要如下思路... 1

下面,我们开始做一个向导... 1

首先,在做向导时,需要创建一个WizardController... 1

类图... 1

说明一下每一个字段、属性和方法... 2

代码... 2

接下来,创建一个FormBase. 6

类图... 6

代码(Form.Disgner.cs中的代码略去)... 6

如何使用InstallWizardBase. 9

 

创建一个自己的安装程序,需要如下思路

一、创建一个支持向导的控件。

二、支持读取自己的嵌入资源,并COPY至目录文件夹。

三、支持创建快捷方式、读写注册表信息、创建数据库等安装程序都支持的操作。

以上的操作,我想放在一个基类库中完成。不妨命名为B1Plus.InstallWizardBase

下面,我们开始做一个向导

首先,在做向导时,需要创建一个WizardController

类图

说明一下每一个字段、属性和方法

属性:

CurIndex:当前窗体所处的索引号。

FormsCount:所有步骤窗体的总和。

IsFirstForm:是否是第一个窗体。

IsLastForm:是否是最后一个窗体。

IWBParametersInstall Wizard Base Parameters,安装向导支持的参数。

ProgramName:所要安装的程序名。

方法:

AddForms():向Controller控件添加窗体实例。

BeginWizard():启动向导。

Dispose():清理系统资源。

FinishWizard():完成向导。

GoNext():执行下一步。

GoPrev():执行上一步。

代码

using System;

using System.Collections.Generic;

using System.Text;

using System.Windows.Forms;

using System.Collections;

 

namespace B1Plus.InstallWizardBase

{

    public class WizardController

    {

        private ArrayList _WizardForms = new ArrayList();

        private int _curIndex = 0;

 

        private object _IWBParameters = null;

 

        public object IWBParameters

        {

            get { return _IWBParameters; }

            set { _IWBParameters = value; }

        }

 

        public int CurIndex

        {

            get { return this._curIndex; }

        }

 

        public int FormsCount

        {

            get { return this._WizardForms.Count; }

        }

 

        #region 构造函数

        /// <summary>

        ///构造函数

        /// </summary>

        public WizardController()

        {

 

        }

        #endregion

 

        public void AddForms(FormBase formBase)

        {

            _WizardForms.Add(formBase);

            foreach (FormBase frm in _WizardForms)

            {

                frm.controller = this;

 

                //frm.DisableButtons();

 

                if (this._ProgramName != null)

                    frm.Text = "欢迎使用 " + this._ProgramName + " 安装向导";

                else

                {

                    frm.Text = "B1Plus InstallWizard.";

                }

            }

        }

       

        string _ProgramName = null;

        public string ProgramName

        {

            get { return this._ProgramName; }

            set { this._ProgramName = value; }

        }

 

        public bool IsFirstForm //属性

        {

            get { return _curIndex == 0; }

        }

        public bool IsLastForm //属性

        {

            get { return _curIndex == this._WizardForms.Count - 1; }

        }

 

        public void GoNext()

        {

            if (_curIndex + 1 < _WizardForms.Count)

            {

                //((FormBase)_WizardForms[_curIndex]).Visible = false;

                ((FormBase)_WizardForms[_curIndex]).Hide();

                _curIndex++;

            }

            else

            {

                return;

            }

            ((FormBase)_WizardForms[_curIndex]).DisableButtons();

            ((FormBase)_WizardForms[_curIndex]).Show();

        }

 

        public void GoPrev()

        {

            if (_curIndex - 1 >= 0)

            {

                ((FormBase)_WizardForms[_curIndex]).Hide();

                _curIndex--;

            }

            else

            {

                return;

            }

            ((FormBase)_WizardForms[_curIndex]).DisableButtons();

            ((FormBase)_WizardForms[_curIndex]).Show();

        }

 

        public void BeginWizard()

        {

            ((FormBase)_WizardForms[_curIndex]).DisableButtons();

            ((FormBase)_WizardForms[0]).Show();

        }

 

        public void FinishWizard()

        {

            _curIndex = 0;

            Dispose();

        }

 

        private void Dispose()

        {

            foreach (FormBase frm in _WizardForms)

            {

                frm.Close();

            }

            Application.Exit();

        }

    }

}

 

接下来,创建一个FormBase

类图

代码(Form.Disgner.cs中的代码略去)

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace B1Plus.InstallWizardBase

{

    public partial class FormBase : Form

    {

        public WizardController controller = null;

        public FormBase()

        {

            InitializeComponent();

        }

 

        private void btnHelp_Click(object sender, EventArgs e)

        {

            this.ShowHelp();

        }

 

        protected virtual void ShowHelp()

        {

            MessageBox.Show("此步骤未包含任何帮助信息!\n请联系郭富[42319036]");

        }

 

        private void btnPre_Click(object sender, EventArgs e)

        {

            this.GoPrev();

        }

 

        private void btnNext_Click(object sender, EventArgs e)

        {

            this.GoNext();

        }

 

        private void btnStart_Click(object sender, EventArgs e)

        {

            StartInstall();

        }

 

        private void btnFinish_Click(object sender, EventArgs e)

        {

            Cancel();

        }

 

        internal void DisableButtons()

        {

            if (this.controller == null)

                return;

            if (this.controller.IsFirstForm)

                this.btnPre.Visible = false;

            else

                this.btnPre.Visible = true;

            if (this.controller.IsLastForm)

            {

                this.btnNext.Visible = false;

                this.btnStart.Visible = true;

            }

            else

            {

                this.btnNext.Visible = true;

                this.btnStart.Visible = false;

            }

            this.lblStep.Text = (this.controller.CurIndex + 1).ToString() +

                "/" + this.controller.FormsCount.ToString();

        }

 

        protected virtual void GoPrev()

        {

            this.controller.GoPrev();

        }

 

        protected virtual void GoNext()

        {

            if (this.controller.IsLastForm)

                controller.FinishWizard();

            else

                this.controller.GoNext();

        }

 

        protected virtual void Cancel()

        {

            this.controller = null;

            Application.Exit();

        }

 

        protected virtual void StartInstall()

        {

            MessageBox.Show("请重写此方法以执行安装!");

        }

 

        protected virtual void SetBannerInfo(string inf)

        {

            if (inf != null)

            {

                if (inf != "")

                {

                    this.lblBanner.Text = inf;

                    return;

                }

            }

            this.lblBanner.Text = "完成此向导共需" +

                this.controller.FormsCount.ToString() +

                " 步。您现在处于第" +

                (this.controller.CurIndex+1).ToString() +

                " 步。";

        }

 

        private void FormBase_FormClosing(object sender, FormClosingEventArgs e)

        {

        }

    }

}

 

如何使用InstallWizardBase

创建一个Windows项目,引用刚刚创建的InstallWizardBase

然后,创建3Form,分别为Form1,Form2,Form3

每个Form必须继承自B1Plus.InstallWizardBase.FormBase.

如果需要确切显示Banner信息,请在Form的构造函数里调用            SetBannerInfo("第一步")方法。

最后,修改Program.cs中的代码为:

using System;

using System.Collections.Generic;

using System.Windows.Forms;

 

namespace B1Plus.InstallWizard

{

    static class Program

    {

        /// <summary>

        /// The main entry point for the application.

        /// </summary>

        [STAThread]

        static void Main()

        {

            Application.EnableVisualStyles();

            Application.SetCompatibleTextRenderingDefault(false);

            B1Plus.InstallWizardBase.WizardController wc = new B1Plus.InstallWizardBase.WizardController();

            wc.ProgramName = "B1Plus Reporter";

            wc.AddForms(new Form1());

            wc.AddForms(new Form2());

            wc.AddForms(new Form3());

            wc.BeginWizard();

            Application.Run();

        }

    }

}

 

完成!

posted on 2009-10-28 11:50  guofu  阅读(2517)  评论(14编辑  收藏  举报