重拾VB65:创建用户界面

来自MSDN-2001-OCT: Visual Tools and Languages/Visual Studio 6.0 Documentation/Visual Basic Documentation/Using Visual Basic/Programmer’s Guide/Part 2: What Can You Do With Visual Basic/Creating a User Interface

一、通用对象

(1)Visual Basic 中有四种通用对象:

通用对象类型 可引用的对象
Form 应用程序中的任何窗体(包括 MDI 子窗体和 MDI 窗体)。
Control 应用程序中的任何控件。
MDIForm 应用程序中的 MDI 窗体(如果应用程序有 MDI 窗体的话)。
Object 任何对象。

(2)下表说明不能用 New 关键字做什么。

不能用 New 创建 不允许的代码的例子
基本数据类型的变量。 Dim X As New Integer
任何通用对象类型的变量。 Dim X As New Control
任何特定控件类型的变量。 Dim X As New ListBox
任何特定控件的变量。 Dim X As New lstNames

二、窗体

(1)在窗体内,可用 Container 属性改变对象的容器。以下控件可包含其它控件:Frame 控件、PictureBox 控件、ToolBar 控件。

(2)注意 不必加载窗体就可调用窗体的变量或自定义方法,还可设置窗体的自定义属性。于是,不必将窗体加载到内存就可运行有关窗体的代码。同样,引用控件而不引用其属性或方法时也不会加载窗体。

(3)要使窗体变量和已加载窗体的实例一直存在,请用 Static 或 Public 变量,而不要用局部变量。(?但是貌似show之后就没事)

(4)释放对对象的引用。每个对象都使用内存和系统资源。当不再使用对象时及时释放这些资源,这是良好的编程习惯。用 Unload 从内存中卸载窗体或控件;用 Nothing 释放对象变量占用的资源。

三、多文档界面 (MDI) 应用程序

3.1 创建MDI窗体和子窗体

(1)MDI 窗体相似于具有一个限制条件的普通窗体。除非控件具有 Align 属性(如 PictureBox 控件)或者具有不可见界面(如 Timer 控件),否则不能将控件直接放置在 MDI 窗体上。

(2)注意 一个应用程序只能有一个 MDI 窗体。如果工程已经有了一个 MDI 窗体,则该“工程”菜单上的“添加 MDI 窗体”命令就不可使用。

(3)子窗体就是 MDIChild 属性设置为 True 的普通窗体。要创建一个 MDI 子窗体,先创建一个新窗体(或者打开一个存在的窗体),然后把它的 MDIChild 属性设为 True。

(4)注意 一个应用程序也可以包括标准的、不是包含在 MDI 窗体之内的非 MDI 窗体。 MDI 应用程序中标准窗体的典型用法是显示模式的对话框。

(5)活动子窗体的菜单(若有)将显示在 MDI 窗体的菜单栏中,而不是显示在子窗体中。

3.2 管理多个MDI子窗体

(1)使用 MDI 窗体的 ActiveForm 属性,该属性可以返回具有焦点的或者最后被激活的子窗体。注意 当访问 ActiveForm 属性时,至少应有一个 MDI 子窗体被加载或可见,否则会返回一个错误。ActiveControl 属性能返回活动子窗体上具有焦点的控件。

(2)假如,正在编写被多个窗体实例调用的代码,不用窗体标识符访问窗体的控件或属性是一个好办法。例如,用 Text1.Height 引用 Form1上文本框的高度,而不是使用 Form1.Text1.Height。这样,该代码总是影响当前窗体。

在代码中指定当前窗体的另一种方法是用 Me 关键字。用 Me 关键字来引用当前其代码正在运行的窗体。当需要把当前窗体实例的引用参数传递给过程时,这个关键字很有用。

(3)加载子窗体时,其父窗体(MDI 窗体)会自动加载并显示。而加载 MDI 窗体时,其子窗体并不会自动加载。

(4)通过设定 AutoShowChildren 属性,子窗体可以在窗体加载时自动显示 (True) 或自动隐藏 (False)。AutoShowChildren 属性可用来加载隐藏状态的 MDI 子窗口,使它们处于隐藏状态直至用 Show 方法把它们显示出来。这就允许在子窗体变成可见之前更新标题、位置和菜单等各种细节。

(5)不能把 MDI 子窗体或者 MDI 窗体显示为模式窗体(用带 vbModal 参数的 Show 方法)。如果想在 MDI 应用程序中使用模式对话框,可使用 MDIChild 属性设置为 False 的窗体。

(6)设置子窗体的大小和位置

