vb的用户界面(二)

MDI NotePad应用程序
MDI NotePad 示例应用程序是一个简单的文本编辑器,它与 MicrosoftWindows 中包含的 NotePad 应用程序相似。不过,MDI NotePad 应用程序使用的是一个多文档界面 (MDI)。在运行时,若用户需要一个新文档(用该应用程序的“文件”菜单中的“新建”命令执行),应用程序就会创建子窗体的一个新实例。这就允许按其所需创建多个子窗体或文档。
在 Visual Basic 中为了创建以文档为中心的应用程序,至少需要两个窗体:一个 MDI 窗体和一个子窗体。设计时,应创建一个 MDI 窗体以容纳该应用程序,再创建一个子窗体作为这个应用程序文档的模板。
要创建自己的 MDI NotePad 应用程序,请按照以下步骤执行:
1. 从“文件”菜单中,选取“新建工程”命令。
2. 从“工程”菜单中,选取“添加 MDI 窗体”命令来创建容器窗体。现在,这个工程应当包含一个 MDI 窗体 (MDIForm1) 和 一个标准窗体(Form1)。
3. 在 Form1 上创建一个文本框 (Text1)。
4. 按下列方式为两个窗体和文本框设置属性。

6. 在 mnuFileNew_Click 过程中增加以下代码:
Private Sub mnuFileNew_Click ()
' 创建名为 NewDoc 的窗体 Form1 的一个新实例。
Dim NewDoc As New Form1
' 显示此新窗体。
NewDoc.Show
End Sub
这个过程创建并显示 Form1 的名为 NewDoc 的一个新实例(或其副本)。每当从“文件”菜单中选取“新建”命令时,将会创建一个与 Form1完全相同的副本(实例),它包含 Form1 所包含的所有控件和代码。
7. 给 Form1 窗体的 Form_Resize 过程添加以下代码:
Private Sub Form_Resize()
' 扩展文本框以放置当前子窗体。
Text1.Height = ScaleHeight
Text1.Width = ScaleWidth
End Sub
Form_Resize 事件过程的代码,像Form1 中的所有代码一样,能为 Form1的每一个实例所共享。当显示窗体的几个副本时,每个窗体都能识别各自的事件。当一个事件出现时,该事件过程的代码就会被调用。由于相同的代码为每个实例所共享,关于调用该代码的窗体是如何引用的,尤其是每个实例都具有相同的名字 (Form1) 时。这个问题将在本章后面的“使用 MDI 窗体及其子窗体”一节中讨论。 8. 按 F5 键可运行该应用程序。
提示 除了本章提到的以外,Mdinote.vbp 示例应用程序还包含许多 MDI技巧。花一些时间对该示例代码进行全面研究会找到这些技巧。Sdinote.vbp 示例应用程序是同一应用程序转换为 SDI 样式的实现;比较这两个例子可以明白 MDI 和 SDI 技巧的差别。

使用 MDI 窗体及其子窗体
当 MDI 应用程序在一次会话中要打开、保存和关闭几个子窗体时,应当能够引用活动窗体和保持关于子窗体的状态信息。这个主题描述了一些用来指定活动子窗体或者控件、加载和卸载 MDI 窗体及其子窗体、以及保持子窗体的状态信息的编码技巧。

指定活动子窗体或控件
有时要提供一条命令,它用于对当前活动子窗体上具有焦点的控件进行操作。例如,假设想从子窗体的文本框中把所选文本复制到剪贴板上。在Mdinote.vbp 示例应用程序中,“编辑”菜单上的“复制”项的 Click 事件将会调用 EditCopyProc,它是把选定的文本复制到剪贴板上的过程。
由于应用程序可以有同一子窗体的许多实例,EditCopyProc 需要知道使用的是哪一个窗体。为了指定这一点,使用 MDI 窗体的 ActiveForm 属性,该属性可以返回具有焦点的或者最后被激活的子窗体。
注意 当访问 ActiveForm 属性时,至少应有一个 MDI 子窗体被加载或可见,否则会返回一个错误。
当一个窗体中有几个控件时,也需要指定哪个控件是活动的。像 ActiveForm属性一样,ActiveControl 属性能返回活动子窗体上具有焦点的控件。下边是副本例程的示例,从子窗体菜单、MDI 窗体菜单或者是工具栏按钮上可对它进行调用。
Private Sub EditCopyProc ()
' 将选定文本复制到剪贴板上。
ClipBoard.SetText _
frmMDI.ActiveForm.ActiveControl.SelText
End Sub
假如,正在编写被多个窗体实例调用的代码,不用窗体标识符访问窗体的控件或属性是一个好办法。例如,用 Text1.Height 引用 Form1上文本框的高度,而不是使用 Form1.Text1.Height。这样,该代码总是影响当前窗体。
在代码中指定当前窗体的另一种方法是用 Me 关键字。用 Me 关键字来引用当前其代码正在运行的窗体。当需要把当前窗体实例的引用参数传递给过程时,这个关键字很有用。
详细信息 有关通过 Dim 语句用 New 关键字来创建多个窗体实例的信息,请参阅第五章“编程基础”中的“变量、常数和数据类型概述”,以及《语言参考》的“Dim 语句”。有关通过 Dim 语句用 New 关键字来创建多个窗体实例的信息,请参阅“编程基础”中的“变量、常数和数据类型概述”,和《语言参考》的“Dim 语句”。

