如何弹出含有进度条的对话框?
当用户点击用户界面的某一按钮的时候,通知辅助线程进行事务处理,需要消耗一定的时间。 这个时候希望弹出一个对话框,告知用户正在处理。
这样怎么实现呢?
我自己从CDialog 派生了一个含有进度条的类 CProgDlg theDlg;
但是无法显示出来
线程里面能不能生成对话框阿? 即:
CProgDlg theDlg;
theDlg.modal();
问题点数:20、回复次数:16Top
1 楼zhucde(【風間苍月】★<==>★【虚拟闲人】)回复于 2004-08-01 16:53:51 得分 4
线程里可以产生对话框.
但推荐用线程类来实现.
Top
2 楼mingbao(★情已逝★)回复于 2004-08-01 19:31:16 得分 0
CProgDlg theDlg;
theDlg.modal(); //必然等到这个函数返回之后,它下面的代码才能接着执行
你可以将线程写进该对话框类内部,在 OnInitilDlg ( )中启动线程, 然后在线程中访问对话框中的进度条,控制它变化Top
3 楼wongflying(网飞飞)回复于 2004-08-01 21:28:03 得分 0
建议采取无模式对话框,或者通过消息来通知对话框当前进度条的位置!Top
4 楼flyelf(空谷清音)回复于 2004-08-01 21:50:00 得分 3
1、使用非模式对话框来实现进度
2、如果使用模式对话框,则可以在该对话框中用线程完成任务,而主界面更新进度Top
5 楼lostiger(傅立叶变换)回复于 2004-08-07 12:01:08 得分 0
谢谢大家
这几天没能上网
我按照大家的 建议 在线程里面使用了 非模式对话框
UINT CMobileComm::MobileThread(LPVOID lpParam)
{
...........
ProgessDlg = new CProgDlg( );
AfxMessageBox("对话框1");
if( ProgessDlg->Create(IDD_MY_PROGDLG, p->m_powner) == TRUE )
AfxMessageBox("对话框2");
ProgessDlg->ShowWindow(SW_SHOW);
...........
}
p->m_powner是对话框(进度条对话框)的父窗口 我把它指向程序的CMainFrame
但是每次显示的时候 对话框总是在 程序的左上角显示出来 不知道怎么样调整它的位置
还有 每次运行的时候都出这个错误:
Debug Assertion Failed!
File: wincore.cpp
line: 883
我看了 wincore.cpp的883行 是这个语句:
ASSERT((p = pMap->LookupPermanent(m_hWnd)) != NULL ||
(p = pMap->LookupTemporary(m_hWnd)) != NULL);
向请教一下大家这是怎么回事?Top
6 楼21bird(世纪笨鸟:csdn的blog啊啥时能不出错?!)回复于 2004-08-07 18:47:40 得分 3
>>但是每次显示的时候 对话框总是在 程序的左上角显示出来 不知道怎么样调整它的位置
将对话框的父窗口设为程序主窗口(比如mainframe)就可以了。Top
7 楼21bird(世纪笨鸟:csdn的blog啊啥时能不出错?!)回复于 2004-08-07 18:48:38 得分 0
哦,忘了一句:还要在对话框资源的属性里设下那个cente~Top
8 楼lostiger(傅立叶变换)回复于 2004-08-09 09:26:20 得分 0
谢谢
这个我已经实现过了
但是在debug模式下面 总是弹出这个Assert 错误的窗口
不知道怎么回事Top
9 楼lostiger(傅立叶变换)回复于 2004-08-09 17:06:38 得分 0
up
线程中
非模态对话框 create的时候
父窗口的指针 应该怎么指定啊? 有什么特别的要求吗?
Top
10 楼21bird(世纪笨鸟:csdn的blog啊啥时能不出错?!)回复于 2004-08-09 19:17:01 得分 0
Assert 错误的窗口,啥内容?Top
11 楼jiangsheng(蒋晟.Net[MVP])回复于 2004-08-09 20:03:26 得分 10
ASSERT((p = pMap->LookupPermanent(m_hWnd)) != NULL ||
(p = pMap->LookupTemporary(m_hWnd)) != NULL);
表明你使用了其他线程创建的MFC对象
参见http://blog.csdn.net/jiangsheng/archive/2004/01/05/3797.aspxTop
12 楼tryber(Go with the CWnd)回复于 2004-08-09 22:21:57 得分 0
如果你用的vc6.0的话,里面有个Vc组件做得很棒.用Vc6.0生成后可在vc.net用.
'project'->'Add to project'->'Components and Controls'->'Visual C++ Components'->'Progress Dialog'
还是单线实现,一般的应用足矣.
Top
13 楼lostiger(傅立叶变换)回复于 2004-08-10 10:00:51 得分 0
To 21bird(世纪菜鸟:sailing) :
ASSERT错误:
还有 每次运行的时候都出这个错误:
Debug Assertion Failed!
File: wincore.cpp
line: 883
我看了 wincore.cpp的883行 是这个语句:
ASSERT((p = pMap->LookupPermanent(m_hWnd)) != NULL ||
(p = pMap->LookupTemporary(m_hWnd)) != NULL);
向请教一下大家这是怎么回事?
Top
14 楼lostiger(傅立叶变换)回复于 2004-08-10 10:24:03 得分 0
谢谢: jiangsheng(蒋晟.MSMVP2004Jan) :
我看了:http://support.microsoft.com/default.aspx?scid=kb;en-us;147578
这里面说线程里面不能传递mfc 对象, 但是句柄是可以的
是不是说 我在线程里面创建 非模态的对话框的时候 不能将对话框的父窗口指定为 主界面线程的框架对象呢?
我将父窗口指定为 NULL 则没有错误
但是这个对话框 不受控制 还可以操做主界面 不能起到阻塞主界面的作用Top
15 楼jiangsheng(蒋晟.Net[MVP])回复于 2004-08-10 13:30:37 得分 0
当然
你可以用CWnd::FromHandle来创建一个本线程内的句柄对象映射Top
16 楼21bird(世纪笨鸟:csdn的blog啊啥时能不出错?!)回复于 2004-08-11 15:48:04 得分 0
lostiger(傅立叶变换) :
不好意思,没看全,没看到你上面已经说了我还问:$Top




