⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 manual.txt

📁 飞虹 vision仿windows开发
💻 TXT
📖 第 1 页 / 共 3 页
字号:
你好!欢迎你使用飞虹Vision2.0
	 在使用之前,请认真阅读本手册,我们假定你已对C++很熟悉,至少应知道什么是
类,类如何实现继承,什么是函数重载,虚函数有什么功能,多态在C++中是如何体现
的,假如你对这些也不熟悉的话,那也不要紧,请赶快找一本C++方面的语言参考书,
当然,你应当对C语言是熟悉的。
	 在这里,我们勿需再介绍飞虹Vision提供了那些功能,只要看看产品提供的演示
程序DEMO.EXE就知道了,其实,DEMO只是飞虹Vision的一个最基础的应用,更多的还
需你自己去发掘,去创造,飞虹正是这样考虑的,如果提供给用户一个非常完全的界面
设计系统,但却未给用户留有广阔的余地,开发软件时只能在你给的范围中,这样无免
画地为牢,飞虹永远不想这样做,以后也不会。许多人一看到利用飞虹Vision开发的
软件,就难免问上一句,“你的程序在Windows平台工作吧?”,当然不是,所有由
本产品开发的软件都必须在DOS下运行,然而,飞虹Vision提供的功能使实际结果居然
与Windows界面有惊人的相似,让许多人确实上了“一个当”

注意!!!!!!!!!!

	 必须先运行鼠标驱动程序

	 运行Smartdrv.exe之类的高速缓冲设置文件将使整个系统的运行速度极为理想化


一、系统安装
	 在安装之前,请检查系统是否完全,飞虹Vision共两张盘,第一张为安装盘,看看
磁盘是否有损坏,如果有的话,请赶快通知作者。
	 1. 将第一张盘插入软驱;
	 2. 转到所插磁盘的驱动器上,如C:\>A:
	 3. 键入Install回车,按程序所要求健入目的盘符。

	 注意:
		  你的工作目录必须与飞虹Vision在一个分区上,否则的话,在编译时将出现
	 大量的错误。

	 如果未安装完毕,安装程序就退出,你应当检查:
	 1. 目的盘是否剩余空间不够,飞虹Vision需4M空间;
	 2. 目的盘上是否已被安装,如果是的话,请删除以前的安装目录;
	 3. 磁盘文件是否损坏,如果是,请赶快通知作者。

	 安装后,在目的驱动器上建立以下目录
	 SUNSHINE
		 |-------------SOURCE 系统源程序
		 |-------------INCLUDE 头文件
		 |-------------LIB  运行库,如位图文件
		 |-------------STEP 循序渐进学习程序

	 注意:

		  1. 你必须把HZ.FON 文件拷到你的工作目录下;
		  2. 将EGAVGA.BGI拷到你的工作目录下;
		  3. 将litt.CHR 拷到你的工作目录下。
		  以上文件在SUNSHINE目录下。


二、 用飞虹Vision开发软件

	  .所有定义文件在\SUNSHINE\INCLUDE下;
	  .在工程文件中包含\SUNSHINE\SOURCE下的文件(或一部分);
	  .如果是Borland 3.1以下用户请参见“Below 3.1 一节”。

	  1. 原理
	  飞虹Vision把一切动作都看作是应用程序的构件,这其中包括在屏幕上可以看到
的,在屏幕上看不到的也被称为构件,除了不能被显示外,其性质与可见构件完全相同
这就是说,任何构件都可分为以下类之一:
	  . 可见构件,如按钮、图标、对话框;
	  . 不可见构件,如文件拷贝,数组计算。
	  所有构件中,以可见构件居多。
	  把所有构件的共性抽象出来,就形成了飞虹Vision的基础类MObj:
//头文件 mobj.h
class MObj
 {
  private:
	int X,Y,W,H;
	int length; //privated data length
	void *buffer; //object's privated data pointer
//以上两变量为飞虹保留
	char *id; //identify the objection's name
  protected:
	int Mes;   //
	void *Mp;  //
	long Lp;   //消息 
	int firstrun;   //激活或第一次运行
  public:
	MObj(){X=0;Y=0;W=0;H=0;buffer=NULL;id=NULL;firstrun=1;}
	MObj(int x,int y,int w,int h,char far *idname);
	virtual ~MObj();
	//Attribute Settting
	int x(){return X;}  
	void x(int m){X=m;}
	int y(){return Y;}
	void y(int m){Y=m;}
	int w(){return W;}
	void w(int m){W=m;}
	int h(){return H;}
	void h(int m){H=m;}
	void TransMes(int l1,void *l2=NULL,long l3=0);
        int GetMes(){return Mes;}
        void SetFirst(int i=1){firstrun=i;} //设置激活特性
	virtual void GetFocus()=0;
	virtual void UnFocus()=0;
	virtual int Process()=0;
	virtual char far * Nameof()=0;  //类名
	char far * GetId(){ return (char far *)id;} //标志
	void Setbuffer(void *buf,int len); 
	void far *Setbuffer(){return buffer;}
};
   .任何构件都有几何特性,不可见构件可认为几何特性为0,在MObj中用私有变量
