📄 9928.txt
字号:
1. 用背景图片的作法及标准制作一幅封底图片Over.bmp,尺寸为屏幕大小,
以全部覆盖主菜单窗口空白区为准。如果屏幕分辩率为640×480,则封底图片
大概为640×440象素左右。
2. 建立一个文件名为 Over.scx 的新表单 FORM2。设置表单FORM2的Picture
属性为 Over.bmp,再设置属性AutoCenter=.T.,Borderstyle= 2-双线边框,
MaxButton=.F.,MinButton=.F.,Movlable=.F.,Height=440,Width=640等。
3. 在表单FORM2中加入两个标签对象Lable1和Lable2,按实际情况调整好
Lable1和Lable2的位置,设置Lable1和Lable2 的属性AutoSize=.T.,
BackStyle =0-透明,Caption="",FontName=隶书,设置Lable1属性FontSize=36,
设置Lable2 的属性FontSize=24。
4. 鼠标点击“表单控制栏”中的“OLE容器控制”,拖动到表单FORM2中建立
Olecontrol1对象,在弹出的“插入对象”窗口中选择“媒体剪辑”对象类型,
选中“以图标显示”框,将其隐藏。在打开的“媒体播放机”窗口中,从文件
列表中选择一.wav文件或.MID文作为封底背景音乐,选择“编辑”菜单下“选
项”中的“自动重复”,将其设为循还播放,并去掉“重放的控制条”的选中
标记,让音乐播放时不出现“媒体播放机”界面,确认后退出。然后设置
Olecontrol1的属性Visible=.F.,AutoSize=.T.。
5. 在表单FORM2的Avtivate过程中加入语句:
Public t &&定义全局变量t
t=0
a="人事管理系统"+chr(13)+chr(13)
b=" 项目策划:李湘江"+chr(13)+chr(13)
c=" 软件设计:李湘江"+chr(13)+chr(13)
d="矩菱机电工作室出品"+chr(13)
e=" 一九九八年二月"
thisform.label2.caption=a
thisform.label1.caption=b+c +d +e
thisform.olecontrol1.doverb(0) &&打开Olecontrol1对象
6. 在表单FORM2中加入一个计时器对象Timer1,设置Timer1的Interval属性
为了30(0.03秒),在Timer1的Time过程加入程序语句:
If t<3000 then &&时间控制
t=t+4
if t<=255 then
thisform.label1.forecolor=RGB(t,0,0) &&颜色渐变,黑→红
else
if t<=510 then
thisform.label1.forecolor=RGB(255,t-255,0) &&颜色渐变,红→黄
else
thisform.label2.top=thisform.label2.top-1 &&字幕label2上移
thisform.label1.top=thisform.label1.top-1 &&字幕label1上移
endif
endif
endif
7. 在表单 FORM2 的 Click 过程中加入语句:
release t &&释放全局变量t
release thisform &&释放封底表单
8. 在主文件程序的最后面加入语句:
DO FORM Over.scx &&执行封底表单
9. 实现效果:执行应用程序后,在退出应用程序时,出现动态封底,同时
响起优美的音乐。鼠标单击封底画面,封底关闭,返回Windows桌面。
****************************************************************
为FoxPro中的弹出式菜单增加自学习功能
中国人民银行安徽省分行(230022) 杨晓峰
开发过应用系统的人都知道,使用FoxPro for Win-dows在用屏幕生成器进行
数据窗口设 计的过程中,经常要使用弹出式菜单(POPUP)来设计进行数据输入
的数据入口。弹出式菜单平 常在屏幕上只会显示一个选项的内容,当您用鼠
标选择它或按下空白键、ENTER键时,它就在 屏幕上出现一个窗口和一些供用
户选择的选项。使用弹出式菜单有两个方面的优点:一个优 点是用户可以不
在该数据入口中输入数据,而只需在该弹出项提供的有效选项中选择一项即可;
使用弹出式菜单的另一个优点是它能保证数据输入的有效性,由于用户只限于
从菜单弹出 的选项中选择数据,所以不会产生输入错误。但是,我们在开发软
件的过程中发现弹出式菜单 存在一个缺点:就是当弹出式菜单所弹出的选项
不包括用户所要输入的数据时,则系统无法让 用户输入正确的数据。本文所
叙述的方法(以FoxPro 2.5 for Windows为例),就是为了改进 弹出式菜单的
这一缺点,为弹出式菜单增加让用户输入数据的功能,并能够将用户输入的数
据自动添加到弹出式菜单的选项中(即我们所说的自学习功能),以便用户以后
输入数据时选择 使用。
实现效果
我们可以在数据窗口中将一个数据入口定义为弹出式菜单(POPUP),并在该弹
出式菜单的 相同位置上定义一个输入字段(INPUT FIELD),该字段与弹出式菜
单大小相同,其初始状态为 Initially Disable Field,被弹出式菜单完全覆
盖。当第一次使用该弹出式菜单时,其弹出 的选项中只出现"其它"一项。如
果用户输入数据时发现菜单弹出的选项中不包括所要输入的 数据,则可以选
"其它"项。这时数据窗口中在弹出式菜单的位置上将出现一个输入字段,并且
该输入字段可以把弹出式菜单完全覆盖,用户就可以在这个输入字段上输入新
的数据,输入完 毕后该输入字段将又被弹出式菜单覆盖,屏幕上弹出式菜单显
示为刚输入的内容。用户每次 在这个输入字段中输入的新数据(必须是原弹
出式菜单的选项中没有的)都将作为一个新的选 项加入到弹出式菜单的选项
中,而选项中的"其它"项将始终是选项的最后一项。
实现方法
我们假设是为数据库ab.dbf定义一个数据窗口ab.scx,数据库ab.dbf中有一个
字符型字 段aa,数据窗口ab.scx中将与aa字段相对应的数据入口变量m.aa定义
为弹出式菜单(POPUP), 其Array Popup的名为aalist。另为该弹出式菜单定义
一个相对应的输入字段(INPUT FIELD ),其字段名为m.newaa。
(一)定义数据窗口ab.scx,选择Screen/Layout后进入Screen Code,在
Screen Setup Co de中输入以下程序段:
&& 该程序段的功能是初始化和生成数组aalist
PRIVATE m.popupedit, m.savrec, m.aacnt
m.popupedit = .F.
m.aacnt = 0
DIMENSION aalist[1]
m.savrec = RECNO()
GO TOP
SCAN FOR NOT DELETED()
m.string = ALLTRIM(aa)&& 取字段内容
IF NOT EMPTY(m.string) AND ASCAN(aalist
m.string) = 0
&& 确认数组aalist中是否不包括该字段内容
m.aacnt = m.aacnt + 1
IF m.aacnt > ALEN(aalist)
DIMENSION aalist[m.aacnt]
ENDIF
aalist[m.aacnt] = m.string && 把该字段内容加入
到数组aalist中
ENDIF
ENDSCAN
DIMENSION aalist[m.aacnt]
= ASORT(aalist) && 为数组aalist排序
m.aacnt = m.aacnt + 1
DIMENSION aalist[m.aacnt]
aalist [m.aacnt] = "其它"&& 把"其它"项加入到数组aalist的最后一项
GOTO RECORD m.savrec
SCATTER MEMVAR MEMO BLANK
(二)在数据窗口ab.scx中定义一个弹出式菜单,进入Popup对话框,把该对话框
的Variab le栏定义为m.aa,Option栏中选Array Popup,并在该栏输入数组名
aalist。Clause栏中选Va lid项,输入以下程序段:
&& 该程序段的功能是当在弹出式菜单中选择"其它"时,激活输入字段m.newaa
IF m.aa = "其它"
m.popupedit = .T.
SHOW GET m.newaa ENABLE
_CUROBJ = OBJNUM(m.newaa)
ENDIF
(三)在数据窗口ab.scx中与弹出式菜单相同的位置上定义一个输入字段
(INPUT FIELD) ,并调整该字段的大小使其可以把弹出式菜单完全覆盖。进入
Field对话框后,在Field栏选I nput Field (Get)项,Options栏选In-itially
Disable Field和Select Field on Entry两 项,Input栏输入m.newaa。Clause
栏中选Valid项,然后输入以下程序段:
IF EMPTY(m.newaa) OR ASCAN(aalist, m.newaa)<>0
RETURN .T.
ENDIF &&m.newaa为空或已存在于aalist中,则返回
= AINS(aalist,m.aacnt)
aalist[m.aacnt] = ALLTRIM(m.newaa)&&在aalist中插入新元素,其内容为m.newaa
= ASORT(aalist)&& 为数组aalist排序
m.aacnt = m.aacnt+1
DIMENSION aalist[m.aacnt]
aalist[m.aacnt] = "其它"&& "其它" 项追加到数组aalist的最后
REPLACE aa WITH ALLTRIM(m.newaa) && 修改数据库中的字段
m.newaa = ""
m.popupedit = .F.
SHOW GET m.newaa DISABLE
SHOW GET m.aa
(四)在数据窗口ab.scx中,选择Screen/Object Order进入Object Order屏幕。
在这个屏 幕中调整弹出式菜单m.aa与输入字段m.newaa的排列顺序,使得m.aa排
列在m.newaa的前面,屏 幕显示时m.aa就可以将m.newaa覆盖。这样,在输入过程
中先输入m.aa,当用户在m.aa中选择 "其它"项时,输入字段m.newaa才显示出来
让用户输入新的数据。
(五)在定义输入字段m.newaa的过程中,应在其Clause栏Valid项的程序段中,适
当加入一 些有关数据有效性校验的命令,以保证输入数据正确、有效。
****************************************************************
在PowerBuilder中利用动态链接库控制鼠标的移动
长沙左家垅省计量局 傅胜
---- PowerBuilder 为 程 序 员 提 供 了 改 变 鼠 标 形 状的 方 法,
却 没 有 提 供 控 制 鼠 标 移 动 位 置 的 方法。 其 实 在Windows 95
系 统 中, 已 经 为 程 序 员 提供 了 控 制 鼠 标 位 置 的 方 法,
利 用USER32.DLL 动 态链 接 库 中 的SetCursorPos() 函 数 就 可 以
灵 活 控 制鼠 标 的 位 置。
---- 动 态 链 接 库(dynamic link library, DLL ) 是Windows中 最 重
要 的 部 分 之 一, Windows 中 的 运 行 程 序 可以 共 享DLL 中 的
函 数 和 子 例 程, 从 而 使 应 用 程 序可 以 共 享 代 码, 减 少
内 存 占 用。
---- 要 在PowerBuilder 中 调 用 外 部 函 数, 必 须 先 声明 它。
有 两 种 类 型 的 外 部 函 数: 全 局 外 部 函 数和 局 部 外 部
函 数。 全 局 外 部 函 数 可 以 在 应 用程 序 的 任 何 地 方 声
明 使 用。 它 们 在 应 用 程 序中 与 其 他 全 局 变 量 一 起 保
存。 局 部 外 部 函 数可 以 为 窗 口, 菜 单, 用 户 对 象 定 义,
它 们 是 对象 定 义 的 一 部 分。
---- 定 义 外 部 函 数 的 语 法 如 下 所 示:
{Access} Function ReturndataType Name({REF}{DataType]Arg],...
DataTypeN ArgN}] Library LibName
参数 描述
Access (只有在定义局部外部函数时使用)
可定义为Public, Protected或者
Private。缺省情况为Public。
ReturnDataType 函数的返回类型。
Name 函数名。
DataType1到 参数类型。
DataTypeN 如果是传值,可直接将参数写上。
如果是传参数,要在参数类型前加
上一个关健字REF。
Arg1到 参数名。
ArgN
LibName 动态链接库名。
在PowerBuilder的主菜单上选取
"Declare"的菜单项,然后选择子菜单项
"Global External Function",
在定义全局外部函数对话框中,输入:
FUNCTION long SetCursorPos(long x,long y) LIBRARY "USER32.dll"
---- 注 意: 对 于 关 键 字"SetCursorPos" 中 的 大 小 写 字 母 必
须 严 格 区 分。
---- 这 样, 程 序 员 就 可 以 在 应 用 程 序 的 任 何 位 置 使
用 该 函 数 了, 例 如 要 将 鼠 标 定 位 到 屏 幕 中 央, 则 在
程 序 中 加 入SetCursorPos(320,240), 这 里 假 设 当 前 屏 幕 的
分 辨 率 为640*480。
---- 当 然, 我 们 还 可 做 更 复 杂 的 控 制。 例 如 要 使 用 户
在 单 行 编 辑 器 中 输 入 完 后, 鼠 标 定 位 到"OK" 按 钮 上,
则 在 单 行 编 辑 器 的losefocus 事 件
中 输 入:
long x1,y1
x1=(w_genapp_about.x+cb_ok.x+cb_ok.width/2)
x1=UnitsToPixels(x1, XUnitsToPixels!)
// 获 取"OK" 按 钮 的X 坐 标;
y1=(w_genapp_about.y+cb_ok.y+cb_ok.height/2+100)
y1=UnitsToPixels(y1, YUnitsToPixels!)
// 获 取"OK" 按 钮 的Y 坐 标;
SetCursorPos(x1,y1)
---- 如 果 要 使 鼠 标 从 坐 标(100,200) 移 到 坐 标(500,200),
并 产 生 动 画 效 果, 则 编 程 如 下:
long i,j
for i=100 to 500
SetCursorPos(i,200)
for j=1 to 999 //起延时作用,可根据实际情况调整;
next
next
---- 灵 活 地 控 制 鼠 标 位 置, 能 使 程 序 更 加 有 趣, 对 用
户 也 更 友 好。
****************************************************************
WIN95界面下的VC++串口通讯程序
南京石油物探研究所 吴凤华
----Microsoft Visual C++以其界面的开放性著称,因其简单易学、32位面
向对象的程序设计及Activate X的灵活性而受广大计算机开发者的青睐,广
泛应用于各个领域。怎样利用VC++进行串口的通讯编程,这是一种基本功。
特别是在实时监控、大小型设备的整个生产过程控制等方面,VC++的串口编
程显得尤为重要。我曾参与编写了无线电非法频段占用的实时监控系统、混
凝土搅拌自动化生产控制系统。下面就自己的一点经验体会与读者分享。
----一般情况下的串口通讯无非采用两种方法:一是利用Windows的通讯API
函数,二是利用VC++(或其它语言)的标准通讯函数_inp、_outp来实现。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -