标题: 通用菜单程序
kuge2004
LU新生
Rank: 1



UID 27915
精华 1
积分 9
帖子 14
活跃指数 1
LU金币 2008 个
LU金条 0 个
阅读权限 10
注册 2004-11-28
 
发表于 2005-1-14 15:57  资料  个人空间  短消息  加为好友 
简介:
curses的菜单库调用实在烦琐,并且菜单定义环节更是需要自己编程解决。前段时间看到网上的老贴--用菜单定义文件实现的那个,但是编程风格不太符合模块化、对象化的风格,并且菜单的选项不够丰富,要想自己扩充功能略显不便。

一气之下自己写了一个(不过,我是新人,漏洞百出,不过我觉得编程思想还是对路的,请论坛各位老大多批评!之所以贴出来,就是盼望从大家的意见、建议当中吸取借鉴,完善它!源码公开,大家自己也可以完善它!!字符界面的unix应用还是不少的啊!!)

菜单库的特点:选项丰富,可以实现任意列和行的菜单,并具有滚动功能,可以设置菜单的disable项,可以设置颜色...嗨,写起来太麻烦,还有很多预留的扩展功能,如果大家有兴趣,我愿意把完整文档还有hello world版例程贴出来。还有一个自己编的功能精简、支持汉字的form库,如果大家觉得需要可以回贴说明,我再另贴贴出。

最大的特色就是定义使用方便,我将在第一贴就贴出它的用法,大家看看如何。
菜单库中还有一些功能没有实现:例如在“对象化”(意思就是虽然不是c++,但尽量采用封装思想)的前提下,如何自动恢复被覆盖的屏幕内容,还有一个就是多选,当初设计的时候,由于这个菜单库主要面向命令菜单选择,因此没有加上这个功能。

程序组成:
一个通用库 gcommon.c及头文件
一个菜单库 gmenu.c 及头文件
一个常用常量和变量定义头文件 gcdk.h

2005-1-15:
感谢无双斑竹加精!小弟潜水多日,初次发言,得到一个“精”真是高兴!
要说明的是:代码量比较大,注意的话还能看到不完备的注释,那是因为我参考了一些GNU库源码的编辑风格,也是在学习之中,希望程序写得规范化。大家可能看起来比较累。
不过提供的5个文件是可以在SCO OSR5.0.7 / gcc 2.95上编译通过的,我尽快贴出hello world版例程,好让大家理解。

说了以上这么多,希望大家多题意见,共同完善!


2005-1-29:
改正了源程序中的一个bug,另外文档资料在抽空写.

顶部
kuge2004
LU新生
Rank: 1



UID 27915
精华 1
积分 9
帖子 14
活跃指数 1
LU金币 2008 个
LU金条 0 个
阅读权限 10
注册 2004-11-28
 
发表于 2005-1-14 16:08  资料  个人空间  短消息  加为好友 
首先是菜单定义,放到你主程序的头文件中:

CODE


#include <gmenu.h>
/* ---------------------------------------------------------------- */
/*                       MENU DEFINITIONS                           */
/* ---------------------------------------------------------------- */
/* 这里是函数表定义就是菜单序号与功能的关联表 */
/* 具体每项什么含义,看后面的gmenu.h类型定义 */
/* 当然中间的函数名,是我程序里的,你要替换成自己的处理函数 */
static FUNCS functable[] = {
   { 11, 'F', TF_UserPwdChange,    NULL  },
   { 12, 'F', TF_UserLogin,        NULL  },    
   { 13, 'F', TF_UserManager,      NULL  },
   { 14, 'F', TF_ResetUserPwd,     NULL  },
   { 21, 'F', TF_InquireFee,    NULL  },
   { 22, 'F', TF_PrintBankbook,    NULL  },
   { 23, 'F', TF_ChangeBankbook,   NULL  },
   { 31, 'F', TF_BatchDownload,    NULL  },
   { 32, 'F', TF_BuildUploadFile,  NULL  },
   { 33, 'F', TF_ImportBatchFile,  NULL  },
   { 34, 'F', TF_Saving,      NULL  },
   { 35, 'F', TF_CheckDayAccounts, NULL  },
   { 35, 'F', TF_DayFinalOperate,  NULL  },
   { 37, 'F', TF_PrintReport,      NULL  },
   { 41, 'F', TF_PayersManage,  NULL  },
   { 42, 'F', TF_ParamSetup,       NULL  },
   {  5, 'F', TF_Exiting,          NULL  },
   {  0, '@', NULL,                NULL  }
};

