模态窗体也有人叫模式窗体,是否为模态窗体由Show方法的参数决定:
语法
object.Show style, ownerform
Show 方法的语法包含下列部分:
部分 描述
object 可选的。一个对象表达式,其值为“应用于”列表中的一个对象。如果省略 object,则与活动窗体模块关联的窗体缺省为 object。
Style 可选的。一个整数,它用以决定窗体是模式还是无模式 。如果 style 为 0,则窗体是无模式的;如果 style 为 1,则窗体是模式的。
ownerform 可选的。字符串表达式,指出部件所属的窗体被显示。对于标准的Visual Basic 窗体,使用关键字 Me。
类似MFC中的DoModal();然而VB几乎所有的东西只是个"变态"版的MFC,Form类没有任何属性可以获取窗体的模态
我们看下Spy++,或许可以从窗口的Style中得到一些蛛丝马迹,代码:
'Form1有一个Button
'Form2和Form1都是直接添加的窗体
Private Sub Command1_Click()
Dim f As New Form1
f.Caption = "aaa"
f.Show vbModal
Form2.Show vbModal
End Sub
发现非模式窗体Form1的Style和ExStyle为
0x1ECF0000
WS_OVERLAPPEDWINDOW
WS_VISIBLE
WS_DISABLED
WS_CLIPSIBLINGS
WS_CLIPCHILDREN
WS_OVERLAPPED
0x00040100
WS_EX_LEFT
WS_EX_LTRREADING
WS_EX_RIGHTSCROLLBAR
WS_EX_WINDOWEDGE
WS_EX_APPWINDOW
而模式窗体f和Form2的Style和ExStyle为
0x16CF0000
WS_OVERLAPPEDWINDOW
WS_VISIBLE
WS_CLIPSIBLINGS
WS_CLIPCHILDREN
WS_OVERLAPPED
0x00000100
WS_EX_LEFT
WS_EX_LTRREADING
WS_EX_RIGHTSCROLLBAR
WS_EX_WINDOWEDGE
WS_EX_APPWINDOW是决定窗体是否在任务栏上显示,相当于TaskVisible
难道是WS_DISABLED和WS_EX_WINDOWEDGE作祟?这个问题邀请得道高人才行,我只是说说而已
当然啦,如果想测试,只要一个API,那就是GetWindowLong
另外有个API是专门给对话框提供的,IsDialogMessage,这个东西能否有所帮助,还不敢说.
现在提供的一种方法是重载函数的方法.
函数的重载是C/C++等面向对象语言的东西,vb6是基于对象的,而不是面向对象的,无法对函数进行重载
然而所谓的重载,也是面向编译的,即编译以后将是不同的函数(函数指针或函数地址),因此可以用添加函数的方法来模拟函数重载
代码:
Option Explicit
Private m_Modal As Boolean
Public Property Get IsModal() As Boolean
IsModal = m_Modal
End Property
Public Sub ShowEx(Optional ByVal bModal As Boolean, Optional OwnerForm)
If bModal = True Then
m_Modal = True
'Const vbError = 10
'Const vbObject = 9
'If VarType(OwnerForm) = vbError Then
If VarType(OwnerForm) = vbObject Then
Me.Show vbModal, OwnerForm
Else
Me.Show vbModal
End If
Else
If VarType(OwnerForm) = vbObject Then
Me.Show , OwnerForm
Else
Me.Show
End If
End If
End Sub
那么现在不再调用Show而调用ShowEx方法,然后通过IsModal属性就可以判断是否为模态窗体
需要说明的一点是,使用Property和Public变量应该是等效的,不过如果与脚本相关,最好用Property
然后,要把一个窗体从模式窗体变成非模式窗体,方法很简单,也很变态:
Private Sub btnModaless_Click()
Me.Hide
Me.Show
End Sub
隐藏再显示即可消除窗体的模态,能不能用API,就不太清楚了,这就是封装的力量,你大概知道它做了什么,却不明确它具体究竟做了什么
你可以用C/C++写个DLL,然后Debug跟踪Hide和Show就可以知道,不过这个过程可能有几百条汇编指令,反正我是不管了
反过来把一个窗体从非模式转变为模式窗体也是一样道理:
Public Sub DoModal()
Me.Hide
'Me.Show vbModal
Me.ShowEx vbModal
End Sub
最后,现在是2013-08-23 06:02:08
分享到:
相关推荐
C# 非模态窗体(show)实现模态窗体(ShowDialog)的效果
模态窗体的多种打开方式,及关闭时的各种对话框,适宜开发网页增加客户友好性
C# 非模态窗体(show)实现模态窗体(ShowDialog)的效果 .rar
jquery 弹出模态窗体
这个问题会让一些初学者感到困惑,一方面模态窗体在打开之后(Form.ShowDialog).主线程无法继续执行下面的事务;另一方面,又要在处理事务的时候来同步这个窗体里面的进度条。这两件事情都必须做,却都不能先做
Delphi 模态窗体下更新另一个窗体内容,更方便多选内容在新窗体更新
JS弹出模态窗体,WIND.one p opne
artDialog是一个精巧的web对话框组件,压缩后只有十多KB,并且不依赖其他框架
本试例可以结合asp.net ajsx 来实现模态局布刷新
模态子窗体可以调用父窗体的任何函数方法,相当于在一个界面操作一样,超强的,顶!
简单的模态和非模态对话框的示例,以便了解相关的基础操作,基于VC6.0。
详见自带DEMO: X:\Program Files\AthraSoft\SmartPlugin\v2.0.06\Samples 另:如果要破解的话,把下面的注册表信息生成reg文件,导入注册表中! REGEDIT4 [HKEY_LOCAL_MACHINE\Software\AthraSoft\Components\...
JQuery实现可移动模态窗口 JQuery实现可移动模态窗口 JQuery实现可移动模态窗口
利用模态对话框实现父窗体、子窗体间传值。 服务器showModalDialog 打开子窗体,子窗体使用客户端脚本和服务器端方法向父窗体传值
主要介绍了JavaScript实现弹出模态窗体并接受传值的方法,涉及JavaScript模态窗体的实现及基于URL的传值操作技巧,需要的朋友可以参考下
模态窗口传值www.bbssa.com 学习HTML对象必看
几个基于Juqery的模态窗口,另推荐个论坛,脚本之家:http://www.jb51.net/
使用jQuery创建模态窗口登陆效果 演示地址:http://www.jq22.com/plugin/149
在多线程中,有时候使用MessageBox.Show方法弹出对话框,弹出的Messagebox不是模态的,不能满足我的要求.所以有了这段代码.
这是C#实现一个功能强大的窗体之间传值,是初学者值得下载学习的一个源代码……