VB 版 (精华区)

发信人: Sun (大灯泡), 信区: VisualBasic
标  题: 设计通用 MessageBox 窗口函数 
发信站: 哈工大紫丁香 (Sat Sep  4 17:09:45 1999), 转信

   
  李森 

在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(COLO
R_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 && 返回阴影颜色


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

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

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: sun@hope.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.881毫秒