/* Menu Definitions */
/* 定义菜单的功能序号(跟上面的关联)、菜单项名称、子菜单 */
/* 可以看到这里就可以定义菜单之间的关联了 */
/* 每个数组代表一个菜单,子菜单只要说明指向的数组就行啦 */
/* 结构定义也在gmenu.h中 */
/* itemid, name, desc, opts, subitems, submenu, imenu, userptr, index, y, x */
static ITEM mi_360[] = {
 { 361, "361 代扣成功清单" },
 { 362, "362 存盘失败记录" },
 { 363, "363 代扣失败清单" },
 { 364, "364 按开户局分类汇总报表" },
 { 0 }
};

static ITEM mi_101[] = {
 { 11, "11 更改柜员密码" },
 { 12, "12 重新登录"     },
 { 13, "13 柜员信息维护" },
 { 14, "14 重置柜员密码" },
 { 0 }
};

static ITEM mi_102[] = {
 { 11, "11 更改柜员密码" },
 { 12, "12 重新登录"     },
 { 0 }
};

static ITEM mi_20[] = {
 { 21, "21 查询款项"   },                        
 { 22, "22 打印记录" },
 { 23, "23 更换登记卡" },
 { 0 }
};

static ITEM mi_30[] = {
 { 31, "31 批量下载数据" },                        
 { 32, "32 生成代扣文件" },
 { 33, "33 导入代扣结果" },
 { 34, "34 存盘"          },
 { 35, "35 对当日帐"     },
 { 36, "36 日终处理"     },
 { 37, "37 报表打印", "", ITO_DEFAULT, mi_360 },
 { 0 }
};

static ITEM mi_40[] = {
 { 41, "41 资料维护" },
 { 42, "42 业务参数维护"   },
 { 0 }
};

/**************MAIN MENUS*********************/
static ITEM mi_main1[] = {
 { 1, "1 柜员功能", "", ITO_DEFAULT,mi_101 },                        
 { 2, "2 前台操作", "", ITO_DEFAULT,mi_20  },
 { 3, "3 后台操作", "", ITO_DEFAULT,mi_30  },
 { 4, "4 系统维护", "", ITO_DEFAULT,mi_40  },
 { 5, "5 退出系统"   },
 { 0 }
};


顶部
kuge2004
LU新生
Rank: 1



UID 27915
精华 1
积分 9
帖子 14
活跃指数 1
LU金币 2008 个
LU金条 0 个
阅读权限 10
注册 2004-11-28
 
发表于 2005-1-14 16:13  资料  个人空间  短消息  加为好友 
精华来了,看我怎么调用吧:
CODE


