📄 manual.txt
字号:
你好!欢迎你使用飞虹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 + -