网摘》窗体、子窗体

来源:互联网 发布:vps修改远程登录端口 编辑:程序博客网 时间:2024/05/22 11:37

VB6 MDI窗体 控件

其实Picture做为MDI窗体最佳容器,在设计MDI程序时,还是被很多程序员采用的方法。

1.建立MDI窗体;[工程]\[添加  MDI  窗体] 

2.MDI窗体上方画一个Picture1,因为PictureAlign默认是停靠在顶部的; 

3.设置Picture1Align属性为2,停靠在底部; 

4.再在窗体上方画一个Picture2,设置Align3,停靠在左边;

5.这时你会看到Picture2占了全屏,不要紧,设置Picture2Width300,回车; 

6.如果愿意,还可继续添加右边和顶边,方法类似;

7.添加完后,可以设置PictureBorderStyle属性为0,采用没边的样式,这样看起来要舒服得多。

至此,你就可以在MDI窗体上随意添加其它的控件了。

 

 

vb6.0子窗体切换有关问题

现在我使用的是FORMVisible属性控制其是否显示。

但是如果子FORM很多的话,一个一个写很费事。

我发现MDIformActiveMDIChild属性,指向当前活动的子窗体。此乃TForm *类型的指针,必要时可强制转换为任意类型的子窗体实例。

MDIChildCount属性,用于判断已经创建的子窗体的总数。

MDIChildren属性,是一个TForm *类型的指针数组,指向目前存在的所有的子窗体。结合MDIChildCount属性,可以实现子窗体的遍历。

这样的话就可以通过循环控制。

我现在不明白的是MDIChildCount属性中已经创建的子窗体的总数这句话。如果MDIFORMLOAD了一个子窗体,那这个数字就是1吗?还是全部子窗体的个数?

我的代码中: VB code

Private Sub MDIForm_Load()

    Form1.Show

MsgBox Str(MDIChildCount), 1 + 16 + 256 + 0, "MDIChildCount"

End Sub

运行结果为什么总是0呢?

 

VB MDI子窗体切换

Dim frm As Form

For Each frm In Forms

If frm.Name = "你的窗体名" Then

你的窗体名.SetFocus

Exit Sub

End If

Next

你的窗体名.Show

 

给你一段我本人自己开发时写的一个函数:

Function IsLoadFormII(uFrmName As String) As Boolean

'//判断窗体是否加载

Dim uFrm As Form

For Each uFrm In Forms

' MsgBox ufrm.Name

If uFrm.Name = uFrmName Then

uFrm.ZOrder 0

If uFrm.WindowState = 1 Then uFrm.WindowState = 0

IsLoadFormII = True

End If

Next

End Function

 

 

多文档(MDI)界面

Windows应用程序的用户界面主要分为两种形式;单文档界面(SingleDocument Interface,SDI)和多文档界面(Multiple Document Interface,MDI)单文档界面并不是指只有一个窗体的界面,而是指应用程序的各窗体是相互独立的,它们在屏幕上独立显示、移动、最小化或最大化,与其他窗体无关。在前面创建的所有程序都是单文档界面。

多文档界面由多个窗体组成,但这些窗体不是独立的。其中有一个窗体称为MDI父窗体(简称为MDI窗体),其他窗体称为MDI子窗体(简称为子窗体)。子窗体的活动范围限制在MDI窗体中,不能将其移动到MDI窗体之外。可见,多文档界面与简单的多重窗体界面是不同的,后者实际是单文档界面。

绝大多数Windows的大型应用程序都是多文档界面。例如,Microsoft Word,Excel以及VB等都是多文档界面。如图7.31所示的是Word的用户界面,在MDI窗体中包含三个子窗体。

创建MDI界面

要创建MDI界面,首先需要为应用程序创建一个MDI窗体。单击【工程】菜单,执行其中的【添加MDI窗体】命令,弹出【添加MDI窗体】对话框,在【新建】选项卡中选中【MDI窗体】,单击【打开】按钮即可在当前工程中创建一个MDI窗体。

与普通的窗体相比,MDI窗体具有以下特点:

在外观上:MID窗体的背景看起来更黑一些,并且有一个边框。如图7.32所示的是MDI窗体与普通窗体外观的比较。

显示在工程资源管理器中的MDI窗休的图标与普通窗体的图标不同,如图7.33所示。从图标上很容易识别窗体的类型。