加载 MDI 窗体及其子窗体
加载子窗体时,其父窗体(MDI 窗体)会自动加载并显示。而加载 MDI 窗体时,其子窗体并不会自动加载。
在 MDI NotePad 示例中,子窗体是缺省的启动窗体,因而在程序运行时,子窗体和 MDI 窗体两者都会加载。如果在 MDI NotePad 应用程序中改变启动窗体为 frmMDI(在“工程属性”的“一般”选项卡上),然后运行应用程序,则只有 MDI 窗体被加载。当从“文件”菜单中选取“新建”命令时,才会加载第一个子窗体。
AutoShowChildren 属性可用来加载隐藏状态的 MDI 子窗口,使它们处于隐藏状态直至用 Show 方法把它们显示出来。这就允许在子窗体变成可见之前更新标题、位置和菜单等各种细节。
不能把 MDI 子窗体或者 MDI 窗体显示为模式窗体(用带 vbModal 参数的 Show 方法)。如果想在 MDI 应用程序中使用模式对话框,可使用MDIChild 属性设置为 False 的窗体。

设置子窗体的大小和位置
如果 MDI 子窗体具有大小可变的边框〔即 BorderStyle = 2),在其装载时,Microsoft Windows 将决定其初始的高度、宽度和位置。边框大小可变的子窗体,其初始大小与位置取决于 MDI 窗体的大小,而不是设计时子窗体的大小。当 MDI 子窗体的边框大小不可变(即 BorderStyle = 0,1 或 3)时,则它将用设计时的 Height 和 Width 属性被载入。
如果设置 AutoShowChildren 为 False,则在 MDI 子窗体载入以后,把它设为可见状态之前,可以改变其位置。
详细信息 请参阅《语言参考》的“AutoShowChildren 属性”和“ Show 方法”。

维护子窗体的状态信息
在用户决定退出 MDI 应用程序时,必须有保存信息的机会。为了使其能够进行,应用程序必须随时都能确定自上次保存以来子窗体中的数据是否有改变。
通过在每个子窗体中声明一个公用变量来实现此功能。例如,可以在子窗体的声明部分声明一个变量:
Public boolDirty As Boolean
Text1 中的文本每改变一次时,子窗体文本框的 Change 事件就会将boolDirty 设置为 True。可添加此代码以指示自上次保存以来 Text1 的内容已经改变。
Private Sub Text1_Change ()
boolDirty = True
End Sub
反之,用户每次保存子窗体的内容时,文本框的 Change 事件就将 boolDirty设置为 False,以指示 Text1 的内容不再需要保存。在下列代码中,假设有一个叫做“保存”(mnuFileSave) 的菜单命令和一个用来保存文本框内容的名为 FileSave 的过程:
Sub mnuFileSave_Click ()
'保存 Text1 的内容。
FileSave
'设置状态变量。
boolDirty = False
End Sub

用 QueryUnload 卸载 MDI 窗体
当用户决定退出应用程序时,boolDirty 标志就很有用了。当用户从 MDI 窗体的“控制”菜单中选取“关闭”,或者从提供的菜单项,例如“文件”菜单上的“退出”命令,上述情况就会出现。如果用户使用 MDI 窗体的“控制”菜单来关闭应用程序,Visual Basic 将试图卸载 MDI 窗体。
当 MDI 窗体被卸载时,QueryUnload 事件首先为 MDI 窗体调用,然后再为每一个打开的子窗体调用。如果在这些 QueryUnload 事件过程中没有代码,则取消 Unload 事件,然后,每一个子窗体被卸载,最后,MDI 窗体被卸载。
由于 QueryUnload 事件在窗体卸载之前被调用,因此在窗体卸载前可以给用户一个机会来保存窗体。下述代码使用 boolDirty 标志来决定是否要提醒用户在子窗体卸载之前进行保存。请注意,可以在工程的任何地方访问公共窗体级变量值。这个代码假定有一个名叫 FileSave 的过程,它将 Text1的内容保存到一个文件中。
Private Sub mnuFExit_Click()
'当用户在 MDI 应用程序中选取“文件提出”命令时,卸载
'MDI 窗体,为每个打开的子窗体调用 QueryUnload 事件。
Unload frmMDI
End
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, _
UnloadMode As Integer)
If boolDirty Then
'调用例程来询问用户且必要时保存文件。
FileSave
End If
End Sub
详细信息 请参阅《语言参考》的“QueryUnload 事件”。

时间: 2024-09-14 03:43:28

vb的用户界面(二)的相关文章

走近VB.Net(十二) 注册表快速入门

