模态对话框测试

本文详细介绍了模态对话框的工作原理,包括通过禁用父窗口接收输入来实现模态效果的技术细节,并通过测试验证了模态对话框对其他消息如定时器消息的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

1. 让父窗口失效EnableWindow(pardent,FALSE);

2. 建立模态对话框自己的消息循环

3. 直至接收关闭消息,消息循环终止并销毁窗口

其中EnableWindow作用是(摘自MSDN)

Enables or disables mouseand 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. Wheninput 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消息仍旧依靠着非模式对话框的消息循环被分配到了主窗口。


源码下载



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

聚沙塔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值