一个应用程序只能有一个MDI窗体。

MDT窗体上只能放置那些有Alignment属性的控件(如图片框、工具栏等)和具有不可见界面的控件(如计时器和通用对话框控件).其他控件如文本框、按钮等控件不能放置在MDI窗体中。要将这些控件放置在MDI窗体上,可以事先在MDI窗体中放置一个图片框控件,然后将其他控件放置在图片框中。

不能使用Pint方法在MDI窗体上显示文本。可以在MDI窗体中的图片框中使用Print方法来显示文本。

MDI窗体的大多数属性与普通窗体的属性相同。MDI窗体还有两个特有的属性:

AutoShowChildren属性和ScrollBars属性。

AutoShowChildren属性决定在加载子窗体时,是否自动显示它们。如果AutoShowChildren属性的值为True〔默认值),子窗体一载入就显示出来。这就是说,Load语句和show方法的作用是相同的。

ScrollBars属性决定MDI窗体在必要时是否显示滚动条。当该属性的值为True(默认值)时,如果一个或多个子窗体延伸到MDI窗体之外,MDI窗体上就会出现滚动条。

子窗体的创建很容易。对于普通的窗体,只要将其MDIChild属性设置为True即可将其设置成为一个子窗体。因此,创建子窗体的方法是:首先创建一个普通窗体,然后将它的MDIChild属性设置为True就可以了。

细心的用户可以发现,将普通窗体设置为子窗体后,窗体在工程资源管理器中的图标改变了,它与普通窗体和MDI窗体的图标都不同,如图7.35所示。这也是将普通窗体设置为子窗体后,能在设计窗日中看到的唯一的变化。

注意;MDIChild属性只能在设计阶段通过【属性】窗口设计,不能在代码中设置,并且,在设置该属性前,要确保已经建立了MDI窗体。否则,则程序运行时会出现错误。

MDI窗体与子窗体创建完成后,接下来的工作就是设计窗体与编写代码了。在MDI窗体上一般只放置菜单栏、工具栏以及任务栏。子窗体的设计则与普通窗体的设计完全相同。也可以先设计窗体,然后改变MDIChild属性。操作顺序不会影响窗体的行为。

MDI界面的特点

新建一个工程,使用【工程】菜单中的【添加MDI窗体】命令向工程中添加一个MDI窗体。将工程中已存在的普通窗体的MDIChild属性的值设置为True

运行该程序,则出现如图7.36所示的界面。这是由于在默认情况下启动窗体是子窗体。在加载子窗体时,MDIChild窗体会自动加载并显示。

在【工程属性】对话框中将启动窗体设置为MDI窗体,运行程序,则出现如图7.37所示的界面。加载MDIChild窗体时,其子窗体并不会自动加载。子窗体的加载与卸载等操作与普通窗体相同。为MDI窗体的Load事件编写如下代码:

Private Sub MDIForm_Load()

Foaml.Show

End Sub

如果MBI窗体的AutoShowChildren属性值为Ture,也可以使用Load Forml语句来显示子窗体。

再次运行程序。可以发现子窗体显示在MDI窗体中,如图7.36所示。

与卸载普通窗体一样,卸载MDI窗体也是使用Unload语句。例如,为程序添加下列代码,运行程序,双击MDI窗体即可卸载它。

Private Sub MDIFrom_DblClick()

Unload MDIForml

End Sub

子窗体最小化后将以图标的形式出现在MDI窗体中,而不会出现在Windows的任务栏中。子窗体最大化后,它的标题出现在MDI窗休的标题栏中。运行程序,单击子窗体的最小化按钮使其最小化,如图7.38所示。单击子窗体的最大化按钮使其最大化。单击MDI窗体的最小化按钮使其最小化,所有子窗体都不可见,并且只有MDI窗体的图标出现在任务栏中。读者还可以移动子窗体,它不会移动到MDI窗体之外。

MDI窗体与子窗体中都可以建立菜单,并且建立菜单的方法与普通窗体相同。但在菜单的显示下,NDI应用程序还有一些自己的特色。当没有打开子窗体时,MDI窗体上显示自己的菜单。当打开了子窗体时,则MDI窗体的菜单栏上显示当前活动子窗体的菜单。也就是说,子窗体的菜单取代了MDI窗体菜单栏中的菜单。