如果 MDI 子窗体具有大小可变的边框〔即 BorderStyle = 2),在其装载时,Microsoft Windows 将决定其初始的高度、宽度和位置。边框大小可变的子窗体,其初始大小与位置取决于 MDI 窗体的大小,而不是设计时子窗体的大小。当 MDI 子窗体的边框大小不可变(即 BorderStyle = 0,1 或 3)时,则它将用设计时的 Height 和 Width 属性被载入。

如果设置 AutoShowChildren 为 False,则在 MDI 子窗体载入以后,把它设为可见状态之前,可以改变其位置。

(7)当 MDI 窗体被卸载时,QueryUnload 事件首先为 MDI 窗体调用,然后再为每一个打开的子窗体调用。如果在这些 QueryUnload 事件过程中没有代码,则取消 Unload 事件,然后,每一个子窗体被卸载,最后,MDI 窗体被卸载。

Mdinote.vbp 示例应用程序包含许多 MDI 技巧。

(8)在 MDI 窗体中使用 Arrange 方法来重新对齐子窗体。可以层叠、水平平铺或者沿着 MDI 窗体的下部排列的子窗体图标等方式来显示子窗体。

四、窗体的启动和应用程序的结束

(1)在缺省情况下,应用程序中的第一个窗体被指定为启动窗体。应用程序开始运行时,此窗体就被显示出来(因而最先执行的代码是该窗体的 Form_Initialize 事件中的代码)。如果想在应用程序启动时显示别的窗体,那么就得改变启动窗体。这可以在工程属性里设置。

(2)没有启动窗体时的启动:有时候也许要应用程序启动时不加载任何窗体。例如:可能想先运行装入数据文件的代码,然后再根据数据文件的内容决定显示几个不同窗体中的哪一个。要做到这一点,可在标准模块中创建一个名为 Main 的子过程。然后,“启动对象”框中选定“Sub Main”。

(3)显示启动时的快速显示:如果启动时有一个较长的执行过程,例如要从数据库中装入大量数据或者要装入一些大型位图,这时可能希望在启动时给出一个快速显示。快速显示是一种窗体,它通常显示的是诸如应用程序名,版权信息和一个简单的位图等内容。要显示快速显示,需用 Sub Main 过程作为启动对象,并用 Show 方法显示该窗体:

Private Sub Main()
'显示快速显示。
frmSplash.Show
'在此处添加启动过程。
...
'显示主窗体并卸载快速显示。
frmMain.Show
Unload frmSplash
End Sub

(4)结束应用程序:当所有窗体都已关闭并且没有代码正在执行时,事件驱动的应用程序就停止运行。如果最后一个可见窗体关闭时仍有隐藏窗体存在,那么,应用程序表现为已经结束了(因为没有可见的窗体),可实际上应用程序仍在继续运行,直至所有隐藏窗体都关闭为止。之所以出现这种情况,是因为对已卸载窗体的属性或控件的任何访问,都将导致隐含地、不予显示地加载那个窗体。

避免出现关闭应用程序时的这类问题,最好的办法是确保所有的窗体都已卸载。如果应用程序使用多窗体,通过把代码放入主窗体的 Unload 事件过程可以卸载这些窗体。可以使用 Forms 集合确保找到并关闭所有窗体。

(5)有一些情况需要不顾现存窗体或对象的状态而结束应用程序。为此,Visual Basic 提供了 End 语句。End 语句使应用程序立即结束:在 End 语句之后的代码不会执行,也不会再有事件发生。特别是,Visual Basic 将不执行任何窗体的 QueryUnload、Unload 或 Terminate 事件过程。对象的各个引用将被释放,但如果定义有自己的类,Visual Basic 将不执行由这些类所创建对象的 Terminate 事件。除 End 语句以外,Stop 语句可以暂停一个应用程序。然而,Stop 语句只能在调试时使用,因为它不释放对象的引用。

五、有关工具栏

(1)创建工具栏的过程;在 MDI 窗体上放置一个图片框。在图片框中,可以放置任何想在工具栏上显示的控件。典型地,用 CommandButton 或 Image 控件来创建工具栏按钮。

(2)可用一个不显示工具栏的 MDI 窗体来使用在运行时不可见的控件(比如 Timer 控件)。为了做到这一点,在 MDI 窗体上放置一个图片框,把控件放到图片框中,然后把图片框的 Visible 属性设置为 False。

六、协调菜单与工具栏的外观

(1)当由其它应用程序提供的对象在窗体中被激活时,有许多的方法让对象的菜单与工具栏出现在容器窗体内;然而,需要规定它们将如何显示。这一过程叫做用户界面协调,因为 Visual Basic 与已经链接或嵌入的对象必须协调容器窗体中的空间。

(2)通过设置窗体的 NegotiateMenus 属性可以决定一个链接或嵌入的对象的菜单是否出现在容器窗体中。MDI 窗体的 NegotiateToolbars 属性决定了链接或嵌入对象的工具栏是不固定的调色板还是被放置在父窗体上。如果 MDI 窗体包含工具栏,它通常被包含在父窗体的 PictureBox 控件中。图片框的 Negotiate 属性决定了被激活时容器的工具栏是继续显示还是被对象的工具栏所代替。

七、模式与无模式的对话框

(1)如果窗体显示为模式对话框,则只有当对话框关闭之后,在 Show 方法后的代码才能执行。然而,当窗体被显示为无模式对话框时,在该窗体显示出来以后,Show 方法后面的代码紧接着就会执行。

(2)在 Show 方法中使用 owner 参数,确保对话框在它的父窗体最小化时它也最小化,或者在其父窗体关闭时它也卸载。

(3)注意 所谓模式的,既可以局限于应用程序中,也可以局限于系统中。如果消息框的模式局限在应用程序中(缺省),则在这个对话框未消失之前不能切换到该应用程序的其他部分,但是可以切换到其他应用程序。在消息框未消失之前系统的模式消息框不允许切换到别的应用程序。

(4)提示 如果想完全删除对话框的标题栏,可以设置窗体的 ControlBox、MinButton 和 MaxButton 为 False;设置 BorderStyle 为尺寸不可变的设置(0、1 或 3),并设置 Caption 为空字符串 ("")。

(5)命令按钮控件的如下属性值得注意:Default,Cancel,TabIndex,TabStop

提示 一般说来,代表最可靠的或者最安全的操作的按钮应当是缺省按钮。例如,在“文本替换”对话框中,“取消”应当是缺省按钮,而不是“全部替换”。

要在窗体被显示时将焦点给某个命令按钮,则设置该命令按钮的 TabIndex 为 0,它的 TabStop 属性为 True。

任务 关键字
将窗体装入内存,但不显示。 用 Load 语句,或者引用窗体上的属性或控件。
装入并显示无模式窗体。 用 Show 方法。
装入并显示模式窗体。 style = vbModal 的 Show 方法。
显示已装入的窗体。 设置它的 Visible 属性为 True,或者使用 Show 方法。
从视窗中隐藏窗体。 设置它的 Visible 属性为 False,或者使用 Hide 方法。
从视窗中隐藏窗体并从内存中卸载。 用 Unload 语句。

八、设计与分辨率无关的窗体

(1)避免尺寸问题的最简单的方法是在 640 X 480 的分辨率下设计窗体。如果更喜欢在高一些的分辨率下工作,仍需要考虑窗体在低一些的分辨率下将如何显示。实现这一点的方法是用“Form Layout”窗口预览窗体的大小和位置。您也可以使用“Resolution Guides”观察在低分辨率时屏幕的哪些部分是可见的。要切换到“Resolution Guides”,可以在“Form Layout”窗口单击鼠标右键,从弹出菜单上选择“Resolution Guides”菜单项。

(2)在设计时可从“Form Layout”窗口的弹出菜单选择“Startup Position”菜单项来设置窗体的启动位置。同样,您也可以在运行时用下面的 Form Load 事件中的代码来设置窗体的位置:

Private Sub Form_Load()
Me.Move 0, 0
End Sub

若是设置窗体的 Left 与 Top 的属性都为 0 也能有同样的效果,但 Move 方法只要一步就能完成。

(3)Visual Basic 使用与设备无关的度量单位,缇,是用来计算尺寸与位置。Screen 对象的两个属性 TwipsPerPixelX 与 TwipsPerPixelY 可以用来确定运行时的显示尺寸。应用这些属性,可以编写代码来调整窗体以及控件的尺寸与位置。

(4)最好把应用程序使用的颜色局限于 Windows 标准的 16 颜色。这些颜色由 Visual Basic 的颜色常数来表示(如 vbBlack、vbBlue 和 vbCyan 等等)。如果在应用程序中需要用 16 种以上的颜色,那么对于文本、按钮以及其他界面元素仍然应当坚持用标准颜色。

九、界面设计的基础

(1)重要的或者频繁访问的元素应当放在显著的位置上,而不太重要的元素就应当降级到不太显著的位置上。大多数用户的眼睛会首先注视屏幕的左上部位,所以最重要的元素应当放在屏幕的左上部位。例如,如果窗体上的信息与客户有关,则它的名字字段应当显示在它能最先被看到的地方。而按钮,如“确定”或“下一个”,应当放置在屏幕的右下部位;用户在未完成对窗体的操作之前,通常不会访问这些按钮。

(2)把元素与控件分成组也很重要。尽量把信息按功能或关系进行逻辑地分组。

(3)在应用程序中不同的窗体之间保持一致性对其可用性有非常重要的作用。

(4)从美学的角度来讲,整洁、简单明了的设计常常更可取。比如:通过从原始保险单中创建字段的逻辑组,并使用有标签的界面或几个链接的窗体,就可以不要求滚动屏幕而显示所有的信息。也可以使用附加的控件,比如带有选取预装入的列表框,这些控件可以减少打字工作量。

(5)如果有代表性的用户没有联机帮助就不能立即完成想要完成的任务,那么就需要重新考虑设计了。

(6)除非计划按应用程序来配置字体,否则应当坚持使用标准 Windows 字体,如 Arial、New Times Roman 或者 System。如果用户的系统没有包含指定的字体,系统会使用替代的字体,其结果可能与设想的完全不一样。

(7)可用性的检测:让用户与原型应用程序在一起,然后观察它们;这种方式比询问用户更为有效。复查一下记录,考虑如何修改该界面使它更加可用。修改界面并再测试。一旦对应用程序可用性满意,就准备开始编码。在开发的过程中也需要不时地测试来确保对原型的设想是正确的。

(8)为了测试功能的可发现性,不解释如何做就要求用户完成一个任务(例如,使用“窗体模板”创建新文档)。如果他们不能完成这个任务,或者尝试了好多次,则此功能的可发现性还需要改进。

十、向用户提供帮助

(1)用tooltip向用户提供帮助信息。还可以设置窗体的WhatsThisHelp为true。

(2)在状态显示中显示的文本可以用以下两种方法中的一种来更新:用控件或窗体的 GotFocus 事件,或者用 MouseMove 事件。

(3)Visual Basic 的专业版与企业版包括了创建向导的工具:向导管理器。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr
今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBirthday, SecEmail, UserMob, UserSex, RealNameFirst, RealName, CheckCardID, CheckCardType, Contactemail
在VB6.0中,数据访问接口有三种: 1、ActiveX数据对象(ADO) 2、远程数据对象(RDO) 3、数据访问对象(DAO) 1.使用ADO(ActiveX Data Objec,ActiveX数据对象)连接SQL Server 1)使用ADO控件连接 使用ADO控件的ConnectionString属性就可以连接SQL Server,该属性包含一个由分号分隔的argument=value语
注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用。   特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如果电脑上有这些软件的话),因为现如今的360杀毒软件直接会对VB6.0软件误报,这样的话就可能会在安装过程中被误报阻止而导致安装失败,或者是安装后缺乏很多必须的组件(其它的杀毒软件或安全卫士之类的
Private Sub Form_Load() Call conndb End Sub Private Function conndb() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strCn, sql As String Dim db_host As String Dim db_user As String
  PPSM06S70:  Add  moddate  EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, ‘yyyy/mm/dd/HH24:MI AM‘)) ACTUAL_SHIPDATE   4.Test Scenario (1) :Query SQL Test DN:8016578337 SELECT CTRN.TKCTID TRUCK_ID,        
  沒有出現CrystalReportViewer時,須安裝CRforVS_13_0. 新增1個數據集,新增1個數據表,添加二列,列名要和資料庫名一樣. 修改目標Framework 修改app.config, <startup >改成<startup useLegacyV2RuntimeActivationPolicy ="true">  CrystalReport1.rpt增加數據庫專家 在表單
Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1() Dim i As Integer For i = 1 To 100 If Me.Label1.BackColor =
Friend Const PROCESS_ALL_ACCESS = &H1F0FFF = 2035711 Friend Const PROCESS_VM_READ = &H10 Friend Const PROCESS_VM_WRITE = &H20 Friend Const PAGE_READONLY = &H2 Friend Const PAGE_READWRITE = &H4 Friend
以下代码随手写的 并没有大量测试 效率也有待提升 如果需要C#的请自行转换 Function SplitBytes(Data As Byte(), Delimiter As Byte()) As List(Of Byte()) Dim i = 0 Dim List As New List(Of Byte()) Dim bytes As New
Imports System.Data.SqlClient Public Class Form1 REM Public conn1 As SqlConnection = New SqlConnection("server=.; Integrated Security=False;Initial Catalog= mydatabase1; User ID= sa;password")