热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

请问如何判断已经显示的窗体是否是模态的?

请问如何判断已经显示的窗体是否是模态显示的?先看一下MSDN对于Show方法的文档,其中Style参数决定了窗体的显示方式:---object.Showstyle,ownerfor
请问如何判断已经显示的窗体是否是模态显示的?

先看一下MSDN对于Show方法的文档,其中Style参数决定了窗体的显示方式:
---
object.Show style, ownerform

Show 方法的语法包含下列部分:

部分 描述 
object 可选的。一个对象表达式,其值为“应用于”列表中的一个对象。如果省略 object,则与活动窗体模块关联的窗体缺省为 object。 
Style 可选的。一个整数,它用以决定窗体是模式还是无模式 。如果 style 为 0,则窗体是无模式的;如果 style 为 1,则窗体是模式的。 
ownerform 可选的。字符串表达式,指出部件所属的窗体被显示。对于标准的Visual Basic 窗体,使用关键字 Me。 

---

如果想判断窗体是否为模态显示,有一种方法是大家都知道的,
就是通过Tag或者其他方式在Show的时候记录其是否为模态,在需要判断的时候可以判断此属性或者变量.
但这种方式的缺点在于如果窗口比较多,每次都记录的话改起来比较麻烦,而且也不好维护.

现在有一个问题:
请问有没有什么办法可以直接获取窗体是否为模态显示的,而不用自己写语句去记录状态?(即有没有内置的属性或者api函数可以判断窗体是否为模态显示?)

26 个解决方案

#1


其实模态并不是窗口的状态。

模态窗口是这样一组操作的集合:
1 设置调用窗口为主窗口的子窗口
2 将主窗口的Enable设置为False
3 显示调用窗口
你可以用这个思路,获得当前窗口的父窗口,判断它是否Enable。

#2


可是如果没有父窗口怎么办呢?或者不知道父窗口?

另外,我觉得模态显示和Enabled设置为False还是有一些区别的:
比如说,
1 在显示模态窗口的时候,点击父窗口会导致被显示的模态窗口标题闪动;
2 在显示模态窗体的时候,其父窗体(如果有的话)的消息循环是阻塞的,并且不会执行Show之后的语句,直到模态窗体被关闭.

#3


(1)
Private Sub Command1_Click()
Form2.Show 0, Me
Me.Enabled = False
End Sub

这样照样闪烁

(2)
你在Form1里面放一个Timer,添加一个Label
Private Sub Timer1_Timer()
    Label1.Caption = Now
End Sub

你显示子窗口,你看看是不是照样更新。

#4


没有父窗口调用Modal其实和非模态没有区别。

#5


UPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUP

#6


模式窗口可以蔽屏主窗口的一切的消息发送,除非模式窗口close   
你可以发送一个消息给主窗口如果不响应,则这是个模式窗口,若响应则是非模式的

#7


引用 6 楼 asftrhgjhkjlkttttttt 的回复:
模式窗口可以蔽屏主窗口的一切的消息发送,除非模式窗口close  
你可以发送一个消息给主窗口如果不响应,则这是个模式窗口,若响应则是非模式的

你有没有用SPY++看过。

主窗口消息仍然可以获得。

#8


没有父窗口的模式窗口和非模式窗口还是有区别的

其实真正的模式窗口并非只父窗口被禁用,而是线程内的所有窗口都被禁用

一般情况下,判断某个窗口是否为模式窗口可以这样测试

if iswindowenabled( Getwindow(hwnd,gw_owner)) =0 then 某窗口为模式窗口

#9


引用 8 楼 pctgl 的回复:
没有父窗口的模式窗口和非模式窗口还是有区别的

其实真正的模式窗口并非只父窗口被禁用,而是线程内的所有窗口都被禁用

一般情况下,判断某个窗口是否为模式窗口可以这样测试