利用菜单编辑器为MDI窗体创建一个菜单。为子窗体创建3个菜单。运行程序,可见,子窗体中的菜单取代了MDI窗体本身的菜单,出现在MdI窗体的菜单栏中。单击子窗体的关闭按钮将其关闭,则MDI窗体菜单栏中显示的是其本身的菜单。

新建子窗体

多文档应用程序中最常见的一项操作是通过新建命令建立多个子窗体。例如,执行Word【文件】菜单下的【新建】命令,可以新建出多个子窗体。这些子窗体的外观与功能完全相同,只是在名称上使用编号区分,如“文档1“文档2等。

要实现这一功能,一种最直观的方法是:首先在工程中添加若干个窗体,并将它们设置为MDI窗体的子窗体。然后,在程序运行时,通过【新建】菜单来打开它们。事实上,使用这种方法实现起来是很困难的,缺乏灵活性并浪费系统资源

VB中,是通过对象变量来为MDI窗体生成了窗体的。

声明窗体的对象变量的格式如下:

    Dim变量As new窗体名

   其中“窗体名”是一个已存在的子窗体的名称。在声明了对象变量后,通过语句。

   变量.Shaw

就可以显示出一个新的窗体。

实例7.7新建子窗体

新建一个工程,向当前工程中添加一个MDI窗体,并为它创建一个【文件】菜单,其中包含【新建】与【退出】两个选项。其中工程中各对象的属性设置如表7.9所示。

打开【代码】窗口,编写代码如下:

Private Sub MenNew_Click()

Dim DocForm As New FrmChild

Static i As Inteqer

DocForm.Caption=无标题& i+1

DocForm.show

i=i+1

End Sub

Private Sub MenExit_Click()

End

End Sub

MenNew_Click事件过程中,定义了一个静态变量i,通过该变量可以使子窗体的标题出现编号。

设置启动窗体为MDI窗体,运行程序,出现界面。执行【文件】菜单中的【新建】命令,则MDI窗体中会出现一个标题为“无标题1的子窗体。再次执行【新建】命令,则又出现一个标题为“无标题2的子窗体。执行3次【新建】命令后的结果。

子窗体FrmChild是新建窗体的模板,新创建出的子窗体将与FrmChild子窗体的外观完全相同。例如,在FrmChild窗体中放置一个文本框,则新建的子窗体中也有一个文本框,并且名称是相同的。因此,要更改子窗体的外观,只需更改模板子窗体的外观就可以了。

除此之外,模板子窗体的事件过程对新建子窗体也有效。例如,编写模板子窗体的事件过程如下:

Private Sub Form_Click()

   Text1.Text=欢迎

End Sub

运行程序,在新建的子窗体上单击,则子窗体中的文本框内会显示“欢迎”两个字。单击子窗体“无标题2后的效果。

MDI窗体还有一个重要的属性-ActiveForm,使用该属性可以代替当前活动子窗体的名称。例如:

MDIForm.ActiveForm.Caption=ABCD

语句的功能是将当前活动子窗体的标题更改为AECD

使用ActiveForm属性可以引用当前活动子窗体的任意属性、方法或事件,而不必知道子窗体的名称。

将【文件】菜单中【退出】选项的Click事件过程更改为:

Private Sub MenExit_Click()

   Unload MDIForm1.ActiveForm

End Sub

这样,执行【退出】命令的效果是将当前活动的子窗体卸载。

创建【窗口】菜单

大多数应用程序都有一个【窗口】菜单,在该菜单中包含有层叠、平铺和排列图标等设置子窗体排列方式的命令,还显示有所有已打开的子窗体列表,从中可方便地选择要激活的子窗体。如图7.50所示的是VB的【窗口】菜单。

如果要在MDI窗体的某个菜单中显示了窗体列表,可以在【菜单编辑器】对话框中选中该菜单的【显示窗体列表】复选框,或者在【属性】窗口中将WindowsList属性的值设置为True.不需要用户编写任何代码。

MDI窗体的Arrange方法可以使子窗体按一定的规律排列。Arrange方法的一般格式为:

MDI窗体名。Arrange参数。

其中“参数”是一个整数,表示所使用的排列方式,系统共提供了四种排列方式,如表7.10所示。

http://www.educity.cn/help/VB/201003051038471315.htm

 

VB中多个窗体间的切换显示

有A、B、C、D...多个窗体,能否使用timer控件使得这多个窗体之间轮回切换显示。前提是不用command等的别的控件,即不用人为操作的切换
方法如下:
每个form上都放一个timer,设置其interval属性=2000
加入有3个form
在第一个form1的代码框中写如下代码:
Option Explicit
Private Sub Form_Activate()
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
Form1.Hide
Form2.Show
Timer1.Enabled = False
End Sub
第二个form2如下:
Option Explicit
Private Sub Form_Activate()
Timer1.Enabled = True
End Sub
 
Private Sub Timer1_Timer()
Form2.Hide
Form3.Show
Timer1.Enabled = False
End Sub
 
第3个form3,如下:
Option Explicit
Private Sub Form_Activate()
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
Form3.Hide
Form1.Show
Timer1.Enabled = False
End Sub
若需要更多窗体,请参照上面的例子进行修改!
 
 
Form2.Show 1窗体以模态方式显示窗体,不能操作下面窗体。
Form2.Show 0窗体以无模式显示窗体,可以操作下面窗体。
 

假如有多个窗体,刚才开始运行时,是只加载启动窗体,还是全部的窗体都会加载?

只加载启动窗体,证明:
我在form1 的load事件里写了Form1.Caption = Now然后在它的一个按钮里写
Private Sub Command1_Click()
Form2.Show
End Sub
同时在form2的load事件里写
Private Sub Form_Load()
Form2.Caption = Now
End Sub
运行后过一会儿再点按钮,两个窗体的标题就是它们加载的时间,你会发现两个时间是不一样的,说明它们不是同时加载的
 
 

VB中多窗口间的关系及编程

问题提出
对于编写复杂的应用程序,要在一个窗口中实现所有的功能比较困难,于是可以按多个窗口设计原则进行。不同的功能模块在不同的窗口中实现,相同的功能模块,原则上应在同一窗口中实现,但是如果比较复杂,可以用多个窗口来实现,那么,这些窗口如何布局,建立什么样的关系比较合理呢?
问题分析
在VB中,多个窗口之间的显示关系,可以形象地描述为三种:
1、独立关系:两个窗口都可独立显示,互不干扰;
2、父子关系:两个窗口按父子关系显示,子窗口在未关闭之前,父窗口无法激活,得不到活动焦点;
3、母子关系:VB中的MDI窗口,可以容纳多个MDIChild属性为True的窗口,我们称这种关系为母子关系,母窗口永远处于活动状态,子窗口之间属并列关系,只有一个是活动的。
问题解决
1、独立关系的实现很简单,从Form1显示到Form2,只需用一行代码:
Form2.Show
如果Form2显示后,不显示Form1,还需要在 Form2.Show 前添加一行代码:
UnLoad Form1
2、父子关系的实现,比如,将Form2显示为Form1的子窗口,只需一行代码:
Form2.Show 1, Form1
上面的代码中,指明了父窗口为Form1。
3、母子关系的实现,用标准的窗口显示代码即可。
编程实现
启动VB,新建一工程,向工程中添加一个MDI窗口MDIForm1,添加三个标准窗口:Form2,Form3,Form4,并将Form3、Form4的MDIChild属性设置为True。如图。然后编写程序代码:
从Form1独立显示到MDIForm1的程序代码:
Unload Form1
MDIForm1.Show
将Form2显示为Form1的子窗口的程序代码:
Form2.Show 1, Form1
显示MDIForm1中的子窗口的代码:
Form3.Show
Form4.Show
将Form2显示为MDIForm1的子窗口的程序代码:
Form2.Show 1, MDIForm1
说明:一个VB工程中最多存在一个MDI窗口,且MDI窗口不能显示为其它窗口的子窗口,但可以作为其它窗口的父窗口;MDI窗口的子窗口之间属平等关系,它们之间不能建立父子关系。
注:本程序在VB6+Win98环境下调试通过。
 
 

实现窗口间的参数传递

建立一个模块加入如下代码:
Sub openfromwithparam(ByVal str As String)
Dim Form As Form2
Set Form = New Form2
Form.str = str
Form.Label1.Caption = Form.str
 
Form.Show
End Sub
form1代码如下:
Private Sub Command1_Click()
Call openfromwithparam("liyong")
End Sub
Private Sub Form_Load()
End Sub
 
form2代码:
Public str As String
Private Sub Form_Load()
End Sub 

 

0 0
原创粉丝点击