如何在弹出模态窗口后,主窗口还能处理消息?

PDD123 2011-09-30 04:48:35
以前,我的程序弹出的模态对话框的所有代码和资源都在exe中,所以弹出模态对话框之后,主窗口还能继续处理消息。
现在,我设计了一个多线程的程序。其中有一个处理数据的线程,数据发生改变时就发消息通知主窗口更新显示数据。
整个程序的功能由多个DLL组成,并且添加新的DLL可以扩展功能。
而各个DLL又会使用到相同或相似功能的对话框,于是我就把这些对话框的相似部分封装到一个DLL中,做为界面库来使用。因为有独立的对话框资源,对话框类中又要用到资源ID,所以我并没有把对话框类作为接口类来导出,
而是每种对话框都对应一个函数作为接口。调用此函数就能打开一个模态对话框。

比如:
bool	TWI_InputStr(CString &str,LPCSTR wintext,CWnd * pParent=NULL,LPCSTR initstr="",LPCSTR notice="",bool 是否允许空字符串=0,LPStringCanUse lpfun=NULL);//输入一个字符串 返回值代表是否确定

bool TWI_InputStr(CString &str,LPCSTR wintext,CWnd * pParent,LPCSTR initstr,LPCSTR notice,bool 是否允许空字符串,LPStringCanUse lpfun)
{
CInputStrDlg dlg(pParent);
dlg.m_WinText=wintext;
dlg.m_StrEdit=initstr;
dlg.m_ErrorNotice=notice;
dlg.m_是否允许空字符串=是否允许空字符串;
dlg.m_lpStringCanUse=lpfun;
if(dlg.DoModal()==IDOK)
{
str=dlg.m_StrEdit;
return 1;
}
return 0;
}


TWI_InputStr是我提供的一个接口函数,其中的参数对对话框的属性进行了设置。CInputStrDlg 是对话框类,在外部是看不到此类的。

我在测试过程中发现,这样弹出来模态对话框后,主窗口上的数据就不刷新了。
若是打开exe中的模态对话框A,主窗口上的数据可以刷新,但是若模态对话框A通过那些接口函数在打开DLL中的模态对话框,那主窗口上的数据又不刷型了。

请问,要怎么做才能在通过DLL提供的接口函数打开DLL中的模态对话框时,主窗口还能继续处理消息呢?
...全文
462 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
蒋晟 2011-10-12
  • 打赏
  • 举报
回复
常规DLL不支持导出MFC类
PDD123 2011-10-11
  • 打赏
  • 举报
回复
那为什么弹出exe中的模态窗口后,还可以继续处理其他消息呢?按我的理解,DoModal()函数,是在窗口关闭(模态窗口消息循环结束)的时候才返回的,那么在模态窗口关闭之前,主窗口处理消息的线程应该阻塞了才对嘛?
PDD123 2011-10-01
  • 打赏
  • 举报
回复
我的那DLL的导出函数是一些普通的函数,是在.def文件中放入了函数名显式导出那种。那些函数调用又调用了DLL中的继承自CDialog的窗口类的DoModal成员函数。
PDD123 2011-10-01
  • 打赏
  • 举报
回复
应该是MFC规则DLL,里面有CWinApp
蒋晟 2011-10-01
  • 打赏
  • 举报
回复
常规DLL还是扩展DLL啊?
PDD123 2011-09-30
  • 打赏
  • 举报
回复
“进入dll之后,程序主体就是dll了”能说说这句话是啥意思不?

在打开模态对话框后,处理消息的线程应该是被阻塞了,为何不使用DLL中的对话框时,主窗口还能处理后来接收到的消息?

若处理消息时,不是打开模态对话框,而是进行一些耗时很长的运算,处理消息的线程同样也阻塞了。
用户 昵称 2011-09-30
  • 打赏
  • 举报
回复
谁说过来着?进入dll之后,程序主体就是dll了。
软件功能: * 无限级弹出窗口 * Esc退出block弹出窗口 * 可拖动窗口 * 模态窗口 * 模态alert警告对话框 * 模态confirm对话框 * 页面局部模态 * 绑定按钮响应函数 * 弹出窗口加载iframe * 自定义背景样式 组件提供了六个函数: $.funkyUI // 弹出模态窗口 $.unfunkyUI // 关闭模态窗口 $.alert //警告提示对话框 $.confirm //确认和取消对话框 $.fn.block //块模态 $.fn.unblock//解除块模态 调用示例: $.blockUI({ url:"1.html",//弹出窗口显示的内容,使用iframe OKEvent:okEvent,//okEvent是自定义的确定按钮响应函数, css:{width:"700",height:"500"} }); $.alert("这是警告窗口"); $.confirm("这是个Boolean窗口"); $('#blocked').block();//id为blocked的元素设置为只读 $('#blocked').unblock();//解除 实现的思路: 我在窗体中创建一个层,用来作为弹出窗体,包含一个iframe,通过参数指定URL,作为显示的内容,我觉得可能会有利于代码的重用,代码管理起来要方便一些 弹出窗口中含有的弹出窗口也在窗体中创建,这样结构简单一点,比较容易管理。我在创建弹出窗口的时候在窗体中声明一个栈,把当前iframe的window对象压入栈,这样不管我现在弹出了多少个窗口总能很容易的找到其中的任意一个的对象。 有感兴趣的把我的代码下载回去看看,然后给我提提意见,帮我提高。。。 觉得可用的随便用,有不明白的问我

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