
| 出版日期:1999-08-09 总期号:847 本年期号:57 |
|
设计通用 messagebox 窗口函数
李森 在windows环境下编写程序的程序员都知道:windows有一个很有用的api函数messagebox。通过messagebox某些参数的传递我们可以做出诸如“选择”、“警告”、“提示”等等用户界面效果。foxpro for dos 却缺少这么一个有用的函数。那么,我们可以给它增加一个类似的函数。 以下为此函数源程序: **选择窗口主程序 function yesno ************ ** 我们预定义可以输入至多5个参数 parameters message1,message2,message3,message4,message5 ** 将以前定义的热键压入堆栈 push key clear ** 关闭 esc 热键 set esca off ** 关闭回显设置 set talk off private delay_time ** 如果参数不符合规定 if parameters()==0 or parameters() 〉 5 message1="zigzag software group" messagenum=1 && 参数个数为1 else messagenum=parameters() && 得到参数个数 endif wlength=0 && 窗口可能的长度 for n=1 to messagenum messtemp="message"+str(n,1) wlengthtemp=len(&messtemp)+4 if wlength〈wlengthtemp wlength=wlengthtemp && 得到窗口可能的最大长度 endif endfor wheight=9+messagenum && 窗口的最大高度 if wlength〈40 && 如果窗口长度小于40 wlength=40 endif if mod(wlength,2) # 0 && 如果长度不是2的倍数 wlength=wlength+1 endif if mod(wlength,4) # 0 && 保持汉字的兼容性,使不会出现半个汉字的现像 wlength=wlength+2 endif yesnocolor="13" && 窗口的颜色模式,可以按爱好更改 ** 定义弹出窗口,使之处于屏幕中间 define window w_yesno ; from ; int((srow()-wheight)/2),int((scol()-wlength)/2) ; to int((srow()-wheight)/2)+wheight-1,int((scol()-wlength)/2)+wlength-1 ; none shadow color scheme &yesnocolor ** 激活窗口,但是不显示,避免闪烁 activate window w_yesno noshow ** 以下几行美化窗口 @0,0 say replicate(chr(223),wcols()) color w+/w @1,0 say padc("〉 确 认 窗 〈" , wcols()) color gr+/w @1,1 say "*" color r/w @2,0 say replicate(chr(220),wcols()) color n+/w @wrows()-2,0 say replicate(chr(223),wcols()) color w+/w @wrows()-1,0 say replicate(chr(220),wcols()) color n+/w ** 显示通过参数传递的消息 for n=1 to messagenum messtemp="message"+str(n,1) @n+3,1 say padc(&messtemp,wcols()-2) endfor ** 定义按键 private user_menu dimension user_menu[2,2] user_menu[1,1]=" 确 认 " user_menu[1,2]="〉 确 认 〈" user_menu[2,1]=" 取 消 " user_menu[2,2]="〉 取 消 〈" private shadow_color shadow_color=shadow(yesnocolor) && 按键的阴影颜色 menurow=wrows()-4 ** 描绘按键的阴影 @menurow+1, int((wcols()/2-10)/2)+1 say replicate(chr(223),10) color &shadow_color @menurow , int((wcols()/2-10)/2) say replicate(chr(20),10)+chr(220) color &shadow_color @menurow+1, int(wcols()/2)+int((wcols()/2-10)/2)+1 say replicate(chr(223),10) color &shadow_color @menurow, int(wcols()/2)+int((wcols()/2-10)/2) say replicate(chr(20),10)+chr(220) color &shadow_color ** 显示窗口 show window w_yesno ** 预定义返回变量 private choice_value choice_value=1 do while .t. do case && 描绘按键 case choice_value==1 @menurow, int((wcols()/2-10)/2) say user_menu[1,2] color (scheme(18,6)) @menurow, int(wcols()/2)+int((wcols()/2-10)/2) say user_menu[2,1] color (scheme(18,2)) case choice_value==2 @menurow, int((wcols()/2-10)/2) say user_menu[1,1] color (scheme(18,2)) @menurow, int(wcols()/2)+int((wcols()/2-10)/2) say user_menu[2,2] color (scheme(18,6)) endcase private keyput keyput=inkey(0) && 捕获键盘输入 do case case keyput==27 && esc 键 choice_value=0 exit case keyput==13 && 回车键 exit case keyput==4 or keyput==19 && 左右方向键 if choice_value==1 choice_value=2 else choice_value=1 endif otherwise ?? chr(7) && 若是其他键则响铃 endcase enddo release window w_yesno pop key return choice_value && 返回值:0: esc, 1: 确定, 2: 取消 ** 获取颜色序列中的阴影颜色 function shadow ************** parameters color_set && 颜色序列号 private shadow_color f type('color_set')=="c" color_set=val(color_set) endif && 获取阴影颜色对 shadow_color=substr(scheme(color_set,1),atc('/',scheme(color_set),1)+1) if atc('*',shadow_color)!=0 shadow_color=left(shadow_color,len(shadow_color)-1)+"/"+shadow_color else shadow_color="n/"+shadow_color endif return shadow_color && 返回阴影颜色 以上程序在作者编写的“住院处收费网络系统”中运行正常。 读者也可以根据以上程序稍作修改,就可以做出“警告”、“提示”之类的窗口。这样,对于以后的编程工作来说会事半功倍的。 |
|||||||||||||||||