快速入门|注册表 走近VB.Net(十二) 注册表快速入门 作者:hejianzhong VB.Net中文站(http://vbnetcn.126.com) 首先介绍一下注册表的相关基础知识:注册表的每一个文件夹被称为一个Key(项),这个文件夹的子文件夹被称为SubKey(子项),而在一个子项中有不同的Value Name(值项-即数值顶),值项后面就是你要保存的数据Value Data(数据)了.而在子项中通常都有一个Default Value 是默认的Value Name,相信打开过注册表

关于VB对AUTOCAD二次开发问题

问题描述 因为不是系统的学习过VBNET,所以对很多东西也不了解.网上查找了好几天关于VB对AUTOCAD二次开发的有关资料,貌似是这样的一.可以通过objectARX进行开发,引用1.AutoCAD.NETAPI由不同的DLL文件:二.也可以用ActiveX外部调用CAD.但是,都没有什么详细一点的教程.都是没有前戏直入主题为主.比如方法一需要引用AcDbMgd.dll..AcMgd.dll.AcCui.dll等文件,是如何引用,引用后在编译时出错是怎么解决是那里设置问题还是什么问题,本人到现

vb的用户界面(一)

界面样式 如果使用过基于 Windows 的应用程序,也许已经注意到不是所有用户界面看上去或操作起来都一样.用户界面样式主要有两种:单文档界面 (SDI) 和多文档界面 (MDI).SDI 界面的一个示例就是 Microsoft Windows 中的WordPad(记事本)应用程序(图 6.1).在 WordPad 中,只能打开一个文档,想要打开另一个文档时,必须先关上已打开的文档. 象Microsoft Excel和Microsoft Word for Windows这样的应用程序就是MDI界

vb编码(二)

自动完成编码Visual Basic 能自动填充语句.属性和参数,这些性能使编写代码更加方便.在输入代码时,编辑器列举适当的选择.语句或函数原型或值.通过"工具"菜单上的"选项"命令访问"选项"对话框,在"选项"对话框的"编辑器"选项卡上可用这样的选项,由它们决定是允许还是禁止各代码的设置值.在代码中输入一控件名时,"自动列出成员特性"会亮出这个控件的下拉式属性表(图 5.5).键入属性

vb神童教程(续)

第一部分:vb数据库操作实例 vb神童教程(续)--编写一个小型的信息管理系统 vb神童教程(续)--准备数据库 vb神童教程(续)--设计系统的界面及对象的属性 vb神童教程(续)--为对象添加事件代码 第二部分:补充内容 vb神童教程(续)--ODBC数据源简介 vb神童教程(续)--配置Access数据源 vb神童教程(续)---配置SQL Server数据源 vb神童教程(续)--VB的ADO对象 vb神童教程(续)--vb adodb Connection对象简介 vb神童教程(续)-

矩阵-vb.net进行线性代数运算

问题描述 vb.net进行线性代数运算 我编的程序需要进行一次线性方程组求解,AX=B.程序已经算出A和B了.都是vb.net本身的数组表示的,大小随用户输入的参数有变化.之前下了ILNumerics,但是不会用.貌似需要AB都是它的格式的矩阵才能计算.可是教程看不懂(http://ilnumerics.net/index.html , 官网链接点进去,选support-documention,就是教程了), 全英文,而且教程里的矩阵都是手动输入的.有没有谁会在vb.net里解线性方程组的,教一

急,RMB求毕业设计的程序:用VB.NET基于P2P的共享软件

问题描述 各位好:所需要功能如下:开发工具:开发语言:vb.net数据库类型:sql论文字数:10000其中软件分为以下几个基本功能服务器端:拥有一个大型的,完整的数据库客户端:登陆.注册(是对本地用户进行操作).上传:其中包括对数据库进行插入,修改,删除操作.下载:首先对数据库进行检索,查找要下载的音乐.然后从服务器上进行下载.其中,上传和下载的过程应用P2P技术.本机即充当服务器有充当客户机.在下载信息的时候,下载下来的音乐要直接放到本机固定的文件夹下.在自身充当服务器的时候,其他人可以直接

请教大家:ARCgis二次开发问题

问题描述 我是用VB.net进行二次开发的,有这样一个问题.程序中dimxxasIWorkspaceFactory然后VB就提示:IWorkspaceFactory"在命名空间"ESRI.ArcGIS.Geodatabase"中不明确请问这样的问题怎么解决,请大家不吝赐教,多谢 解决方案 解决方案二:没用过vb.net我认为可能是有多个库中都包含这个接口.试试dimxxassriGeoDatabase.IWorkspaceFactory解决方案三:或者是你的安装环境有问题解决

VB.NET中paramArray参数数组 传参问题

问题描述 VB.NET中paramArray参数数组传参时除了传递相同的数据类型的元素序列外可以传递相同的数据类型的数组名么?我在一本书上看到可以传数组名可是在VS2008中实验时不允许啊是不是在VB中允许啊?我是学C#的,现在有个项目用到学下VB 解决方案 解决方案二:还在用vs2005,感觉应该可以吧