if iswindowenabled( Getwindow(hwnd,gw_owner)) =0 then 某窗口为模式窗口

支持。

#10


#11


引用 8 楼 pctgl 的回复:
没有父窗口的模式窗口和非模式窗口还是有区别的

其实真正的模式窗口并非只父窗口被禁用,而是线程内的所有窗口都被禁用

一般情况下,判断某个窗口是否为模式窗口可以这样测试

if iswindowenabled( Getwindow(hwnd,gw_owner)) =0 then 某窗口为模式窗口

同意,这就是我在1楼说的办法。

#12


帮你顶

#13


记得很早以前我写过一个小工具,叫 Window Resizer,可以设置窗口的状态。
下载:http://www.onlinedown.net/soft/27125.htm

你可以做一个验证。打开记事本,打开查找/替换对话框,打开帮助-关于对话框。
然后用我的程序启用主窗口。这时候,查找/替换对话框也被激活了,而关于对话框成了非模态子窗口

我推测:
其实真正的模式窗口并非只父窗口被禁用,而是线程内的所有窗口都被禁用
这个是更低级的窗口函数自动实现的。

所以简单地说,模态窗口就是这样一组操作的集合:
1 设置调用窗口为主窗口的子窗口
2 将主窗口的Enable设置为False
3 显示调用窗口

#14


引用 13 楼 caozhy 的回复:
1 设置调用窗口为主窗口的子窗口

呵呵,不是父子关系,是属主关系。

#15



form1:
form2.show ,me


form2:
form1.enabled = not form1.enabled


这两句就能实现 form2 的模式与非模切换了


创建模式窗口其实在ms看来那是一个宏, msdn 上都一直这么叫...
而且是模版窗口操作函数

#16


引用 13 楼 caozhy 的回复:
记得很早以前我写过一个小工具,叫 Window Resizer,可以设置窗口的状态。
下载:http://www.onlinedown.net/soft/27125.htm

你可以做一个验证。打开记事本,打开查找/替换对话框,打开帮助-关于对话框。
然后用我的程序启用主窗口。这时候,查找/替换对话框也被激活了,而关于对话框成了非模态子窗口

我推测:
其实真正的模式窗口并非只父窗口……

从表面上来看,似乎是这么回事。

但事实证明不象这简单:
' 标准模块中的代码
Option Explicit
' 把工程设置成从 Sub Main 启动
Sub Main()
    Load Form1: Form1.Caption = "‘模态’窗口!"
    Form1.Show 1
    Load Form1: Form1.Caption = "‘非模态’窗口!"
    Form1.Show 0
'   即使直接 form1.Show 1、form1.show 0 ,结果也是一样
End Sub


' Form1 中的代码
Option Explicit

Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Private Declare Function IsWindowEnabled Lib "user32" (ByVal hWnd As Long) As Long

Private Const GW_OWNER      As Long = 4
Private Const GW_HWNDNEXT   As Long = 2

Private Sub Command1_Click()
' 单击 Command1 后, 始终输出“非模态”
    Print GetWindow(hWnd, GW_OWNER)     '输出非0
    Print GetWindow(GetWindow(hWnd, GW_OWNER), GW_HWNDNEXT)
    If (IsWindowEnabled(GetWindow(hWnd, GW_OWNER)) = 0) Then
        Print "模态!"
    Else
        Print "非模态!"
    End If
End Sub

#17


VB的模态显示确实可以用属主窗口的Enabled属性判断出来.
谢谢各位:)

#18


发现一个有趣的现象:
Form2.Show vbModal
不能阻止当前窗口上的Timer事件
但是MsgBox却可以阻止Timer事件,即使不加下边的参数:-)

msgbox 貌似有2个模态相关的参数:
vbApplicationModal 0 Application modal; the user must respond to the message box before continuing work in the current application. 
vbSystemModal 4096 System modal; all applications are suspended until the user responds to the message box. 

#19


引用 18 楼 sonic_andy 的回复:
发现一个有趣的现象:
Form2.Show vbModal
不能阻止当前窗口上的Timer事件
但是MsgBox却可以阻止Timer事件,即使不加下边的参数:-)

msgbox 貌似有2个模态相关的参数:
vbApplicationModal 0 Application modal; the user must respond to the message box before co……

MessageBox和VB模态实现机制不同。
你显示MessageBox后点主窗口,窗口标题栏不闪吧 :)

#20


引用 4 楼 caozhy 的回复:
没有父窗口调用Modal其实和非模态没有区别。


其实还是有区别的:
VB中的模态窗体不会在任务栏上显示,即使选中了ShowInTaskbar属性

#21


引用 19 楼 caozhy 的回复:
引用 18 楼 sonic_andy 的回复:
发现一个有趣的现象:
Form2.Show vbModal
不能阻止当前窗口上的Timer事件
但是MsgBox却可以阻止Timer事件,即使不加下边的参数:-)

msgbox 貌似有2个模态相关的参数:
vbApplicationModal 0 Application modal; the user must respond to ……


呵呵,确实是这样:)

#22


 lz的分是不是可以考虑多给我一点合适? 

#23


帮顶哇

#24


引用 18 楼 sonic_andy 的回复:
发现一个有趣的现象:
Form2.Show vbModal
不能阻止当前窗口上的Timer事件
但是MsgBox却可以阻止Timer事件,即使不加下边的参数:-)

msgbox 貌似有2个模态相关的参数:
vbApplicationModal 0 Application modal; the user must respond to the message box before co……

要判断msgbox类的模式窗口简单很多,它们都有WS_POPUP风格。

#25


引用 18 楼 sonic_andy 的回复:
发现一个有趣的现象:
Form2.Show vbModal
不能阻止当前窗口上的Timer事件
但是MsgBox却可以阻止Timer事件,即使不加下边的参数:-)

msgbox 貌似有2个模态相关的参数:
vbApplicationModal 0 Application modal; the user must respond to the message box before c……

反驳一下楼主的新发现(其实这东西,我N久前就做过测试)
msgbox并不能阻止timer事件,不管你带哪个参数,请不要在IDE里测试(你的程序不会只在IDE里使用吧?),请编译以下程序到EXE文件,然后运行并观查结果。

Private Sub Form_Paint()
    MsgBox "?", vbSystemModal
End Sub

Private Sub Timer1_Timer()
    Text1 = Time    
End Sub



#26


引用 22 楼 pctgl 的回复:
 lz的分是不是可以考虑多给我一点合适?

是啊,呵呵
谢谢你帮了大忙了

推荐阅读
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • [echarts] 同指标对比柱状图相关的知识介绍及应用示例
    本文由编程笔记小编为大家整理,主要介绍了echarts同指标对比柱状图相关的知识,包括对比课程通过率最高的8个课程和最低的8个课程以及全校的平均通过率。文章提供了一个应用示例,展示了如何使用echarts制作同指标对比柱状图,并对代码进行了详细解释和说明。该示例可以帮助读者更好地理解和应用echarts。 ... [详细]
  • 通过Anaconda安装tensorflow,并安装运行spyder编译器的完整教程
    本文提供了一个完整的教程,介绍了如何通过Anaconda安装tensorflow,并安装运行spyder编译器。文章详细介绍了安装Anaconda、创建tensorflow环境、安装GPU版本tensorflow、安装和运行Spyder编译器以及安装OpenCV等步骤。该教程适用于Windows 8操作系统,并提供了相关的网址供参考。通过本教程,读者可以轻松地安装和配置tensorflow环境,以及运行spyder编译器进行开发。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 用Vue实现的Demo商品管理效果图及实现代码
    本文介绍了一个使用Vue实现的Demo商品管理的效果图及实现代码。 ... [详细]
author-avatar
手机用户2602890535
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有