模态非模态对话框的问题

lg0215081 2011-11-30 03:57:37
工程有以下类:
CScmsApp
CScmsDlg
因为在主对话框CScmsDlg的OnInitDialog中有一个初始化的过程(该过程具体内容不透露了)。该过程耗时较长。
我想在显示主对话框前显示一个提示对话框,对话框中有一个静态文本框,内容为“正在初始化办卡,请稍候....”。
如果是主在对话框CScmsDlg的OnInitDialog中建立 CTipDlg dlg; dlg.domodal; 的话,该提示对话框中的静态文本框内容可见。
但是如果我在CScmsDlg里增加成员*m_pTipDlg,在主对话框CScmsDlg的OnInitDialog中用 m_pTipDlg->create(IDD_TIPDLG,this);m_pTipDlg->showwindow(sw_show);的方式,则显示对话框,但静态文本框及内容都不可见了,不知为什么?
求帮助?
...全文
252 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
lg0215081 2011-12-05
  • 打赏
  • 举报
回复
TO:
bazzi2011
(宝宝天然呆)
非常感谢! 明白了!
bazzi2011 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 lg0215081 的回复:]
BOOL CDlgApp::InitInstance()
{
..................
..................
////////////////////////////////////////////////////////////////////
// m_InitDlg.DoModal(); // 可以显示窗口的静态文本框的内容
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
m_InitDlg.Create(IDD_DIALOG1); // 不可以显示窗口的静态文本框的内容
m_InitDlg.ShowWindow(SW_SHOW);


Sleep(5000);

m_InitDlg.ExitDlg();
////////////////////////////////////////////////////////////////////
// m_InitDl……
[/Quote]

我试了一下,不论在OnInitDialog还是InitInstance创建非模态对话框,如果不执行完这两个初始化函数的话,非模态对话框上面的控件是不能显示出来的。

楼主不妨试试注释掉

Sleep(5000);
m_InitDlg.ExitDlg();


这两句话,这时你会发现这个非模态对话框会和主对话框一起弹出来的。而这个时候、非模态对话框上面的文本是可以显示出来的。

但是我明白楼主的意思是想要非模态先弹出来做提示,然后销毁,再把主对话框弹出...

但因为不执行完OnInitDialog或InitInstance,非模态对话框上是不可能显示出控件的。所以楼主想要的效果无法实现。
这涉及到MFC底层封装的问题,要改的话恐怕非常麻烦,没必要去这么做。

============
其实楼主完全可以用模态对话框来实现,只要定时销毁它就行了。
若坚持用非模态对话框,那么你只能先隐藏住主对话框,执行完OnInitDialog或InitInstance,非模态对话框弹出,显示出静态文本,过一会儿,销毁非模态对话框,再显示出主对话框。

lg0215081 2011-12-05
  • 打赏
  • 举报
回复
TO:
bazzi2011
(宝宝天然呆)
或者你建一个对话框工程。
插入一个对话框,插入一个静态文本框,写些内容。按照我的写法试试模态和非模态。
lg0215081 2011-12-05
  • 打赏
  • 举报
回复
bazzi2011
(宝宝天然呆)
你好,你邮箱是?
帮我看看这个demo!

BOOL CDlgApp::InitInstance()
{
..................
..................
////////////////////////////////////////////////////////////////////
// m_InitDlg.DoModal(); // 可以显示窗口的静态文本框的内容
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
m_InitDlg.Create(IDD_DIALOG1); // 不可以显示窗口的静态文本框的内容
m_InitDlg.ShowWindow(SW_SHOW);


Sleep(5000);

m_InitDlg.ExitDlg();
/////////////////////////////////////////////////////////////////////
..................
..................

}
lg0215081 2011-12-05
  • 打赏
  • 举报
回复
10楼你好:
我做了一个简单的测试demo,确实是不行啊!
你的邮箱是?我把我的Demo发给你,帮我看看呗!
bazzi2011 2011-12-02
  • 打赏
  • 举报
回复
照楼主的问题,我写了一个测试程序,无论的模态还是非模态,我的对话框上的文字都可以显示出来啊!为什么楼主的不可以呢???

确定以下这个问题:
1,你那个弹出的对话框上面的“正在初始化办卡,请稍候...”这句话和其它程序代码有没有交集???它的ID是IDC_STATIC吗???
如果是的话,那么弹出对话框,不可能显示不出来这段文字。这和模态还是非模态没有关系。楼主不妨 删除执行文件,重新编译一下,有的时候可能是编译器的问题。

如果那不是的话,那么就是有可能你其他的代码影响看文字的显示。

lg0215081 2011-12-02
  • 打赏
  • 举报
回复
谢谢各位的建议!
特别感谢5、6楼的经验指导!
但是都没有解决我的问题啊!
以 CTipDlg dlg; dlg.domodal; 的方式的话,其中的静态文本框及字可见。
但是以
CTipDlg *m_pdlg; m_pdlg=new CTipDlg; m_pdlg->create(); m_pdlg->showwindow(sw_show)的方式则静态文本空间及字不可见,为什么呢?还没有答案啊!
S_S_Ge 2011-12-01
  • 打赏
  • 举报
回复
new

delete
xyh79639981 2011-12-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 shen_wei 的回复:]
CScmsDlg *m_pTipDlg = new CScmsDlg ;
[/Quote]

非模态需要new空间的
bazzi2011 2011-12-01
  • 打赏
  • 举报
回复
不推荐楼主用 在OnInitDialog弹出另外一个对话框这种方法!

楼主可以为对话框添加一个启动画面,用一副位图来实现你的需求。

给你看些资料,是为对话框程序添加启动画面的,你把启动画面改一下,加上你的字符说明就行了!

基于对话框的应用程序添加启动画面
http://blog.sina.com.cn/s/blog_4c87a569010008mw.html


如何给基于对话框的应用加启动画面
http://www.vckbase.com/document/viewdoc/?id=513
Kaile 2011-11-30
  • 打赏
  • 举报
回复
OnInitDialog中弹另外一个对话框,不是一个好的设计。

可以在主对话框 DoModal之前,ShowWindow 子对话框

主对话框显示完成后,发一个消息给子对话框,让他关闭
shen_wei 2011-11-30
  • 打赏
  • 举报
回复
CScmsDlg *m_pTipDlg = new CScmsDlg ;
wwzzz 2011-11-30
  • 打赏
  • 举报
回复
sleep一下试试
lg0215081 2011-11-30
  • 打赏
  • 举报
回复
我也觉得没问题,但是它就是不出来啊
Eleven 2011-11-30
  • 打赏
  • 举报
回复
应该没有问题~

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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