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

VB6关于判断模态窗体的问题的更多相关文章

  1. WPF判断当前窗体是否为模态

    WPF判断当前窗体是否为模态   1.使用System.Windows.Interop.ComponentDispatcher.IsThreadModal来判断 参照:https://social.m ...

  2. delphi模态窗体最小化会隐藏的问题

    在使用delphi创建模态窗体的时候最小化窗体会导致最小化的窗体不可见,再次点击主窗体才会显示. 在这个模态窗体中增加以下函数 procedure WmSysCommand(var msg: TMes ...

  3. 游戏UI框架设计(四) : 模态窗体管理

    游戏UI框架设计(四) --模态窗体管理 我们在开发UI窗体时,对于"弹出窗体"往往因为需要玩家优先处理弹出小窗体,则要求玩家不能(无法)点击"父窗体",这种窗 ...

  4. 关于DatePicker在模态窗体下失效的问题

    最近用bootstrap做了一个租赁相关的管理系统,由于前端知识薄弱,也是编查资料边做.关于一些控件的用法,也是从网上查资料.下面,来说一下在写前端页面时遇到的几个坑. 这个系统中,日期控件用的是Da ...

  5. Sharepoint模态窗体(实战)

    分享人:广州华软 无名 一. 前言 对SharePoint二次开发时,需要知道SharePoint有什么.没有什么,才能在开发过程中避免重复造轮子.SharePoint提供了许多开箱即用的功能,这次要 ...

  6. C#嵌入子窗体,判断子窗体是否打开了

    /// <summary> /// 嵌入子窗体,判断子窗体是否打开了 /// </summary> public static Form1 f; public void For ...

  7. 自制模态窗体闪烁效果: MessageBeep & FlashWindowEx

    SetFocus(hwnd_frame_preview); //设置焦点 /** 模拟模态窗口动作 **/ MessageBeep(0xFFFFFFFF); //0xFFFFFFFF SystemDe ...

  8. Delphi: 模态窗体最小化

    源起: 近期所介入的几个项目中,最后视频生成窗体,为一模态对话框.因生成时间可能较长,所以其窗体可以最小化,它最小化时同时最小化主程序,唤醒时主程序再复原. 代码亦是8年前本人所写,一直那样用了,也没 ...

  9. FMX 模态窗体

    FMX 模态窗体 dlg := TForm2.Create(nil);  dlg.ShowModal(procedure(ModalResult: TModalResult)  begin       ...

随机推荐

  1. Centos DNS重启失效的解决

    在KT的毒妇配置的时候,通过yum安装了桌面,默认安装了Gnome,在没重启前还一切正常,重启以后接着配置的时候,发现没法网络访问了,ping测试一 下,host unkown;基本可以确定是DNS的 ...

  2. ListView.setOnItemClickListener 点击无效

    如果ListView中的单个Item的view中存在checkbox,button等view,会导致ListView.setOnItemClickListener无效, 事件会被子View捕获到,Li ...

  3. Windows下让Git记住用户名密码(https)

    最近开始跟老板共同维护公司的框架代码,于是毫不犹豫地选择了Git这个驰名的版本控制系统(公司使用的是TFS,但外网访问老是断线). 选择的托管平台是OSChina,原因是其可以新建私有项目. 在拉取和 ...

  4. 修改TOMCAT服务器图标为应用LOGO

    在tomcat下部署应用程序,运行后,发现在地址栏中会显示tomcat的小猫咪图标.有时候,我们自己不想显示这个图标,想换成自己定义的的图标,那么按如下方法操作即可: 参考网上的解决方案:1.将$TO ...

  5. android studio 环境配置

    遇到哪些坑: Gradle:configure project 卡死在此处 Haxm is not installed hax is not working and emulator runs in ...

  6. [置顶] 与小伙伴共勉的java有关jvm的知识(一),小鸟尽量写得详细哦,欢迎讨论,谢绝喷子

    JAVA运行在JVM之上,JVM的运行状况会对程序产生很大的影响,因此了解一些JVM的东东,对于编写稳定的,高性能的java程序至关重要.这是JVM的规范中定义的标准结构图: 以上标准是JVM标准中定 ...

  7. c++适配器模式

    你想使用一个已经存在的类,而它的接口不符合你的需求. 创建一个类需要和其他类协同完成任务,需要一个适配器将其他类的方法都转接到适配器当中 什么是适配器模式:有一个目标客户类想适用已经存在类的接口,但是 ...

  8. deferred initcalls与模块化

    deferred initcalls与模块化 有两个技术可以加快kernel的启动速度: 1.deferred initcalls 2.模块化 它们的思想类似,都是将非必要的模块初始化推迟到内核启动之 ...

  9. android_Intent对象初步(Activity传统的价值观念)

    说明:初步Intent物.主要使用Intent对象在Activity之间传递数据的方法. 样例:由MainActivity→OtherActivity的跳转过程中,把数据传递给OtherActivit ...

  10. Codeforces 475C Kamal-ol-molk&#39;s Painting 模拟

    主题链接:点击打开链接 意甲冠军:特定n*m矩阵 X代表色 .代表无色 随着x*y形刷子去涂色. 刷子每次能够→或↓移动随意步. 若可以染出给定的矩阵,则输出最小的刷子的面积 若不能输出-1 思路: ...