选择显示字体大小

用basic语言设计windows风格的用户接口


  basic语言历史悠久,近年来发展迅速。basic语言的结构化程度高,易于理解,很适合广大的编程人员使用。而第三代basic语言的功能更是日臻完善、强大,使用人员更多。

本文意在向编程经验不十分丰富的读者介绍用basic语言设计windows风格的图形用户接口,起一点抛砖引玉的作用,不妥之处望不吝赐教。程序
在vga(用screen 12语句设置)方式下运行,可在quick basic、ms basic或visual basic for ms-dos下编译。另外需要说明的是程序中设置颜色使用的都是调色板位置号,一个调色板位置号并不固定代表某种特定颜色,而是可以由编程者通过palette语句或palette using语句自行指定的。当然,一般情况下我们使用系统缺省的调色板颜色。

1.读点阵字模交叉显示汉字及ascii字符。

这里要用到ucdos 3.1的hzk16和asc16两个字模文件,该功能模块的代码如下:

sub disphz (hzcol%, hzrow%, color%, hzstr$)

dim i1, i2, i3, i, c1, c2, f, g, hzchar, ascchar as integer

dim hzby as string * 32

dim ascby as string * 16

dim l, hzrec as long

open "hzk16" for binary as #1 `打开汉字库文件

open "asc16" for binary as #2 `打开ascii码字库文件

hzlen% = len(hzstr$) `计算字符串长度

hzpos% = 1 `置字符串的首字节为当前字节

while hzpos% <= hzlen% `字符串显示完前一直循环

i = asc(mid$(hzstr$, hzpos%, 1)) `获取当前字符的ascii值

if i > &ha0 then `判断是否为汉字内码

if f = 0 then `f为零则该字节为汉字区码

c1 = i - &ha1 `计算区码

f = -1 `置f为非零

else `f不为零则该字节为汉字位码

c2 = i - &ha1 `计算位码

f = 0 `置f为零

hzrec = c1 * 94 + c2 `计算汉字在字库中的记录号

l = hzrec * 32 + 1 `计算汉字在字库中的起始字节位置

get #1, l, hzby `从l开始读取32字节

for i1 = 0 to 15 `字模垂直方向16行点

for i2 = 0 to 1 `每行16个点对应的两个字节

hzchar = asc(mid$(hzby, i1 * 2 + i2 + 1, 1)) `每个字节的ascii值

for i3 = 0 to 7 `每个字节的8位

if (hzchar (2 & (7 - i3))) and &h1 then `若该位是1

pset (hzcol% + i2 * 8 + i3, hzrow% + i1), color% `画点

end if

next i3

next i2

next i1

hzcol% = hzcol% + 16 `将光标置于下一个字符的左上角

end if

else `不是汉字内码则为ascii码

l = i * 16 + 1 `计算ascii字符在字库中的起始字节位置

get #2, l, ascby `从l开始读取16字节

for i1 = 0 to 15

`字模垂直方向16行点,每行对应1个字节

ascchar = asc(mid$(ascby, i1 + 1, 1)) `每个字节的ascii值

for i3 = 0 to 7 `每个字节的8位

if (ascchar (2 & (7 - i3))) and &h1 then `若该位是1

pset (hzcol% + i3, hzrow% + i1), color% `画点

end if

next i3

next i1

hzcul% = hzcul% + 8 `光标置于下一个字符的左上角

end if

hzpos% = hzpos% + 1 `置字符串的下一个字节为当前字节

wend

close

end sub

参数hzcol%、hzrow%是所要显示字符串的左上角坐标,color%是字符串的颜色,hzstr$ 是要显示的字符串,其中可包含汉字、图形符号和ascii字符。

2.windows风格图形界面。

windows界面简洁、美观、标准,用basic语言的图形函数可以很方便地生成一个windo ws风格界面。

先用view (0, 0)-(639, 479), 3设置背景色,再调用下面的过程生成窗口,调用一次生成一个窗口。参数le%、top%、ri%、bo%指定窗口左上角和右下角的坐标,frmcol%、titco l%是工作区和标题栏背景色,title$、menu$是标题和菜单的文字内容。例如,以下调用将生成一个主窗口和一个子窗口:

myform 30, 30, 609, 440, 7, 4, "程序主窗口", "文件[f] 选项[o] 窗口[w] 帮助[h]"

myform 70, 90, 569, 400, 15, 1, "程序子窗口", "文件[f] 编辑[e] 搜索[s] 运行[r] 帮助[h]"

过程代码如下:

sub myform (le%, top%, ri%, bo%, frmcol%, titcol%, title$, menu$)

x% = ri% - le%: y% = bo% - top%

view (le%, top%)-(ri%, bo%),

line (0, 0)-(x%, y%), 0, b ` 画窗体