/* 用popup_menu_byitems弹出根菜单,其它参数定义菜单大小位置,请看gmenu.c中的原型 */
/* 函数会把用户选择的菜单项序号传给rtn */
rtn=popup_menu_byitems(mi_main1, 0, 0, 3, 0);
/* 用封装好的函数Get_Func_Ord找出函数对照表中的函数指针,然后调用,就这么简单 */
if ( (i=Get_Func_Ord(functable,rtn) )>0 ){
         (* functable[i].pfunc)();


顶部
kuge2004
LU新生
Rank: 1



UID 27915
精华 1
积分 9
帖子 14
活跃指数 1
LU金币 2008 个
LU金条 0 个
阅读权限 10
注册 2004-11-28
 
发表于 2005-1-14 16:14  资料  个人空间  短消息  加为好友 
源代码改成附件了:



 附件: 您所在的用户组无法下载或查看附件
顶部
jxppp
LU幼天使
Rank: 2


LU爱心使者  
UID 21356
精华 0
积分 154
帖子 297
活跃指数 3
LU金币 53 个
LU金条 5441 个
阅读权限 20
注册 2004-5-21
 
发表于 2005-1-14 19:59  资料  个人空间  短消息  加为好友 
顶一下.

顶部
无双
荣誉斑竹
Rank: 14Rank: 14Rank: 14Rank: 14
天才猪



UID 4
精华 84
积分 5863
帖子 11390
活跃指数 0
LU金币 4248 个
LU金条 0 个
阅读权限 200
注册 2003-9-16
来自 杭州
 
发表于 2005-1-15 12:41  资料  个人空间  主页 短消息  加为好友 
good

虽然没有编译





不要问我结果 我只研究过程与思路
无双客栈
顶部
[广告] 记录自己的思想火花,留住每日的技术积累,尽在拥有属于自己独立域名的博客。
fanbing66
LU新生
Rank: 1



UID 28786
精华 0
积分 1
帖子 2
活跃指数 0
LU金币 2006 个
LU金条 0 个
阅读权限 10
注册 2005-1-6
 
发表于 2005-1-17 23:16  资料  个人空间  短消息  加为好友 
历害,小弟也得向这个水平发展

顶部
[广告] 记录自己的思想火花,留住每日的技术积累,尽在拥有属于自己独立域名的博客。
wbxaa1
LU新生
Rank: 1



UID 28236
精华 0
积分 6
帖子 12
活跃指数 0
LU金币 2006 个
LU金条 0 个
阅读权限 10
注册 2004-12-13
 
发表于 2005-1-24 10:30  资料  个人空间  短消息  加为好友 
老大能不能把例程发给我?先谢谢了。w_b_xaa@sina.com

顶部
[广告] 记录自己的思想火花,留住每日的技术积累,尽在拥有属于自己独立域名的博客。
kuge2004
LU新生
Rank: 1



UID 27915
精华 1
积分 9
帖子 14
活跃指数 1
LU金币 2008 个
LU金条 0 个
阅读权限 10
注册 2004-11-28
 
发表于 2005-1-25 08:56  资料  个人空间  短消息  加为好友 
hello world版例程
CODE
#include "gmenu.h"

static FUNCS functable[] = {
   {  1, 'F', TF_Hello,    NULL  },
   {  0, '@', NULL,                NULL  }
};

static ITEM mi[] = {
 { 1, "1 Selection1"   },                        
 { 1, "2 Selection2"   },
 { 1, "3 Selection3"   },
 { 0 }
};

static int
TF_Hello()
{
   mvprintw(LINES-1, 0, "Hello world!");  
   return 1;
}

extern int
main()
{
   int  rtn;
   
   win_initial();
   
   rtn = popup_menu_byitems(mi, 0, 0, 3, 1);
   if ( Get_Func_Ord(functable,rtn) >= 0 ){
       (* functable[i].pfunc)();
   }
   
   win_end();
}

顶部
[广告] 记录自己的思想火花,留住每日的技术积累,尽在拥有属于自己独立域名的博客。
kuge2004
LU新生
Rank: 1



UID 27915
精华 1
积分 9
帖子 14
活跃指数 1
LU金币 2008 个
LU金条 0 个
阅读权限 10
注册 2004-11-28
 
发表于 2005-1-25 09:03  资料  个人空间  短消息  加为好友 
截了一个屏,用的是这个菜单库。



 附件: 您所在的用户组无法下载或查看附件
顶部
wbxaa1
LU新生
Rank: 1



UID 28236
精华 0
积分 6
帖子 12
活跃指数 0
LU金币 2006 个
LU金条 0 个
阅读权限 10
注册 2004-12-13
 
发表于 2005-1-25 13:01  资料  个人空间  短消息  加为好友 
运行成功了界面如下:
user posted image



 附件: 您所在的用户组无法下载或查看附件
顶部
wbxaa1
LU新生
Rank: 1



UID 28236
精华 0
积分 6
帖子 12
活跃指数 0
LU金币 2006 个
LU金条 0 个
阅读权限 10
注册 2004-12-13
 
发表于 2005-1-25 13:10  资料  个人空间  短消息  加为好友 
我想得到如下的程序界面能帮帮我吗?
user posted image



 附件: 您所在的用户组无法下载或查看附件
顶部
 



当前时区 GMT+8, 现在时间是 2008-12-3 07:50
乐悠LoveUnix论坛-京ICP备05005823号

Thanks to Discuz!  © 2001-2007    Power by LoveUnix.net
Processed in 0.056082 second(s), 6 queries , Gzip enabled

清除 Cookies - 联系我们 - 乐悠LoveUnix - Archiver