我用MFC做了一个基于对话框的应用程序和一个MFC扩展DLL(也是基于对话框的MFC应用程序)我想在加载DLL的时候弹出一个对话框提示应用程序正在加载DLL,(如:应用程序正在加载,请稍后)然后过几秒这个提示对话框就会自动消失,从而显示出DLL中的对话框我在主应用程序中设置了一个定时器,并在加载显示DLL中对话框的代码前弹出该提示对话框,过一段时间就杀掉这个定时器,并关闭提示对话框,可是提示对话框出来之后一会当杀掉定时器关闭它的时候,那个DLL中的对话框只显示一下就看不见了,我发现虽然看不见,但是程序仍然在运行,不知道为什么DLL中的对话框看不见呢??
void CNewMediaDlg::OnTimer(UINT_PTR nIDEvent) //定时器事件
{
if (nIDEvent == 100)
{
m_loadTime++;
if (m_loadTime == 3)
{
m_loadTime = 0;
KillTimer(100); //杀掉定时器
if (m_pLoadDlg != NULL)
{
delete m_pLoadDlg; //关闭提示对话框
m_pLoadDlg = NULL;
}
}
}
CDialog::OnTimer(nIDEvent);
}void CNewMediaDlg::displayLoadDlg()
{
m_loadTime = 0;
KillTimer(100); //确保没有这个定时器
if (m_pLoadDlg != NULL)
{
delete m_pLoadDlg;
m_pLoadDlg = NULL;
}
m_pLoadDlg = new CLoadingDlg;
m_pLoadDlg->Create(IDD_LoadingDlg); //弹出提示对画框
SetTimer(100, 260, NULL); //设置定时器
}void CNewMediaDlg::FlashCallShockwaveflashMain(LPCTSTR request)
{
CString strInput;
strInput = request; int fuc_playTV = -1;
fuc_playTV = strInput.Find(_T("CallMyTV"), 0);
if (fuc_playTV > 0)
{
displayLoadDlg(); //展示提示对话框
CTVDLL dlg;
dlg.ShowDlg(); //加载DLL显示DLL中的对话框
}
}//DLL中的代码
void CTVDLL::ShowDlg()
{
CTvPlayerDlg tvDlg; //主要因为加载构造CTvPlayerDlg类对象时费点时间,考虑到用户体验性所以想在其中加一个提示过渡对话框
tvDlg.DoModal();
}请大家帮忙看看??
void CNewMediaDlg::OnTimer(UINT_PTR nIDEvent) //定时器事件
{
if (nIDEvent == 100)
{
m_loadTime++;
if (m_loadTime == 3)
{
m_loadTime = 0;
KillTimer(100); //杀掉定时器
if (m_pLoadDlg != NULL)
{
delete m_pLoadDlg; //关闭提示对话框
m_pLoadDlg = NULL;
}
}
}
CDialog::OnTimer(nIDEvent);
}void CNewMediaDlg::displayLoadDlg()
{
m_loadTime = 0;
KillTimer(100); //确保没有这个定时器
if (m_pLoadDlg != NULL)
{
delete m_pLoadDlg;
m_pLoadDlg = NULL;
}
m_pLoadDlg = new CLoadingDlg;
m_pLoadDlg->Create(IDD_LoadingDlg); //弹出提示对画框
SetTimer(100, 260, NULL); //设置定时器
}void CNewMediaDlg::FlashCallShockwaveflashMain(LPCTSTR request)
{
CString strInput;
strInput = request; int fuc_playTV = -1;
fuc_playTV = strInput.Find(_T("CallMyTV"), 0);
if (fuc_playTV > 0)
{
displayLoadDlg(); //展示提示对话框
CTVDLL dlg;
dlg.ShowDlg(); //加载DLL显示DLL中的对话框
}
}//DLL中的代码
void CTVDLL::ShowDlg()
{
CTvPlayerDlg tvDlg; //主要因为加载构造CTvPlayerDlg类对象时费点时间,考虑到用户体验性所以想在其中加一个提示过渡对话框
tvDlg.DoModal();
}请大家帮忙看看??
-------------------------------------------
DLL 的 WAIMAIN 函数中加几句代码BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{ switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
//提示 应用程序正在加载,请稍后
//实现代码
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
用LoadLibrary显示调用太复杂,我用的隐式调用直接在应用程序中加入.lib文件
你在定时器中 写了计数三次后就销毁对话框 当然一闪就不见了
void CTVDLL::ShowDlg()
{
CTvPlayerDlg tvDlg; //主要因为加载构造CTvPlayerDlg类对象时费点时间,考虑到用户体验性所以想在其中加一个提示过渡对话框
tvDlg.DoModal();
}
------------------------------------------------------------------------------
以上各位讨论的重点都是加载DLL的,可是我说了原因是因为DLL中主对话框CTvPlayerDlg类构造对象费时间,因为这个类需要注册一些必要的Filter组件,创建Filter graph Manage,加载flash资源所以用程序来加载这个应用程序DLL看起来就是要等几秒才会显示这个DLL的主对话框