X、Y、W、H表示,(X,Y)为屏幕水平与垂直坐标,后两者为长宽
   .任何构件都应有一个标识号,这有私有变量id表示
   .任何构件都要接收信息,这由函数TransMes完成,消息存放在保护变量Mes,
    Mp,Lp,其中Mes代表消息类型,Mp存放数据指针,Lp存放数据取长度
   .任何系统都要被激活,这由firstrun变量表示,即第一次运行
	.任何构件都有接收输入和未接收输入两种状况,如按钮接收输入时被弹下,
    未接收输入时弹上,这由函数UnFocus与GetFocus表示
   .任何构件都必须对接收到的消息进行处理,这由函数Process表示
   .不同构件的状态是不同的,UnFocus(),GetFocus(),Process(),应为虚函数
   
   这就是构件的共性。

    为了使构件能正确管理,飞虹Vision设计了构件管理器,它实质上将所属构
件“串”在一个链上,管理器依次扫描每个构件,当构件被扫描时,管理器执行
其函数Process(),构件的Process()又根据构件当时的状况调用构件的UnFocus()
或GetFocus(),如按钮类在被扫描时判断鼠标左键是否按下,如按下,判断其位置
是否在按钮上,如果是,调用函数GetFocus();
    构件也不一定调用GetFocus()或UnFocus(),这完全依据构件的组成而定,当然
这样规定只是使程序设计具有一致性。
    由于管理器的扫描是很快的,所有构件在宏观上同时运行,及同时接收消息。
    任何构件都由类MObj 继承而来,所有构件都要继承MObj的虚函数,特别是Process
函数,一般地,构件的Process()函数有点象以下例子:
    int DMObj::Process()
      {
       if(firstrun){firstrun=0;UnFocus();return 1;} 
      //第一次运行调用UnFocus() 函数以设置构件的初始外观
       ......//其他处理
		 if(未接收输入){设置状态...; UnFocus();return 1;}
       else {设置状态...;GetFocus()return 1;}
       return 1;
      }
     构件的处理函数要向其管理器返回值,管理器根据反回值作相应的处理,一般
返回值有以下几种类型:(参见define.h)
     DEL: 删除刚被扫描的构件
      0:  结束一个应用
     DIALOG_DEL:对话框将扫描的构件删除
     CLOSE: 退出当前构件管理器
     当然,你随便定义自己的处理值,但处理值应该由构件管理器得到处理

   2. 构件管理器
      上面多次提到构件管理器,那么,构件管理器是如何工作的呢?
      所有的构件管理器都由类MWindowObj继承而来,MWindowObj类结构如下:
 class MWindowObj : public MObj
   {
	 protected:
	  MObj **winobj;  //构件链
	  int maxlength;  //当前允许的最大构件数
	  int number;     //现在有多少构件
	 public:
		MWindowObj():MObj(){number=0;} //unusualy used
		MWindowObj(int x,int y,int w,int h,char *idname);
		virtual ~MWindowObj();
		STATE Add(MObj &aobj); //向管理器加入一个构件
		void Del(char *idname);//删除指定构件
		MObj& GetObj(char *idname);//得到指定构件
                MObj& GetObj(int i){return *winobj[i];}
                //得到构件链上所给位置的构件
		int GetNumber(){ return number;}
		virtual void GetFocus()=0;
		virtual void UnFocus()=0;
		virtual int Process()=0;
		virtual STATE Save()=0;   //管理器背景存储
		virtual void Restore()=0; //管理器背景恢复
		virtual char far *Nameof() { return "mwindowobj";}
  };

     管理中的保护变量winobj形成一个构件链,构件链上的节点是指向构件的指针,
 我们不必知道构件链上的节点到底是哪一种构件,这完全是由C++多态特性控制。每
 调用函数Add向管理加一个构件,管理器就将该构件放到构件链的末尾,并将构件个数
 变量number加1,可由GetNumber返回当前构件数。
     Save函数保存管理器背景,Restore恢复管理器背景,这两个函数为纯虚函数,
 在窗口和对话框中要定义它们,而在应用类中未定义。
     构件管理器管理着整个构件的运行,只要由MObj继承而来的类都可以加到管理器
上,甚至构件管理器还可作为另一个管理器的一个构件,如窗口类都作为应用类的构件。

