模态对话框测试

模态对话框只能屏蔽来自鼠标、键盘的消息,而不能屏蔽其他消息,也即模态对话框会独占用户输入。其实现原理如下:

  1. 让父窗口失效EnableWindow(pardent,FALSE);
  2. 建立模态对话框自己的消息循环
  3. 直至接收关闭消息,消息循环终止并销毁窗口

其中EnableWindow作用是:

Enables or disables mouse and keyboard input to the specified window or control. When input is disabled, the window does not receive input such as mouse clicks and key presses. When input is enabled, the window receives all input.

可以看出EnableWindow会控制是否接收来自键盘、鼠标的消息。

Windows程序中典型的消息循环为:

while(GetMessage( &msg, NULL, 0, 0 )>0)
{
       TranslateMessage(&msg);
       DispatchMessage(&msg);
} 

主窗口本身拥有一个消息循环,当创建了一个模态对话框后,程序将进入模态对话框的消息循环直至其退出,接着执行主窗口的消息循环。一个线程中只有一个消息队列,但是可能存在主线程消息循环外的其他局部消息循环,但是他们不会并行执行。因此应用程序发送的消息仍然可以通过模式对话框的消息循环被分配到指定窗口。对于非模式对话框,由于它和主窗口享一个消息循环,所以对主窗口的消息更没有影响。

主消息循环与模态对话框中的局部消息循环之间的关系如下

下面使用MessageBox做一个测试(MessageBox属于模态对话框),测试主窗口弹出MessageBox后对定时器(WM_TIMER消息)的响应情况。Ontimer中对主窗口进行绘图操作:

void CModalAndMessageDlg::OnTimer(UINT_PTR nIDEvent)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值

    CClientDC dc(this);
    CRect rect;
    GetClientRect(&rect);
    dc.FillSolidRect(rect,RGB(rand()%255,rand()%255,rand()%255));
}

主窗口上按钮响应:

void CModalAndMessageDlg::OnBnClickedOk()
{
    // TODO: 在此添加控件通知处理程序代码
    SetTimer(1,1000,NULL);
    MessageBox(L"Hello!");
}

测试可以发现弹出MessageBox后主窗口的颜色仍然在变化,这就说明WM_TIMER消息仍旧依靠着非模式对话框的消息循环被分配到了主窗口。

源码下载

时间: 2024-10-13 21:57:33

模态对话框测试的相关文章

DirectUI中模态对话框和菜单的原理

经常有人问关于模态对话框和系统菜单内部实现原理方面的问题, 因为系统通过API隐藏了太多细节,这2个问题确实令初学者甚至是有经验的开发者困扰, 下面是我个人的一些经验总结. 先说模态对话框,外部看模态对话框其实就是Dialog弹出以后函数(或者说调用栈call stack)不直接返回, 而是要让你做出选择后关闭Dialog, 然后程序再继续往下执行.在你关闭Modal Dialog之前, 你不能做其他操作.下面是我自己模拟模态对话框行为的代码: #define MODAL_DLG_EXIT_NO

VS2010/MFC编程(对话框:模态对话框及其弹出过程)

讲讲什么是模态对话框和非模态对话框,以及模态对话框怎样弹出. 一.模态对话框和非模态对话框 Windows对话框分为两类:模态对话框和非模态对话框. 模态对话框是这样的对话框,当它弹出后,本应用程序其他窗口将不再接受用户输入,只有该对话框响应用户输入,在对它进行相应操作退出后,其他窗口才能继续与用户交互. 非模态对话框则是,它弹出后,本程序其他窗口仍能响应用户输入.非模态对话框一般用来显示提示信息等. 大家对Windows系统很了解,相信这两种对话框应该都遇到过.之前的加法计算器对话框其实就是模

MFC编程入门之十一(对话框:模态对话框及其弹出过程)

加法计算器对话框程序大家照着做一遍后,相信对基于对话框的程序有了些解了,有个好的开始对于以后的学习大有裨益.趁热打铁,这一节讲讲什么是对话框和非模态对话框,以及模态对话框怎样弹出. 一.模态对话框和非模态对话框 Windows对话框分为两类:模态对话框和非模态对话框. 模态对话框是这样的对话框,当它弹出后,本应用程序其他窗口将不再接受用户输入,只有该对话框响应用户输入,在对它进行相应操作退出后,其他窗口才能继续与用户交互. 非模态对话框则是,它弹出后,本程序其他窗口仍能响应用户输入.非模态对话框

(转载)VS2010/MFC编程入门之十一(对话框:模态对话框及其弹出过程)

加法计算器对话框程序大家照着做一遍后,相信对基于对话框的程序有些了解了,有个好的开始对于以后的学习大有裨益.趁热打铁,鸡啄米这一节讲讲什么是模态对话框和非模态对话框,以及模态对话框怎样弹出. 一.模态对话框和非模态对话框 Windows对话框分为两类:模态对话框和非模态对话框. 模态对话框是这样的对话框,当它弹出后,本应用程序其他窗口将不再接受用户输入,只有该对话框响应用户输入,在对它进行相应操作退出后,其他窗口才能继续与用户交互. 非模态对话框则是,它弹出后,本程序其他窗口仍能响应用户输入.非

selenium处理模态对话框

Selenium处理模态对话框 问题描述: 点击按钮出现一个模态对话框,代码会卡在click这步不继续执行.原因是Selenium目前没有提供对模态对话框的处理. 解决方案: 将click出现弹出框这步用JS代替执行,然后切换到弹出窗就可以继续操作页面元素了. 测试地址:https://developer.mozilla.org/samples/domref/showModalDialog.html 代码如下: public class junitTest { WebDriver driver

【精品推荐】web开发人员应该知道的31个jQuery模态对话框

在网站开发中经常会用到模态窗口,如果直接利用javascirpt的window.showModalDialog()打开一个模式窗口,虽然实现了模式窗口的功能,但十分的不好看.当我们遇到这样的需求时很多人会从网上寻找这些jQuery的模态对话框,有时候搜索了很多,但都不是很合适,那为什么人们喜欢模态窗口呢?那模态窗口到底有什么优点呢? 当一个模态窗口包含一个较小的元素时,用户并不需要加载一个完成的全新新页面就可以访问它.(达到同样效果的另一种方式来是使用基于AJAX的标签) . 通过模态窗口,您提

QT笔记之模态对话框及非模态对话框

模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是Qt所独有的,在各种不同的平台下都存在.又有叫法是称为模式对话框,无模式对话框等.所谓模态对话框就是在其没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭.对于非模态对话框,当被打开时,用户既可选择和该对话框进行交互,也可以选择同应用程序的其他窗口交互. 在Qt中,显示一个对话框一般有两种方式,一种是使用exec()方法,它总是以模态来显示对话框:另一种是使用show()方法

JavaScript内容梳理 示例之模态对话框 示例之全选和反选以及取消 示例之后台管理左侧菜单

1 <!DOCTYPE html> 2 <!--示例之模态对话框--> 3 <html lang="en"> 4 <head> 5 <meta charset="UTF-8"> 6 <title>Title</title> 7 <style> 8 .hide{ 9 display: none; 10 } 11 .c1{ 12 position: fixed; 13 lef

bootstrap添加多个模态对话框支持

bootstrap添加多个模态对话框支持 (2015-03-04 21:05:35) 转载▼ 标签: 房产   因为项目需要,在页面交互上要弹出多个dialog窗口,而bootstrap的modal支持弹出dialog窗口,但是如果在此基础上,会出现遮罩层越来越多,背景越来越黑的情况. 代码具体如下: (function(){ modal = {}; modal.openDialog = function(url, title, width, height, id){}; modal.close