以前,我的程序弹出的模态对话框的所有代码和资源都在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中的模态对话框时,主窗口还能继续处理消息呢?

解决方案 »

  1.   

    谁说过来着?进入dll之后,程序主体就是dll了。
      

  2.   

    “进入dll之后,程序主体就是dll了”能说说这句话是啥意思不?在打开模态对话框后,处理消息的线程应该是被阻塞了,为何不使用DLL中的对话框时,主窗口还能处理后来接收到的消息?若处理消息时,不是打开模态对话框,而是进行一些耗时很长的运算,处理消息的线程同样也阻塞了。
      

  3.   

    应该是MFC规则DLL,里面有CWinApp
      

  4.   

    我的那DLL的导出函数是一些普通的函数,是在.def文件中放入了函数名显式导出那种。那些函数调用又调用了DLL中的继承自CDialog的窗口类的DoModal成员函数。
      

  5.   

    那为什么弹出exe中的模态窗口后,还可以继续处理其他消息呢?按我的理解,DoModal()函数,是在窗口关闭(模态窗口消息循环结束)的时候才返回的,那么在模态窗口关闭之前,主窗口处理消息的线程应该阻塞了才对嘛?