三、应用类(构件管理器)
    在所有的构件管理器中,应用类是最重要的一种,程序一开始运行,我们就要与
应用类打交道,我们往往在main()函数中向应用类加一些最基本的构件,如菜单、加速
按钮、图标按钮等。
//头件 mapp.h
class MLast : public MObj
 {
  public:
	MLast(int x=0,int y=0,int w=0,int h=0,char *idname="NOI")
	: MObj(x,y,w,h,idname){}
	virtual ~MLast(){closegraph();}
	virtual void UnFocus(){}
	virtual void GetFocus(){}
	virtual int Process(){return 1;}
   virtual char far *Nameof(){return "mlast";}
 };
class MApp : public MWindowObj
 {
	private:
	 STATE isok;//initilzation is ok
	public:
		MApp(int gd=DETECT);
		virtual ~MApp();
		static MApp *Application; //Reserved for a application
		static ifstream HZ;
		virtual void UnFocus(){} //no reserved
		virtual void GetFocus(){} //no reserved
		virtual void Paint(char *topic=NULL);
		virtual int Process();
		virtual STATE Save(){return SUCC;}//do nothing
		virtual void Restore(){} //do nothing
		virtual char *Nameof() { return "mapp";}
 };
    私有变量被飞虹保留,静态变量Application为一指针,它指向MApp第一次实例
化时的实例的指针,这是一个极为重要的变量,我们可在程序的任何地方利用该指
针向应用加入一个构件,常见方式如下:
    MApp::Application->Add(一个构件的引用)

    注意:

		  Add函数的参数为构件引用,试图加入构件指针编译器都将做出错误的表示。
    MLast类作为应用的最后一个类主要是做一些扫尾和清除工作,如关闭图形驱动
    器。
        所有加入的构件都必须由堆栈分配空间

    静态变量HZ作为汉字库文件流,在main()函数文件中,应这样做:
    ifstream MApp::HZ("hz.fon",ios::binary); //定义汉字库流
    MApp * MApp::Application; //应用指针定义
   .
   .
   .
   main()
    {
      MApp myapp;
     ......
      return myapp.Process();
    }
    这也是一般应用程序的结构。

四、类说明

   我们采取如下格式:

   类名

   定义所在头文件

   class 类名 : public 父类
    {
      protected:
      //说明
      .....
      public:
      //说明
      .....
    };

  我们把私有成分省略掉,因为用户不可能用到它。

1.
  鼠标类
  app.h
  class Mouse
  {
	public:
	  Mouse(); 
	  Mouse(int f); //f=1将自动on and off
	  ~Mouse();
	  void Reset(); //重新获得Mouse状态
	  int x(){ return X;} //水平坐标
	  int y(){ return Y;} //垂直坐标
	  int lf();  //左键按下
	  int lp();  //....释放
	  int rf();  //右键按下
	  int rp();  //....释放
	  void MouseOn(); //let Mouse on
	  void MouseOff(); //let mouse off
	};
enum STATE {FAIL,SUCC}; //状态

2. 
  位图类
  mbmp.h
 class MBmp
  {
 	 public:
	  MBmp(char *filename); //filename:位图文件
	  ~MBmp();
	  void BitBlt(int x,int y); //将位图显示在(x,y)
          char *BmpName(){return bmpname;} //得到位图文件名
  }; 

3.
  按钮类
  mbutton.h
class MButton : public MObj
 {
   protected:
	 int BS;  //鼠标状态,1:按下,0:弹起
  public:
	MButton():MObj(){}
	MButton(int x,int y,int w,int h,char *name,char *idname,char *stat,int k=1);
// x,y,w,h:水平坐标、垂直坐标、长、宽
//name:提示文本 idname:标志,stat:向状态条发送的文本,当鼠标经过按钮时,
//状态条显示所给文本
//k:是否向状态条发送文本
	virtual ~MButton();
	int GetBS(){return BS;} 
// 得到当前鼠标状态
	char *GetMes(){return status;}
// 返回向状态条要发送的信息
	virtual char far * Nameof(){ return "button";}
	virtual void GetFocus();
	virtual void UnFocus();
//重载UnFocus()与GetFocus(),可以得到外观不同的按钮
	virtual int Process();
	virtual int F(){return 1;}
//按钮被按下时,激活函数F,并向管理器返回F()的返回值,函数F()一般都要重载
//,以便按钮按下时执行特有的功能
  };
//参见MPButton

4 . 检查框类
    mcheck.h
 class MCheck : public MObj
  {
 	public:
	 MCheck(int x,int y,char *topic,char *idname,int cs=0);
//x,y:检查框所在位置,topic:检查框文本,idname:标志
//cs:检查框初始状态,1:点中,0:未点中

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -