ccidnet????

出版日期:1999-08-09 总期号:847 本年期号:57

本期导读
要闻综合
电脑工作室
市场
硬件
软件
infotimes
设计通用 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 && 返回阴影颜色



  以上程序在作者编写的“住院处收费网络系统”中运行正常。

  读者也可以根据以上程序稍作修改,就可以做出“警告”、“提示”之类的窗口。这样,对于以后的编程工作来说会事半功倍的。