发信人: aaaaaaaaa()
整理人: cobe(2000-02-13 00:08:40), 站内信件
|
编者的话
====================================================================
大家好!
欢迎大家回答问题和提出问题,同时也欢迎大家
提供有关VB和ASP的好作品。
版主 冯德平
[email protected]
=============================================
VB邮件(6.24)
a Visual Basic 中文本框处理技巧集萃
刘强
在Visual Basic中,文本框(TextBox)是最常用的控件,熟练运用文本框是 开发出高质量的应用程序的基础。笔者在从事应用程序开发中,摸索出有关文本 框的应用技巧,写出来与VB爱好者共享。
1、设置只读文本框。
有些时候在窗口显示一段信息,但又不希望用户去改变它,怎样实现文本的 只读呢?首先,我们可以利用标签框( label )的只读属性,以标签来代替文本 框以实现只读属性,但也可以用小程序实现真正的文本框的只读。
Sub Text1_KeyPress (keyascii As Integer)
keyascii = 0
End Sub
或者也可以用sendkey方法使文本框失去焦点,如以下程序:
Sub Text1_KeyDown (KeyCode As Integer, Shift As Integer)
SendKeys "{tab}"
End Sub
2、限定文本框的输入内容和格式。
以下程序可以实现限定文本框只能输入数字:
Sub Text1_KeyPress (keyascii As Integer)
If keyascii < 48 Or keyascii > 57 Then
Beep
Beep
[email protected]
keyascii = 0
End If
End Sub
若想限定文本框输入格式,可以使用VB的FORMAT函数,也可以使用专业版的 屏蔽控件(Masked Edit),通过设定屏蔽控件的Mask属性可以对文本框的输入格式 作精确控制。
3、为TextBox 创建快捷键。
VB规定,添加在窗体上的控件均在其Tabindex 属性中记载其加载顺序,程序 运行时焦点按Tabindex 属性规定的顺序在控件间跳转。而为了简化操作,可VB中 为任何具有 caption的属性的控制创建快捷键,这通过caption 属性中在想作为 快捷键的字母前加&号实现。但有一个问题值得注意,而类似文本框这样的控件无 caption 这样的属性,这时可将标签与文本框同时使用。为 lable创建快捷键, 标签 Tabindex 属性设置比文本框小1,又因为label 不能接收按点,焦点会自动 跳至文本框。这相当于为文本框创建了快捷键。具体步骤如下:
(1) 首先绘制标签,再绘制文本框。或随意绘制各种控制,将标签 Tabin dex 属性设置比文本框小1
(2) 在标签的caption 属性中使用“&”号设定快捷键
这样就相当于为文本框设定了快捷键,当你按下标签框的快捷键时,焦点就 会跳至文本框上。
4、在设计时实现文本框换行。
对于文本框,在设计时properties 窗口不能输入换行符,但可以再程序执行 时用代码来换行,即使用 ASCII字符的13和10,如下列小程序就可将两行文本放 入文本框:
Sub form_load( )
NL=chr(13)+chr(10)
text1.text=“my name is ”& NL & “ liu qiang”
End sub
5、创建口令文本框。
创建口令文本框可用设置属性的方法,也可以通过调用WINDOWS的API应用函 数接口来实现。首先,文本框的属性 Passwordchar和maxlength 可用来设置口令 框。其中 Passwordchar 指定文本框显示的字符,如指定“*”,则在文本框内显 示“*”,Maxlength确定文本框中能输入几个字符。超过Maxlength以后,文本框 发出警告声,不能接收更多的字符。若使用WINDOWS应用函数接口,可用GetWind owLong、SetWindowsLong和SendMessage等接口函数来实现,有兴趣的读者可查阅 Windows API函数手册或VB的联机帮助文件,这里就不一一赘述了。
b Visual Basic调用Windows API函数的应用举例
【 摘 要】
本 文 介 绍 了 利 用Visual Basic 调 用 Windows API 函 数 的 方 法, 并 通 过 举 例 介 绍 部 分
API 函 数 的 功 能 。 例 如:VB 程 序 私 有 初 始 化 参 数 的 存 取, 及 当 前 系 统 信 息 的 检 测。
【 关 键 字】
Windows Microsoft( 微 软) 公 司 的 视 窗 系 统。
Visual Basic(VB) Microsoft( 微 软) 公 司 的 可 视 化 编 程 工 具 。
API(Application Program Interface) 应 用 程 序 接 口。
初 始 化 文 件( 例 如:DEMO.INI)
【 正 文 】
一、 利 用VB 调 用API 函 数 的 方 法。
(1) 用Declare 语 句 申 明 所 要 调 用 的API 函 数, 若 该 函 数 务 返 回 值, 可 申 明 为Sub 过 程; 若 有 返 回 值, 则 可 申 明 为F unction 函 数。
注: 所 有 的API 函 数 的 申 明 都 在 .\VB\WINAPI\WIN31API.HLP 中, 只 需 用Copy 和 Paste 的 方 法 即 可 放 到 相 应 的 地 方。
(2) 一 旦 申 明 了 某 一 个API 函 数 后, 就 可 以 象 调 用VB 的 函 数 一 样。 但 需 注 意, 如 果 参 数 传 递 不 对, 可 能 会 导 致 死 机。
二、 VB 程 序 私 有 初 始 化 参 数 的 存 取。
Windows 软 件 的 初 始 化 参 数 的 获 取 与 保 存 是 通 过 读 取 扩 展 名 为 .INI 的 文 本 文 件 来 实 现 的, 即 程 序 运 行 前 先 从 指 定 的INI 文 件 中 搜 索 到 所 需 的 参 数, 并 反 映 到 程 序 的 运 行 环 境 中; 当 程 序 退 出 时 又 将 当 前 的 环 境 参 数 保 存 到 指 定 的INI 文 件 中。Windows 提 供 的API 函 数 中 的GetPrivateProfileSt ring 和WritePrivateProfileString 就 有 这 些 功 能。
说 明:
(1) GetPrivateProfileString 声 明:Declare Function GetPrivat eProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String,ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
功 能: 获 取INI 文 件 中 与 指 定 关 键 字 对 应 的 参 数( 字 符 串 性) 并 将 此 参 数 拷 贝 到lpReturnedString 中。
参 数
类 型
说 明
lpApplicationName
String
待 寻 找 的 关 键 字 所 在 的 段
lpKeyName
String
与 参 数 相 对 应 的 关 键 字 名
lpDefault
String
指 定 的 关 键 字 不 存 在 时 返 回 的 缺 省 值
lpReturnedString
String
预 先 分 配 好 的 长 度 至 少 为nSize 字 节 的 字 符 串 缓 冲 区
nSized
Integer
将 要 装 入lpReturnedString 缓 冲 区 的 最 大 字 符 数
lpFileName
String
初 始 化 文 件 的 名 字
返 回 值
Integer
拷 贝 到lpReturnedString 缓 冲 区 的 字 符 数
(2)WritePrivateProfileString
声 明:Declare Function WritePrivateProfileString Lib "kernel32 " Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As Strin g, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long
功 能: 在 初 始 化 文 件 的 指 定 关 键 字 项 内 设 置 参 数( 字 符 串)。
返 回 值: 如 果 设 置 成 功, 返 回TRUE; 否 则 返 回FALSE。
三、 VB 检 测 当 前 系 统 信 息
所 需 的API 函 数 有GetWindowsDirectory,GetWinFlags,GetVersion ,GetSystemDirectory, 等, 具 体 的 使 用 方 法 可 见 举 例。
四、 举 例
DEMO.PRJ
( 一) 建 立 项 目 文 件DEMO.PRJ; 建 立 模 块 文 件DEMO.BAS. 并 将 下 列 声 明 插 入 到DEMO.BAS 中。
Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetW indowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As L ong
Declare Function GetPrivateProfileString Lib "kernel32" Alias " GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lp KeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As S tring, ByVal nSize As Long, ByVal lpFileName As String) As Long
Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVa l lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long
Declare Function GetKeyboardType Lib "user32" (ByVal nTypeFlag As Long) As Long
Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSy stemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Lon g
Declare Function GetVersion Lib "kernel32" () As Long
Declare Function GetWinflags Lib "kernel32" () As Long
注:
GetWindowsDirectory: 该 函 数 获 取Windows 目 录 的 路 径。
GetSystemDirectory: 该 函 数 获 取Windows 系 统 子 目 录 的 路 径。
GetVersion: 该 函 数 返 回 当 前Windows 版 本 号 和DOS 版 本 号。 返 回 值 的 低 位 字 节 说 明Windows 主 版 本 号, 返 回 值 的 低 位 字 的 高 位 字 节 说 明Windows 副 版 本 号, 高 位 字 的 低 位 字 节 说 明D OS 副 版 本 号, 高 位 字 的 高 位 字 节 说 明DOS 主 版 本 号。
4、 GetWinflags: 该 函 数 返 回Windows 运 行 系 统 上 的 内 存 配 置。
返 回 标 志 值
含 意
WF_80X87
Intel 数 字 协 处 理 器
WF_CPU386
80386 CPU
WF_CPU486
80486 CPU
WF_ENHANCED
Windows 系 统 运 行 在386 增 强 模 式
WF_PMODE
Windows 系 统 运 行 在 保 护 模 式
WF_STANDARD
Windows 系 统 运 行 在 标 准 模 式
WF_WLO
运 行 在OS/2 下
5、GetKeyboardType(): 该 函 数 得 到 系 统 键 盘 类 型,nTypeFl ag=0 时 返 回 键 盘 类 型。
返 回 值
含 意
1
IBM PC/XT 或 兼 容 键 盘
2
Olivetti "ICO" 键 盘(102 个 键)
3
IBM 或 兼 容 键 盘(84 个 键)
4
IBM 增 强 型 或 相 似 键 盘(101 或102 个 键)
5
Nokia 1050 或 相 似 键 盘
6
Nokia 9140 或 相 似 键 盘
7
日 本 键 盘
6、 为 了 调 用 这 些API 函 数 更 加 方 便, 可 以 编 写 一 些 包 含 函 数。 这 些 用 户 自 定 义 函 数 的 功 能 也 需 要 在 模 块 中 。
Function SysDir()
Temp = Space$(255)
StringLen = GetSystemDirectory(Temp, 255)
SysDir = Left$(Temp, StringLen)
End Function
______________________________________________________________________ _____
Function WinDir() As String
Temp = Space$(255)
StringLen = GetWindowsDirectory(Temp, 255)
WinDir = Left$(Temp, StringLen)
End Function
______________________________________________________________________ _____
Function KeyType()
KbType = GetKeyboardType(0)
Select Case KbType
Case 1
KeyType="IBM PC\XT,or compatible(83key)"
Case 2
KeyType="Olivetti 'ICO'(102key)"
Case 3
KeyType="IBM AT,or similar(84key)"
Case 4
KeyType = "IBM Enhance (101 or 102 keys)"
Case 5
KeyType = "Nokia 1050 or similar"
Case 6
KeyType = "Nokia 1050 or similar"
Case 6
KeyType = "Nokia 9140 or similar"
Case 7
KeyType = "Japan Keyboard"
End Select
End Function
______________________________________________________________________ _____
Function Initial()
Form1.Left = Val(StringFormINI("Form", "left", "0 ", "c:\windows\demo. ini"))
Form1.Top = Val(StringFormINI("Form", "top", "0 ","c:\windows\demo.ini " ))
Form1.WindowState = Val(StringFormINI("Form", "windowstate", "0 ","
c:\windows\demo.ini"))
End Function
______________________________________________________________________ _
Function SaveInfor()
x = WritePrivateProfileString("Form", "left", Str$(Form1.Left),
"c:\windows\demo.ini")
x = WritePrivateProfileString("Form", "top", Str$(Form1.Top),
"c:\windows\demo.ini")
x = WritePrivateProfileString("Form", "windowstate", Str$
(Form1.WindowState), "c:\windows\demo.ini")
End Function
______________________________________________________________________ _____
Function StringFormINI(SectionName As String, KeyName As String,
Default As String, FileName As String) As String
MaxStringLen% = 255
returnedstr$ = Space$(MaxStringLen%)
Result% = GetPrivateProfileString(SectionName, KeyName,
Default, returnedstr$, MaxStringLen%, FileName)
returnedstr$ = LTrim$(RTrim$(returnedstr$))
returnedstr$ = Left$(returnedstr$, Len(returnedstr$) - 1)
StringFormINI = returnedstr$
End Function
______________________________________________________________________ ____
Function WinVer()
ver& = GetVersion()
winhigh = ver& Mod 256
winlow = Int(ver& / 256) Mod 256
WinVer = ((winhigh * 100) + winlow) / 100
End Function
______________________________________________________________________ _____
Function DosVer()
ver& = GetVersion()
Temp = ver& / 65536
doshigh = Int(Temp / 256) Mod 256
doslow = Temp Mod 256
DosVer = ((doshigh * 100) + doslow) / 100
End Function
______________________________________________________________________ _____
Function CPU()
Flags&=GetWinFlags()
Match=1
Select Case Match
Case (Flags& And &H8)\&H8
CPU=486
Case (Flags& And &H4)\&H4
CPU=386
End Select
End Function
______________________________________________________________________ _____
Function Mode()
Flags&=GetWinFlags()
If flags& And &H20 Then
Mode="Enhanced"
Else
Mode="Standard"
End If
End Function
( 二) 建 立 窗 体 文 件Form1.frm
Form1.Caption="System Information"
Sub Form_Paint()
Cls
Print
Print , "System Information"
Print
Print , "WindowsDir: ", WinDir()
Print , "SystemDir: ", SysDir()
Print , "WindowsVersion: ", WinVer()
Print , "DosVersion: ", DosVer()
Print , "KeyboardType: ", KeyType()
End Sub
Sub Form_Load()
x = Initial()
End Sub
Sub Form_Unload(Cancel As Integer)
x = SaveInfor()
End Sub
( 三) 运 行 本 程 序。( 本 程 序 在486 兼 容 机Windows3.1 下 通 过)
本 程 序 能 够 检 测 当 前 部 分 系 统 信 息, 在 退 出 时 能 将 窗 口 的 左、 上 位 置 及 窗 口 状 态 记 录 在DEMO.INI 文 件 中, 待 下 次 运 行 时, 窗 口 能 保 持 上 次 退 出 时 的 位 置 和 状 态。
注: 需 要 用 文 本 编 辑 器 编 辑DEMO.INI
[Form]
Left=100
Top=100
Windowstate=0
并 存 在 当 前 系 统Windows 目 录 下。
本 文 仅 仅 是 介 绍 了 一 下API 函 数 的 使 用 方 法, 以 作 抛 砖 引 玉 之 用。 真 正 的 应 用API 函 数, 还 需 要 更 详 尽 的 资 料 和 读 者 更 大 的 努 力。
【 参 考 书 目】
《Windows3.1 API 函 数、 数 据 结 构 和 消 息 详 解》
tulipen 推荐
c Visual Basic中的界面设计原则和编程技巧
中国科技大学 谢海永 赵保华
在VB里,MDI(Multiple Document Interface,多窗口程序)窗体是这样定义 的:“MDI窗体作为一个程序的后台窗口,包含着MDIChild属性为True的窗体”。 在一个VB程序中,至多只能存在一个MDI父窗体,可以有多个MDI子窗体;建立一 个MDI父窗体的方法是在VB的File菜单里选择“New MDI Form”。
在MDI程序运行时,如果子窗口具有菜单,那么当子窗口被激活时,子窗口的 菜单就会自动替换父窗口菜单;当子窗口被最小化时,在MDI父窗口里就会出现子 窗口的图标。
Windows的通用图形界面的出现,使计算机用户不必通过专门的学习就可以得 心应手地使用各种Windows的软件;不仅如此,它还是程序设计者在设计Windows 程序的界面时所必须遵循的标准,这在很大程度上减轻了程序设计者的负担,使 他们能够把主要精力放在问题的求解和实现上。
Visual Basic的出现,更加简化了Windows程序界面的设计工作,只需要极少 量的代码,就能实现标准Windows应用程序的界面。但是,如果不了解Windows程 序界面设计的原则,或者不熟悉VB下界面编程的技巧,就难以设计和实现既符合 一般标准又具有特色的界面。界面设计的原则界面设计具有一般性的原则,最为 重要的有:
1.界面要具有一致性。一致性原则在界面设计中最容易被违反,同时也最容 易修改和避免。例如,在菜单和联机帮助中必须使用相同的术语;对话框必须具 有相同的风格。
2.常用操作要有捷径。常用操作的使用频度大,应该减少操作序列的长度。 例如,为文件的常用操作如打开、存盘、另存等设置快捷键。使常用操作具有捷 径,不仅会提高用户的工作效率,还使得界面在功能实现上简洁和高效。
3.提供简单的错误处理。系统要有错误处理的功能。在出现错误时,系统应 该能检测出错误,并且提供简单和容易理解的错误处理的功能。错误出现后系统 的状态不发生变化,或者系统要提供错误恢复的指导。
4.提供信息反馈。对操作人员的重要操作要有信息反馈。对常用操作和简单 操作的反馈可以不作要求,但是对不常用操作和至关重要的操作,系统应该提供 信息的反馈。
5.操作可逆。操作应该可逆。这对于不具备专门的知识的操作人员相当有用 。可逆的动作可以是单个的操作,或是者一个相对独立的操作序列。
6.设计良好的联机帮助。虽然对于熟练用户来说,联机帮助并非必不可少, 但是对于大多数不熟练用户来说,联机帮助具有非常重要的作用。
菜单设计的原则和编程
菜单设计有如下的一般性原则:
1、按照系统的功能来组织菜单。
2、要选用广而浅的菜单树,而不是窄而深的菜单树。
3、根据菜单选项的含义进行分组;并且按一定的规则排序。菜单选项的标题 要力求简短、含义明确,并且最好以关键词开始。
4、常用选项要设置快捷键。结合以上的原则,菜单编程有以下几方面的技术 和技巧:
菜单选项的分组
在VB中,菜单选项的分组是通过菜单栏分隔横线实现的。在菜单的一定位置 增加一个Caption属性为“-”的菜单项,它在菜单上就表现为一条横线。在许 多情况下,同一个功能菜单下又可以按照菜单选项的功能分为几组,这时就可以 用分隔横线来实现菜单项的分组。
常用选项快捷键的设置
打开菜单设计窗口(Menu Design Window),应对于每个菜单选项有相应的快 捷键(Shortcut)列表 ,在该表中选择一个即可。需要注意的是,具有子菜单的菜 单或者顶层菜单的快捷键不能这样定义。按照Windows的界面设计原则,顶层菜单 的快捷键的形式是Alt+字母键。它的实现方法在后文另叙。
对于一些常用的功能菜单项,有约定俗成的快捷键。例如,文件打开用CTRL +O,文件存盘用CRTL+S,打印用CTRL+P,等等。
为菜单选项定义好快捷键之后,菜单上该选项的后面就出现了快捷键的文字 表示。
菜单选项的使能与禁止、可见与隐藏
为了表示菜单选项的一些特殊功能,可能要用到菜单选项的使能与禁止、可 见与隐藏属性。当因为某种原因使得某个选项所代表的功能不能被实现时,就应 该禁止该选项被选中。菜单选项的使能与禁止是通过改变改选项的Enabled属性实 现的。
举例来说,假设菜单选项名为nmuName,则禁止该选项可以如下实现:
mnuName.Enabled=False
同理,隐藏一个选项可以用 mnuName.Visible=False来实现,而使一个隐藏 的选项恢复可见则用 mnuName.Visible=True 实现。
菜单项的隐藏与恢复可见常常用在动态菜单的实现中。
菜单项的动态装入
菜单项的动态装入是指菜单项的个数不固定,并且能够在需要时动态地装入 。最简单的例子就是文件菜单中最近打开的文件的列表。在第一次打开文件之前 ,该列表是空的,并且不在文件菜单中出现;打开一个文件后,该列表不再是空 的,并且文件菜单中出现代表被打开文件的菜单项。
在上面的例子里,就综合运用了菜单项的下标属性(Index)、标题属性(Capt ion)、可见属性(Visible)以及菜单项的装入方法(LoadMethod)。
具体的实现过程如下:
在文件菜单里增加一个菜单项,标题任意,并假设菜单项的Name属性是open ed_files_list;
更改菜单项opened_files_list的可见属性,使opened_files_list.Visible =False
更改菜单项opened_files_list的下标属性,使opened_files_files_list.I ndex=0
在程序中控制菜单项opened_files_list的动态装入。
假设要显示打开过的第二文件的文件名,并且该文件名存放在一个文件名数 组opened_file_name里。以下的代码就实现了这一功能:
Load opened_files_list(1)
opened_files_lise(1).Caption="&2"+opened_file_name(1)
opened_files_list(1).Visible=True
需要注意的是,对于下标为0的菜单项,不能用Load方法。因为在程序执行时 ,该菜单项就已经被装入到内存里了;另外,在菜单项的标题属性字符里的“&” 字符具有特殊的含义,它的作用是在显示该属性字符串的同时,并不显示“&”本 身,而紧跟“&”的字符在显示时具有下划线,并且该字符成为热键。
如果下标不为0的菜单项不再需要,为了减少对内存资源的占用,可以用Unl oad方法把它从内存卸出;同样地,不能用Unload卸出下标为0的菜单项。
弹出式菜单的实现(PopupMenu Method)
VB中在菜单设计窗口(Menu Design Window) 中设计的菜单是下拉式菜单。下 拉式菜单是用户在任何时候都可以在顶端菜单条上选择后拉出的菜单,而弹出式 菜单则是在程序界面的一定区域内点按鼠标键后出现的菜单。在某些情况下,弹 出式菜单会使系统功能的实现更加简洁和高效,使用起来更加得心应手。
Widnows程序的弹出式菜单一般是当用户在程序的桌面上点按鼠标键时出现的 。弹出式菜单多用于实现系统的附加或增强功能。弹出式菜单的内容,可以随点 按鼠标键的位置不同而变化。由于弹出的菜单要覆盖屏幕的一部分,所以应尽量 缩短菜单里的文字。
在VB中,弹出式菜单的实现要用到下拉式菜单设计的技术和PopupMenu方法。 具体的做法是:
在菜单设计窗口(Menu Design Window)里设计好相应窗体的弹出式菜单。要 注意的是,要弹出的菜单必须至少有一个子菜单;因而这个菜单不能有快捷键, 并且Checked属性必须是False。再把弹出式菜单的Visible属性改为False。
在具有设计好的弹出式菜单的窗体的Form_Click中加入以下代码(假设弹出式 菜单的Name属性是mnuExample):
Sub Form_Click()
PopupMenu mnuExample
End Sub
如果要求只有按下鼠标左键或者右键才能激活菜单,就必须在Form_MouseDo wn里加入如下代码:
Sub Form_MouseDown(Button As Integer,Shift As Integer,x As Single,y As Single)
If Button=2 then Button=2 表 示 鼠 标 右 键
PopupMenu mnuExample
End If
PopupMenu 的 完 整 句 法 是:
[Form.]PopupMenu menuname[flags[,x[,y]]]
改变flags的值可以控制弹出式菜单的表现形式。flags有两组值。第一组值 用来控制菜单的显示方式,包括POPUPMENU_LEFTALIGN, POPUPMENU_CENTERALIGN , POPUPMENU_RIGHTALIGN, 分别表示以x为左边界,以x为中心和以x为右边界的 显示方式,并且以x为左边界是缺省的方式;另外一组值用来控制菜单项的选中方 式,包括POPUPMENU_LEFTBUTTON和POPUPMENU_RIGHTBUTTON,分别表示左键选中和 左/右键选中均可,并且左键选中是缺省的方式。flags的值由上面的两组值经过 OR运算得出。例如,要求左对齐显示并且左键选中为准,则应有:
flags=POPUPMENU_LEFTALIGN OR POPUPMENU_LEFTBUTTON
x和y用来定义菜单弹出的位置、缺省是鼠标点中的位置。
菜单项的其他属性
用ALT+字母键激活顶层菜单,或者在菜单激活后用字母键激活一个菜单项, 必须学会使用&。&用在菜单项的标题属性(Caption)里。它的用法和作用与在用C 语言编制的Windows程序中的用法和作用相同。
有时希望顶层菜单之间的间隔大一些,或者某个顶层菜单出现在菜单条的最 右端,这时就要用到标题属性是空格的菜单。如果一个菜单的标题是由多个空格 组成的,那么这个菜单在菜单条上就占用跟空格的个数相应的空间,并且它后面 的菜单也顺序地后移;如果这个菜单的Visible属性是False,那么它就跟不存在 一样。
窗口设计的原则和举例
下面是一个浮动窗口技术的例子。为了引起用户的注意,或者必须保证含有 重要信息的窗口不被其他窗口覆盖,就要用到浮动窗口技术,建立一个“总在最 前面”(TopMost)的窗口。具体的做法是:
(1)在VB程序中加入如下的声明:
Declare Function SetWindowPos Lib"user"(Byval h%,Byval hb%,Byval x%,By val y%,By
val cx%,Byval cy%,Byval f%)As Integer
Global Const SWP_NOMOVE=2
Global Const SWP_NOSIZE=1
Global Const HWND_TOPMOST= 1
Global Const HWND_NOTOPMOST=2
Global Const FLAGS=SWP_NOMOVE Or SWP_NOSIZE
(2)假设要把窗体frmExample设置成总在最前面的窗口,只要在frmExample窗 体的Form_Load过程里加入以下代码:
Dim success%
success=SetWindowPos(frmExample.hWnd,HWND_TOPMOST,0,0,0,0,FLAGS)
如果要取消总在最前面的特性,则可以执行如下的代码:
success=SetWindowPos(frmExample.hWnd,HWND_NOTOPMOST,0,0,0,0,FL AGS)
success不等于0表示SetWindowPos执行成功。
在MDI程序里,有一个窗口是所有其他窗口的父窗口,各个子窗口完成相对独 立的功能,就像是多个独立的工具组合起来一样。在这方面,MS Word和Windows 的File Manager是最好的例子。
=============================================
VB问答
问题部分:
回答部分:
=============================================
其它
====================================================================
欢迎订阅VB免费邮件:
订阅地址 http://server.com/WebApps/mail-list-subscribe.cgi?id=16852
====================================================================
如果您觉得这个邮件列表好的话,请告诉您的朋友。
====================================================================
欢迎投稿 [email protected]
====================================================================
网易上的主页地址:http://www4.netease.com/~aaaaaaaaa
本网站主页镜像地址:goodvbhome.yeah.net
====================================================================
-- 欢迎访问主页:goodvbhonme.yeah.net
或:http://www4.netease.com/~aaaaaaaaa
http://personal.gz168.gnet.gd.cn/vbok/
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.48.205]
|
|