中创金融系统开发平台(BSDP)手册
(桌面控制部分)
Ver 1.0
BSDP字符窗口系统(CWS) 一、概述 BSDP的字符窗口系统( CWS )是一个基于UNIX环境的字符 窗口系统(Chractor Window Systerm)。利用该系统,程序员 可以完成读取、保存和重显屏幕缓冲区等基本窗口操作。在 此基础上,CWS提供了基本输入/输出、弹出式用户菜单、窗口 文本浏览器等实用函数,可以方便地建立友好的用户界面。
二、字符窗口系统(CWS)的API接口约定
1. 使用时需 #include "dsdp.h"
2. 所有的API函数都以 'W' 开头,每个动词的首字母 大写
3. 输出的字符串中不包含'\t','\n' 等其他转义序列。
4. 输出字符位置(1,1)和(25,80)之内,字符串长度不 超过80字符。 5. 编译联接时使用 -lw
三、API 接口说明
注: 对应于 WGet 系列函数, XGet 系列为其功能扩展函数, 其调用方式一致, 在此不再说明.
● WHello
[语法] WHello(x, y, bell, mode, arg ...) int x, y, bell; char mode;
[说明] WHello 显示提示. (x, y) 左上角位置 bell 0/1 不/响铃 mode 显示方式 arg 显示内容
[返回值] 无 。
● WInitialize
[语法] int WInitialize()
[说明] WInitialize 执行窗口初始化操作,完成以下 动作:
- 创建屏幕缓冲区
- 清屏、设置当前显示方式为白/黑方式,光标 停在左上角(1,1)位置。
- 设置终端操作为 raw 方式
该函数应在主程序的最初调用.
[返回值] 初始化成功返回 0,否则返回-1
● WConnect
[语法] int WConnect()
[说明] WConnect 调用使当前进程取得对当前窗口系统的 操作权限,但并不对窗口进行初始化。一般由主 程序的子进程在程序开始时调用。
[返回值] 执行成功返回 0,否则返回-1。
●WCloce
[语法] int WCloce() [说明] WCloce撤消窗口系统,主要完成以下操作:
- 释放屏幕缓冲区。
- 清屏、光标回到(1,1)。
- 设置终端操作为cook方式。
WClose 由主程序在退出前调用。 ● WClear
[语法] WClear()
[说明] WClear 清整个屏幕 。
[返回值] 无 。
● WSetMode
[语法] WSetMode(ch) char ch; [说明] WSetMode 用于设置由ch代表的显示方式
'0':设置为黑底白字 '1': 设置为白底黑字 '2': 设置为红底白字 '7': 设置为兰底白字
注意:显示方式的切换必须使用WSetMode完成, 不能使用直接输出控制序列的方式。 [返回值] 无 。
● WMoveTo
[语法] WMoveTo(x,y) [说明] WMoveTo将光标移至(x,y)处 [返回值] 无 。
● WPrintf , WPutChar
[语法] int Wprintf(format,arg .....) cat char format;
int WPutChar(ch) char ch;
[说明] WPrintf, WPutChar用法同系统函数pintf,putchar, 但 WPrintf,WPutChar同时更新屏幕缓冲区,并自动 执行 fflush(stdout) 。
[返回值] 无 。
● WMovePrintf, WMovePutChar
[语法] int WMovePrintf(x,y,format,arg...) int x,y; const char * format; [说明] WMovePrintf和WMovePutChar分别是WPrintf和 WPutchar与WMoveTo 的组合使用,即先移动光标到(x,y) 再输出字符。 [返回值] 无 。
● WGetText
[语法] char * WGetText(x,y,dx,dy) int x,y,dx,dy;
[说明] 从屏幕上读取(x,y)到(x+dx-1,y+dy-1)矩形区域内的 字符及其显示属性,保存在一个暂存缓冲区中,并返回 指向该缓冲区的指针。当屏幕上某个矩型区域的内容覆 盖后需要重画时,应首先调用该函数予于保存。
[返回值] 返回暂存缓冲区的地址指针。
● WPutText
[语法] WPutText(buf) char * buf
[说明] WPutText将保存在暂存缓冲区buf中的内容重画,buf应 是由WGetText返回暂存缓冲区地址。
[返回值] 无 。
● WSetRaw, WSetCook
[语法] WSetRaw() Wset Cook()
[说明] WSetRaw 将终端设置为raw方式 。 WSetcook 将终端设置为cook方式 。
[返回值] 无 。
● WGetKey
[语法] WGetKey(flag,chp) int * flag; char * chp;
[说明] WGetKey 读任意一个键值
(* flag) 1 表示该键是ESC组合键 0 表示该键是普通键 (* chp ) 表示该值的键值
[返回值] 无。
● WCls(x,y,dx,dy)
[语法] WCls(x,y,dx,dy) int x, y, dx, dy
[说明] WCls清从(x,y)到(x+dx-1,y+dy-1)之间的短型区域 的内容
[返回值] 无 。
● WDrawBox
[语法] WDrawBox(x,y,dx,dy,s,mode) int x, y, dx, dy; char *s, mode;
[说明] WDrawBox 画一个左上角(x, y) dx行 dy 列 的矩形框, s是框的标题, mode 决定标题的 显示属性 。
[返回值] 无。
● WGetString(x, y, n, p, help, check)
[语法] WGetString(x, y, n, p, help, check) int x,y,n; char *p; int (*help)(),(* chech)(); [说明] WGetString 在(x,y)处输入一个长度为n的字符串, 在输入过程中按下 TAB 键执行帮助函数help,当 输入结束时,调用check函数检查合理性。
check函数编写格式如下: check(buf) char *buf; { } help函数编写格式如下: help() { }
返回 1 表示合法, WGetString返回,
返回 0 表示不合法,WGetString不返回,要求继 续输入。
注 意:回车、↑、↓、^C、^D、在输入前端输入←、 在末端输入→ 都表示输入结束。除^C,^D处 都调用check进行合法性检查。
[返回值] 根据最后一个输入键不同可能返回下列值。
'^C': 以CTRL-C结束 '^D': 以CTRL-D结束 '\n': 以回车键结束 'A': ↑键结束 'B': ↓键结束 'C': →键结束 'D': ←结束
[注意] WGetString 在编辑前先显示 p 的内容, 因此 p 需赋初值。
● WGetInt
[语法] int WGetInt(x,y,n,p,help,check) int x,y,n; int *p,(*help)(),(*check)();
[说明] WGetInt 在(x,y)处输入一个长度为n的整数,结果 存放在(*p)中,其他说明参见WGetString.
check函数编写格式如下: check(n) int n; { }
[返回值] 参见WGetString 。
[注意] WGetInt 在编辑前先显示 *p 的内容, 因此 *p 需赋初值。
● WGetLong(x,y,n,p,help,check)
[语法] WGetLong (x,y,n,p,help,check) int x,y,n; long *p; int (*help)(),(* check)().
[说明] WGetLong 在(x,y)处输入一个长度为n的长整数,结果
存放在(*p)中,其他说明参见WGetInt.
check函数编写格式如下: check(l) long l; { }
[返回值] 参见WGetInt [注意] WGetLong 在编辑前先显示 *p 的内容, 因此 *p 需赋初值。
● WGetDouble(x,y,m, n,p,help,check)
[语法] WGetLong (x,y,n,p,help,check) int x,y,m,n; double *p; int (* help)(),( * check)();
[说明] WGetDouble 在(x,y)处输入一个宽度为m, n个小数位 的double 型数,结果存放在(*p) 中,其他说明参见 WGetInt 。
check函数编写格式如下: check(l) double d; { }
[返回值] 参见WGetInt [注意] WGetDouble 在编辑前先显示 *p 的内容, 因此 *p 需赋初值。
● WGetDate(x,y, n,p,help,check)
[语法] WGetDate (x,y,n,p,help,check) int x,y,n; char *p; int (* help)(),( * check)();
[说明] WGetDate在(x,y)处输入一个宽度为n的日期. 结果存放 在(*p) 中,(p中应初始化为YYYY/MM/DD 型字符串), 其他说明参见 WGetString 。
check函数编写格式如下: check(s) char *s; { }
[返回值] 参见WGetString [注意] WGetDate 在编辑前先显示 p 的内容, 因此 p 需赋初值。
● WGetPassword
[语法] WGetPassword(x,y,n,p,help, check) int x,y,n; char *p; int ( * help) (),(* check) ();
[说明] WGetPassword 在(x,y)处输入一个宽度为n的口 令,输出时每个字符显示*,其他事项同WGetString。 check函数编写格式如下: check(s) char *s; { }
[返回值] 参见WGetString.
● WMenu
[语法] WMenu(MenuList, FirstID , MenuHelp) MenuIndex *MenuList; char *FirstID int (* MenuHelp)();
[说明] 在该系统中,程序员按一定的格式描述所有的菜单及 其相互关系,WMenu 按下列规则自动执行整个菜单系统。
- 选择某一菜单项后,如果该项对应一个子菜单,则执 行该子菜单,否则执行相应的函数。
- 在某一菜单按CTRL-D后返回上层菜单。
- 在任何时候按TAB键,执行用户定义的菜单帮助函数。
有关菜单的数据结构如下:
每个菜单项的定义:
typedef struct { char DisplayBar[41]; /*菜单项显示内容*/ char HelpInfo[81]; /*对应该菜单项的帮助信息*/ char NextMenuID[11]; /*子菜单ID ,空表示无子菜单*/ int (* Action)(); /*无子菜单的菜单项对应的执行函数*/ }MenuItemType;
每个菜单的定义:
typedef struct { char MenuID[11]; /*菜单ID */ char Tiltle[41]; /*菜单标题*/ int x, y, ItemN, ItemW, Jump, Colomn; /*(x,y) 菜单的左上角位置*/ /* ItemN 菜单项个数*/ /* IlemW 每个菜单项的宽度*/ /* Jump 0—菜单项之间不隔行 1—菜单项之间隔一行 /* Clomn菜单的列数 */ /* Position: 初始菜单项*/ MenuItemTupe MenuIlem [41]; /*每个菜单菜单项*/ }Menu;
菜单索引的定义:
typedef struct { char MenuID[11]; /*菜单ID */ Menu *MenuPointer; /*菜单指针*/ } MenuIndex: MenuHelp编写格式: help(s,c) char *s,c; /* s 菜单ID, c 菜单项首字母 */ { }
该函数的使用方法,请参照例子程序 m1.c, m2.c。
● WSetEditTerm, WEdit , WSetEditTerm2, WEdit2
[语法] WSetEditTerm(i,x,y,n,p,f,h,c) int i, x, y, n; char *p; int (*f) (), (*h), (*c) ();
WEdit(n) int n;
WSetEditTerm2(i,x,y,s,n,p,f,h,c) int i, x, y, n; char *s; int n; char *p; int (*f) (), (*h), (*c) ();
WEdit2(n) int n;
[说明] WSetEditTerm 与 WEdit 配合使用可完成全屏幕的字段 输入功能,WSetEditTerm设置每个编辑项, WEdit执行实 际的编辑操作。
i: 编辑项编号,从0连续向后排。 (x,y): 编辑项的输入位置 n: 编辑项宽度 p: 编辑项的存储空间 f: 编辑函数 h、c: 编辑函数使用的帮助及检查函数。
WSetEditTerm2 与 WEdit2 配合使用可完成全屏幕的字段 输入功能,WSetEditTerm2设置每个编辑项, WEdit2执行实 际的编辑操作。
i: 编辑项编号,从0连续向后排。 (x,y): 编辑项的输入位置 s 提示字符串 n: 编辑项宽度 p: 编辑项的存储空间 f: 编辑函数 h、c: 编辑函数使用的帮助及检查函数。
实际编辑位置为(x, y+stelen(s) + 2), 编辑域括在[ ]之中。 注意:用户定义的编辑函数 f的对外接口及返回值, 必须与WGetString等相同。否则将出现不可预 料的结果,上速函数的使用请参照例子 editdemo.c和 editdemo2.c。
● WFileEdit
[语法] WFileEdit(FileName,StartX, Row,FieldList,FieldN,Permision,TotalCheck,x0,y0) char *FileName; int StartX,Row; Field *FieldList; int FieldN,(* Check)(),(*TotakCheck)(); int x0,y0; [说明] WFileEdit 用于对文件FileName进行全屏幕编缉, 编缉区 从StartX行开始, 共有Row行.FileName文件由FieldN个字 段,字段之间由'|'分割,每个字段的属性由FieldList描述. 插入,删除之前调用Permision, 反回 1 表示允须 , 0 不允须
Permision 的编写格式: perm(ch, buf) char ch, *buf; { /* ch == 'n' 插入 ch == 'c' 删除 buf 指向当前记录 */ } TotakCheck() 在选存盘退出前调用 ,对输入内容进行全面检查: 返回值: 1 成功: WFileEdit 结束: 0 不成功: WFileEdit 继续: (x0,y0) 是存盘提示的左上角
TotalCheck 的编写格式: totalcheck(base, length, count); char *base; int length, count; { }
base 内存中文件基地址: length 每个记录长度: count 记录个数: 各字段之间'|' 分隔;
Field 定义:
typedef struct { int x , y , Width, w; char Type; int (* Check)(),( * Help)(); }Field (x,y) 字段的编缉位置 x = 0 WFieldEdit 自动调整 x != 0 WFieldEdit 不调整 Width 字段的宽度 w 小数位数 Type 字段的类型 's': 字符型 'i': 整型 'l': 长整型 'f': 浮点型 'd': 日期型 'p': 口令型 't': 只显型(不能修改)
Check, Help 字段的检查和帮助函数
[返回值] 0_不保存 1_保存 。
● WSelectOne
[语法] WSelectOne(FileName, StartX, Row,FieldList,FieldN,Mode,Act,UserBuf) char *FileName; int StartX,Row; Field *FieldList; int FieldN,Mode; int (* Act)(); char *UserBuf; [说明] WSelectOne 用于对文件FileName进行全屏幕流览, 流览区 从StartX行开始, 共有Row行.FileName文件由FieldN个字 段,字段之间由'|'分割,每个字段的属性由FieldList描述.
DispField 定义:
typedef struct { int x , y , Width, w; char Type; }DispField (x,y) 字段的编缉位置 x = 0 WSelectOne 自动调整 x != 0 WFieldEdit 不调整 Width 字段的宽度 w 小数位数 Type 字段的类型 's': 字符型 'i': 整型 'l': 长整型 'f': 浮点型 'd': 日期型 'p': 口令型 按回车键亮条所在当前行拷贝到内部暂存区 若 Mode : 0 拷贝暂存区到UserBufWSelectOne返回 . 1 调用Act ,WSelectOne不返回. Act编写格式 act(buf) char *buf; { } 见例子 select.c
[返回值] '\n' 或 '';
● WTextView
[语法] WTextView(x,y,l,c,v,f, n) int x,l,y,c,f, n; char *v; [说明] 用于窗口浏览一个文件 x 第x行 y 第y列 l 共l行 c 共c列 v 文件名 f 标志 1--左右移 0--不可移 n 前n行不移动
[返回值] 无 。
● GetOneField
[语法] int GetOneField(Buffer,n, Field,Seperator) char *Buffer; int n; char *Field, Seperator; [说明] GetOneField 从 Buffer 中取第n个字段放入Field中。 Buffer中的每个字段以Seperator 为分隔苻。 n 从 1 开始。
[返回值] 当Field为空时返回零,否则返回Field的长度。
● SenON, SemOff
[语法] int SemOn() char *Sem;
SemOff(fd) int fd;
[说明] SemOn占用信号灯Sem, 如Sem不存在则建立之,如果Sem 被其他别进程占用则等待,否则占用信号灯Sem,并返 回对应的文件描述符fd;
SemOff放弃fd所表示的信号灯。
[返回值] SemOn 返回信号灯文件描述字,Semoff无返回值。
● trim
[语法] trim(s) char *s;
[说明] 去掉 s的尾部空格。
[返回值] 无 。
● nstrcpy
[语法] nstrcpy (s,s2, n) char *s1,s2; int n;
[说明] 拷贝s2的前n个字符到s1,如果s2不足n个,则 在s1的后面补空格。
[返回值] 无 。 ● isin
[语法] isin(ch ,s ) char ch, *s;
[说明] 判断ch 是否在 s 中。
[返回值] 1_是 0_否。
● strrmb
[语法] strrmb(d,s) double d; char *s;
[说明] strrmb将double型数值转换为人民币大写放入 s 中。
[返回值] 无 。
=======================================================
● GetTmpFile(buf) char *buf; ● prtctrl(fp, dh, printer) File *fp; char *dh, *printer; ● chpass(s1,s2,s3,s4,pass) char *s1,*s2,*s3,*s4,pass[]; ● char *div(p,frm,va_alist) char *p,*frm; va_dcl ● trstr(s1,s2) char *s1, *s2;
| | |