VB6关于判断模态窗体的问题

VB6关于判断模态窗体的问题,第1张

概述模态窗体也有人叫模式窗体,是否为模态窗体由Show方法的参数决定: 语法object.Show style, ownerformShow 方法的语法包含下列部分:部分 描述 object 可选的。一个对象表达式,其值为“应用于”列表中的一个对象。如果省略 object,则与活动窗体模块关联的窗体缺省为 object。 Style 可选的。一个整数,它用以决定窗体是模

模态窗体也有人叫模式窗体,是否为模态窗体由Show方法的参数决定:

语法object.Show style,ownerformShow 方法的语法包含下列部分:部分 描述 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 vbModalEnd 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 ExplicitPrivate m_Modal As BooleanPublic Property Get IsModal() As Boolean    IsModal = m_ModalEnd PropertyPublic 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 IfEnd Sub


那么现在不再调用Show而调用ShowEx方法,然后通过IsModal属性就可以判断是否为模态窗体

需要说明的一点是,使用Property和Public变量应该是等效的,不过如果与脚本相关,最好用Property

然后,要把一个窗体从模式窗体变成非模式窗体,方法很简单,也很变态:

Private Sub btnMoDaless_Click()        Me.HIDe        Me.ShowEnd Sub


隐藏再显示即可消除窗体的模态,能不能用API,就不太清楚了,这就是封装的力量,你大概知道它做了什么,却不明确它具体究竟做了什么

你可以用C/C++写个DLL,然后DeBUG跟踪HIDe和Show就可以知道,不过这个过程可能有几百条汇编指令,反正我是不管了

反过来把一个窗体从非模式转变为模式窗体也是一样道理:

Public Sub DoModal()        Me.HIDe        'Me.Show vbModal         Me.ShowEx vbModalEnd Sub

最后,现在是2013-08-23 06:02:08

总结

以上是内存溢出为你收集整理的VB6关于判断模态窗体的问题全部内容,希望文章能够帮你解决VB6关于判断模态窗体的问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1277669.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-09
下一篇2022-06-09

发表评论

登录后才能评论

评论列表(0条)

    保存