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


    模态窗体也有人叫模式窗体,是否为模态窗体由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

  • 相关阅读:
    [BZOJ3751] [NOIP2014] 解方程 (数学)
    [BZOJ4198] [Noi2015] 荷马史诗 (贪心)
    [BZOJ4034] [HAOI2015] T2 (树链剖分)
    [BZOJ1880] [Sdoi2009] Elaxia的路线 (SPFA & 拓扑排序)
    [BZOJ1088] [SCOI2005] 扫雷Mine
    [BZOJ1004] [HNOI2008] Cards (Polya定理)
    [BZOJ1009] [HNOI2008] GT考试 (KMP & dp & 矩阵乘法)
    [BZOJ1503] [NOI2004] 郁闷的出纳员 (treap)
    [BZOJ1059] [ZJOI2007] 矩阵游戏 (二分图匹配)
    BZOJ2626: JZPFAR
  • 原文地址:https://www.cnblogs.com/pangblog/p/3278013.html
Copyright © 2020-2023  润新知