[问题] 请问MFC create dialog的问题

楼主: Keitaro (动き出す时间...)   2014-08-15 00:21:55
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC2008
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
None
问题(Question):
MFC create dialog出问题,请看底下说明
补充说明(Supplement):
版上各位好,不才小弟又上来请教一个MFC的问题。
今天在工作时,碰到了一个怪现象,还请各位指教。
因为工作的关系我不能把所有的程式码都贴上来,只能把出问题的地方概述一下。
我在一个dialog里面的一个按钮写的功能是这样的
"当按钮被按下时,建立一个新的dialog,从server下载档案,dialog要显示下载进度"
原本我直接在触发事件的OnLButtonDown写这样
void DialogB::OnLButtonDown()
{
pA = new DialogA();
pA->Create(ID_A);
pA->ShowWindow(SW_SHOW);
}
pA这个位址被宣告在DialogB里面
class DialogB : public CDialog
{
DialogB();
~DialogB();
DialogA* pA;
}
后来考虑到user如果按了好几次,那么pA就会一直new dialog,
之前被new出来的dialog没有delete,造成memory leak。
所以我把new的两行动作放到DialogB的建构式里面去做。
如下所示
DialogB::DialogB()
{
pA = new DialogA();
pA->Create(ID_A);
pA->ShowWindow(SW_HIDE)
}
void DialogB::OnLButtonDown()
{
pA->ShowWindow(SW_SHOW)
}
程式跑起来却crash,发现原因是pA这个dialog上面显示的一些文字的handle为NULL。
这些文字可能拿来显示下载的进度、传输速度之类的。
我用debug mode去看,发现当程式执行到
pA->Create(ID_A);
这一行时,跳到CDialog的OnInitDialog
bool DialogA::OnInitDialog()
{
CDialog::OnInitDialog();
......//底下是其他显示文字、动画的检查跟设定
return true;
}
我在debug mode底下看到,当程式执行完
CDialog::OnInitDialog();
这一行时,this指标底下所有元件handle全部都建立起来了。
然后一直跑到最底下的右刮号"}",
我看到this指标底下所有元件的handle都还是存在的,并非NULL。
问题来了,跑完OnInitDialog,按F5使得程式停在
pA->ShowWindow(SW_HIDE)
我看到pA所有的元件的handle全都变成0了。
我确定在离开OnInitDialog最后一行,handle都有数值的。
但windows初始化完dialog回到原本create pA的建构式,
中间的程式码,windows做了什么,看不到,也无从得知。
有没有什么可能原因,是再离开OnInitDialog后,所有元件的handle又被清除的?
另一个线索是,我测试把OnInitDialog底下所有的东西,全部拿出来,
放到另一个function里面,改成这样
bool DialogA::OnInitDialog()
{
CDialog::OnInitDialog();
return true;
}
void DialogA::Test()
{
......//原本放在OnInitDialog里面要做的事
}
然后DialogB的建构式改为这样
DialogB::DialogB()
{
pA = new DialogA();
pA->Create(ID_A);
pA->Test();
pA->ShowWindow(SW_HIDE)
}
神奇,改成这样handle就不会被清掉了!
请教版上各位先进,原本的写法,有可能发生了什么事,
让windows把我建好的handle给清掉了?
谢谢!
作者: TeaEEE (爱不趴 不爱趴)   2014-08-15 02:18:00
你的dialogB是modal还是modaless
楼主: Keitaro (动き出す时间...)   2014-08-15 02:25:00
两个都是new出来的,modelless
作者: TeaEEE (爱不趴 不爱趴)   2014-08-15 11:10:00
如果都是modaless,你把dialogB中new A的动作移到B的OnIniOnInitDialog

Links booklink

Contact Us: admin [ a t ] ucptt.com