模式对话框的问题,你一定会晓得。 我在程序中使用一个模式对话框,让用户填写一些东西后,运行我的一个较花时间的程序,但我发现,这个对话框一直会显示,一直要到我的较大程序运行完毕后,才消失。我的这个较大程序并不在对话框中的,我只是通过对话框得到某些运行参数。我现在想让用户在点击 OK 后,对话框就消失,不知道如何处理? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 OK事件中加入CDialog::OnClose() 通过此对话框来运行此大程序,我不太清楚你试试在调用此程序的函数后添加对话框关闭函数就可以了吧(CDialog类派生的应该都可以用OnOk来关闭) 我是这样: 我在菜单中打开了一个对话框,用户填写一个参数后,OK返回。 我在主程序中就要使用这个参数,并用这个参数进行一个较花 时间的函数,使用法如下:void CDigitalView::OnInsert() // Insert彩蛋{CInsertDlg InsertDlg; //模式对话框 if (InsertDlg.DoModal()==IDOK){ if (InsertDlg.m_strFile!="") { CString strTemp=InsertDlg.m_strInfo; DispProgress (strTemp); // 花时间的函数 }}}这里对话框一直在显示,不消失我现在就想让它不显示,而显示另外一个进度条窗体。 重写OnDestroy();如void CYourDlg::OnDestroy{ CDialog::OnDestroy(); // 在此添加你的代码 // 可显示另一个窗口等}================================================================CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!★ 浏览帖子速度极快![建议系统使用ie5.5以上]。 ★ 多种帖子实现界面。 ★ 保存帖子到本地[html格式]★ 监视您关注帖子的回复更新。★ 可以直接发贴、回复帖子★ 采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录! ★ 支持在线检测程序升级情况,可及时获得程序更新的信息。★★ 签名 ● 可以在您的每个帖子的后面自动加上一个自己设计的签名哟。Http://www.ChinaOK.net/csdn/csdn.zipHttp://www.ChinaOK.net/csdn/csdn.rarHttp://www.ChinaOK.net/csdn/csdn.exe [自解压] 此乃主体窗口没有更新的缘故。DispProgress (strTemp);不应该放在此处,在此处应放一PostMessage然后再WindowProc中调用DispProgress (strTemp)在PostMessage(WM_MYMSG)之前调用Invalidate()即可。 CInsertDlg类中的OnOK()函数是怎么写的?CInsertDlg::OnOK(){ CDialog::OnOK();}或你自己写CInsertDlg::OnOK(){ UpdateData(TRUE); EndDialog(IDOK);} 我的感觉就是他要执行完菜单 OnInsert()后,窗体才关闭。 我的感觉就是他要执行完菜单 OnInsert()后,窗体才关闭。 就在你调用运行那程序的函数前用OnOK() 我來猜一下: 有可能是你的第二個函數導致主窗口來不及刷新。你試著在domadal以後sleep(500). 真是好像永不刷新我试验了以上各位的方法,都一样我都已经改成SendMessage ()的方式来执行我教花时间的函数了结果还是一样我发现:如果我在该函数前加一句 AfxMessageBox ("123");那么窗口立刻就消失了。 在那个语句前加上Invalidate(),或是干脆把处理过程做成一个工作线程 有可能你这个费时程序同时还很耗CPU。试一下先Invalidate,然后post自定义消息,在消息处理程序中做该耗时工作 用SendMessage 程序可以工作用PostMessage 程序就出错。这是为什么? 跟踪发现: 使用PostMessage 参数没有传递过来 为什么?? 改成PostMessage还是不刷新。现在我已经改成这样 定义一个全局变量在头文件中Info 结构void CDigitalView::OnInsert() // Insert彩蛋{CInsertDlg InsertDlg; //模式对话框 if (InsertDlg.DoModal()==IDOK){ if (InsertDlg.m_strFile!="") { Info.strInfo=InsertDlg.m_strInfo; Info.nNum=InsertDlg.m_nNum; }}PostMessage (WM_DISPPTROGRESS,0,(LPARAM )&Info); }然后处理消息,函数运行正常,可惜就是不刷新。难道只有使用线城了? PostMessage (WM_DISPPTROGRESS,0,(LPARAM )&Info); 之前Invalidate()一下 void CDigitalView::OnInsert() // Insert彩蛋{CInsertDlg InsertDlg; //模式对话框 if (InsertDlg.DoModal()==IDOK){ if (InsertDlg.m_strFile!="") { CString strTemp=InsertDlg.m_strInfo; DispProgress (strTemp); // 花时间的函数 }}}你直接在这个函数前加上显示进度条的代码,不行吗? alanwang_(alan 你说的方法我已经试验过,效果一样。都不刷新。 goodsong(如风) 直接在该函数前加 有进度条的窗体。会出现,该窗体 在函数运行完之前,显示的是一片灰色。也就是根本没有显示出进度条 进度条:我不想让进度条是由Timer 来控制。我想在DispProgress ()中加入一些消息,然后发给有进度条的窗体,这样来达到真正的进度条显示。当然,现在我还没有加消息,我现在只是希望这个有进度条的窗体正常显示出来 无查询记录时报错 socket 信息发送的问题 改变窗口大小的时候,这时候会有什么消息发出 请教——关于程序强制关闭后的处理 在线等!!急!数据库中的Image字段问题 关于VC++的源代码 有关CTime的一个简单问题,哪位大侠看一下 我要选择一个文件夹,返回用户选择的路径,用什么方法? 非高手止步~~ win32 sdk 对话框图标显示 请教CListCtrl 初试化的问题? 各位高手救救我吧!!!我非常喜欢MSDN网站上的类库参考,可惜网速太慢,而我的电脑死活装不上MSDN,请问那里有类似的E-BOOK下载??(别
CDialog::OnClose()
你试试在调用此程序的函数后添加对话框关闭函数就
可以了吧(CDialog类派生的应该都可以用OnOk来关闭)
我在菜单中打开了一个对话框,用户填写一个参数后,OK返回。
我在主程序中就要使用这个参数,并用这个参数进行一个较花
时间的函数,使用法如下:void CDigitalView::OnInsert() // Insert彩蛋
{
CInsertDlg InsertDlg; //模式对话框
if (InsertDlg.DoModal()==IDOK)
{
if (InsertDlg.m_strFile!="")
{
CString strTemp=InsertDlg.m_strInfo;
DispProgress (strTemp); // 花时间的函数
}
}
}
这里对话框一直在显示,不消失
我现在就想让它不显示,而显示另外一个进度条窗体。
如
void CYourDlg::OnDestroy
{
CDialog::OnDestroy(); // 在此添加你的代码
// 可显示另一个窗口等
}
================================================================CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!★ 浏览帖子速度极快![建议系统使用ie5.5以上]。 ★ 多种帖子实现界面。
★ 保存帖子到本地[html格式]★ 监视您关注帖子的回复更新。
★ 可以直接发贴、回复帖子★ 采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录!
★ 支持在线检测程序升级情况,可及时获得程序更新的信息。★★ 签名 ●
可以在您的每个帖子的后面自动加上一个自己设计的签名哟。Http://www.ChinaOK.net/csdn/csdn.zip
Http://www.ChinaOK.net/csdn/csdn.rar
Http://www.ChinaOK.net/csdn/csdn.exe [自解压]
然后再WindowProc中调用DispProgress (strTemp)在PostMessage(WM_MYMSG)之前调用Invalidate()即可。
{
CDialog::OnOK();
}
或你自己写
CInsertDlg::OnOK()
{
UpdateData(TRUE);
EndDialog(IDOK);
}
后,窗体才关闭。
后,窗体才关闭。
我试验了以上各位的方法,都一样
我都已经改成SendMessage ()
的方式来执行我教花时间的函数了
结果还是一样
我发现:如果我在该函数前加一句 AfxMessageBox ("123");
那么窗口立刻就消失了。
试一下先Invalidate,然后post自定义消息,在消息处理程序中做该耗时工作
这是为什么?
使用PostMessage 参数没有传递过来 为什么??
现在我已经改成这样
定义一个全局变量在头文件中
Info 结构
void CDigitalView::OnInsert() // Insert彩蛋
{
CInsertDlg InsertDlg; //模式对话框
if (InsertDlg.DoModal()==IDOK)
{
if (InsertDlg.m_strFile!="")
{
Info.strInfo=InsertDlg.m_strInfo;
Info.nNum=InsertDlg.m_nNum;
}
}PostMessage (WM_DISPPTROGRESS,0,(LPARAM )&Info);
}然后处理消息,函数运行正常,可惜就是不刷新。难道只有使用线城了?
之前Invalidate()一下
{
CInsertDlg InsertDlg; //模式对话框
if (InsertDlg.DoModal()==IDOK)
{
if (InsertDlg.m_strFile!="")
{
CString strTemp=InsertDlg.m_strInfo;
DispProgress (strTemp); // 花时间的函数
}
}
}
你直接在这个函数前加上显示进度条的代码,不行吗?
在函数运行完之前,显示的是一片灰色。也就是根本没有显示出进度条 进度条:我不想让进度条是由Timer 来控制。我想在DispProgress ()中加入一些消息,然后发给有进度条的窗体,这样来达到真正的进度条显示。当然,现在我还没有加消息,我现在只是希望这个有进度条的窗体正常显示出来