line (3, 3)-(x% - 3, y% - 3), 0,

line (0, 22)-(x%, 22),

line (4, 41)-(x% - 4, 41),

paint (30, 30), 15, 0 ` 填充颜色

paint (30, 10), titcol%,

paint (10, 50), frmcol%,

view (le% + 3, top% + 3)-(le% + 22, top% + 22),

line (0, 0)-(19, 19), 0, b `画控制钮

line (4, 9)-(16, 11), 8,

line (3, 8)-(15, 10), 0,

line (4, 9)-(14, 9), 15

view (le%, top%)-(ri%, bo%)

disphz (x% - len(title$) * 8) / 2 - 9, 5, 15, ti-tle$ `标题

disphz 12, 23, 0, menu$ `主菜单

end sub

用类似方法还可以生成其它windows风格部件,包括三维风格部件。

3.下拉菜单


下拉菜单是通过用get语句保存菜单弹出前的屏幕内容,用put语句恢复先前保存的屏幕内容实现的,有关内容许多书上都有介绍,这里不再赘述。

4.键盘和鼠标控制


键盘和鼠标操作通过bios中断调用的循环检测来实现。

int 16h是键盘中断、int 33h是 microsoft 鼠标中断,通过这两个中断的功能调用就可以分别用键盘和鼠标控制程序。仅仅使用键盘操作的程序在需要键盘控制时可以用int 16h的功能00h在键盘缓冲区中无键入码时等待键盘输入,一旦有键入码就读取并进行相应处理。倘若还要同时使用鼠标进行程序控制,就不能用这种终止程序运行等待用户操作的方法 ,这是因为程序要不断查询鼠标驱动程序以实时确定鼠标的状态。为此可以在每次循环内调用int 16h的功能00h前,先调用功能01h弄清键盘缓冲区中是否有按键等待处理,若无则不执行对功能00h的调用,直接执行鼠标功能。限于篇幅这里只简单举例说明,读者可照此在自己的程序中加入响应特定键盘按键和鼠标输入的代码,实现对程序的"键盘-鼠标"双重控制。

先定义键盘和鼠标的中断调用模块:

static sub keystroke (k0%, k1%, k2%)

dim regs as regtype

regs.ax = k0%

interrupt &h16, regs, regs

k1% = regs.ax

k2% = regs.flags and &h40 `得到标志寄存器的零标志位

end sub

static sub moudrv (m0%, m1%, m2%, m3%)

dim regs as regtype

regs.ax = m0%

regs.bx = m1%

regs.cx = m2%

regs.dx = m3%

interrupt &h33, regs, regs

m0% = regs.ax

m1% = regs.bx

m2% = regs.cx

m3% = regs.dx

end sub

函数moupoll用来查询鼠标光标的坐标和左右按键是否被按下:

static sub moupoll (row%, col%, lbutton%, rbutton%)

moudrv 3, button%, col%, row%

if button% and 1 then lbutton% = -1 else lbutton% =

if button% and 2 then rbutton% = -1 else rbutton% =

end sub

下面是本例的主程序,其中的循环将实时检测且在屏幕上显示键盘击键的ascii键值和扫描码、鼠标按键状况和光标坐标,程序将一直运行直到按了"alt-x"为止。

`$include: `qbx.bi`

moudrv 0, 0, 0, 0 `初始化鼠标驱动程序

moudrv 1, 0, 0, 0 `显示鼠标光标

locate 16, 1: print "press `alt-x` to end program."

while (not alt_x%)

keystroke &h100, code%, zf% `检查是否有击键码

if zf% = 0 then `零标志位是零表示有击键可用

keystroke &h0, code%, zf% `取得击键

keycode% = code% and &hff `取出击键的ascii键值

scancode% = (code% and &hff00) 256 `取出击键的扫描码

if scancode% = 45 then altlt_x% = -1 `按"alt-x"键则退出循环

locate 18, 1: print "keycode: "; keycode%

locate 19, 1: print "scancode: "; scancode%

else `零标志位是1表示无击键可用,进入鼠标例程

moupoll row%, col%, lbutton%, rbutton% `取得鼠标状态

if lbutton% then `左键按下

button$ = "left

else if rbutton% then button$ = "right" `右键按下

else button$ = "none " `左右键均未按下

end if

locate 21, 1: print "button: "; button$

locate 22, 1: print "position: "; row%; ", "; col%

end if

wend

moudrv 2, 0, 0, 0 `隐藏鼠标光标


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons