VB6关于判断模态窗体的问题
模态窗体也有人叫模式窗体,是否为模态窗体由Show方法的参数决定: 语法 object.Show style,ownerform Show 方法的语法包含下列部分: 部分 描述 object 可选的。一个对象表达式,其值为“应用于”列表中的一个对象。如果省略 object,则与活动窗体模块关联的窗体缺省为 object。 Style 可选的。一个整数,它用以决定窗体是模式还是无模式 。如果 style 为 0,则窗体是无模式的;如果 style 为 1,则窗体是模式的。 ownerform 可选的。字符串表达式,指出部件所属的窗体被显示。对于标准的Visual Basic 窗体,使用关键字 Me。
我们看下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
0x1ECF0000 0x00040100 而模式窗体f和Form2的Style和ExStyle为 0x16CF0000 0x00000100 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
需要说明的一点是,使用Property和Public变量应该是等效的,不过如果与脚本相关,最好用Property 然后,要把一个窗体从模式窗体变成非模式窗体,方法很简单,也很变态: Private Sub btnModaless_Click() Me.Hide Me.Show End Sub
你可以用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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |