• 全部
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

关于模式对话框的问题(实在不解)

幽游闭关 2008-11-25 10:47:05
先描述下我的问题:

主窗口(CStartDlg)里有个启动按钮,click事件里会创建很多子窗口
现在我要添加一个动态模式对话框(CDataInputDlg)来接受数据输入,但是我的对话框显示要由外部事件来通知
所以我在主窗口这里定义一个全局函数OnCMSend()
在这个全局函数这里创建模式对话框并显示,但是 失败了,
很奇怪的是我放到CStartDlg里的启动事件里和原先那些子窗口一起启动时可以创建,但不是我要的效果(外部通知时才显示模式对话框)
StartDlg.h 里定义模式对话框对象 CDataInputDlg m_DataInputDlg;
void CStartDlg::OnCMSend(char *ServerName, long SeqNo)
{
m_DataInputDlg.DoModal(); //modal
m_DataInputDlg.Create(IDD_DIALOG_DATAINPUT, this);
m_DataInputDlg.ShowWindow(SW_SHOW);
m_DataInputDlg.CMSendNotice(ServerName, SeqNo);
}

还有我在主窗口创建的对象,然后在子窗口输入数据完成后关闭对话框
那么主窗口创建的对象资源是不是还没有被释放的

请各位帮我看看
感激不尽~
...全文
96 点赞 收藏 15
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
幽游闭关 2008-11-25
问题解决了。
原因是那个全局函数是由C直接调用的
可能内核不支持对外全局函数里创建对象资源
我用windows消息转发了一次就OK了

void CStartDlg::OnCMSend(char *ServerName, long SeqNo)
{
if(this != NULL && this->m_hWnd != NULL)
PostMessage(DATAINPUT_MSG,(WPARAM)ServerName, (LPARAM)SeqNo);
}

void CStartDlg::DataInputDisp(WPARAM wParam, LPARAM lParam)
{
char *ServerName = (char*)lParam;
long SeqNo = (long)wParam;
m_DataInputDlg.CMSendNotice(ServerName, SeqNo);
m_DataInputDlg.DoModal(); //modal
}


还是感谢楼上热心解答的各位朋友
至少我现在知道模式和非模式对话框的创建方法

==来结帖

回复
chexlong 2008-11-25
http://topic.csdn.net/t/20020425/13/675488.html //再问,如何动态创建模式对话框
http://blog.chinaunix.net/u2/67530/showart_602977.html //如何创建有模式对话框
http://www.vckbase.com/document/viewdoc/?id=794 //无模式对话框的创建与使用
回复
wzaen 2008-11-25
汗,楼主究竟是要模态还是非模态对话框???
回复
hellward 2008-11-25
[Quote=引用 3 楼 zaodt 的回复:]




模态对话框使用 DoModal() 创建,这个函数返回时,它的窗口对象已经不存在。


非模态对话框使用 Create 创建,需要用 Destroy 释放窗口对象。
[/Quote]嗯
回复
BH2008 2008-11-25
你的问题不是很清晰啊
回复
BH2008 2008-11-25
[Quote=引用 7 楼 lukocho 的回复:]
引用 3 楼 zaodt 的回复:




模态对话框使用 DoModal() 创建,这个函数返回时,它的窗口对象已经不存在。


非模态对话框使用 Create 创建,需要用 Destroy 释放窗口对象。


定义一个对象直接DoModal() 创建么 ?
不用 new ?
那么定义的对象需要释放么
[/Quote]
用模态对话框是不需要对对象释放的
回复
cnzdgs 2008-11-25
OnCMSend函数什么时候执行?
模态对话框在关闭的时候窗口资源就释放了,类对象是由自己的代码来释放的,你这段代码中类对象是CStartDlg的成员变量,要等到CStartDlg对象释放时才会释放。
回复
幽游闭关 2008-11-25
各位帮忙的朋友呢
回复
幽游闭关 2008-11-25
[Quote=引用 3 楼 zaodt 的回复:]




模态对话框使用 DoModal() 创建,这个函数返回时,它的窗口对象已经不存在。


非模态对话框使用 Create 创建,需要用 Destroy 释放窗口对象。
[/Quote]

定义一个对象直接DoModal() 创建么 ?
不用 new ?
那么定义的对象需要释放么
回复
幽游闭关 2008-11-25
[Quote=引用 1 楼 jason_wentzel 的回复:]
模式对话框不是用DoModal
改成
CDataInputDlg *m_DataInputDlg;
m_DataInputDlg = new CDataInputDlg ;//主程序析构函数中delete掉
m_DataInputDlg->Create(IDD_DIALOG_DATAINPUT, this);
m_DataInputDlg->ShowWindow(SW_SHOW);
[/Quote]


m_DataInputDlg = new CDataInputDlg ;
这句编译没通过啊
error C2582: 'CDataInputDlg' : 代入演算子 'operator =' 未定义。
如果这句不添加
运行错误 ASSERT((CWnd*)p == this); // must be us

还有请问下 //主程序析构函数中delete掉
那我这里是每次通知过来都会创建的那是不是会一直申请资源啊
因为我是在StartDlg.h 里定义模式对话框对象,那么作为私有成员
第一次创建成功后就有了资源,但我数据输入完成返回后资源还在么
第二次创建时是个什么样的情况
回复
ccl3311 2008-11-25
[Quote=引用 1 楼 jason_wentzel 的回复:]
模式对话框不是用DoModal
改成
CDataInputDlg *m_DataInputDlg;
m_DataInputDlg = new CDataInputDlg ;//主程序析构函数中delete掉
m_DataInputDlg->Create(IDD_DIALOG_DATAINPUT, this);
  m_DataInputDlg->ShowWindow(SW_SHOW);
[/Quote]

这好像是非模式对话框吧!
回复
孤客天涯 2008-11-25
不好意思
说反了,非模式对话框用上面的
模式的m_DataInputDlg.DoModal(); 就行了,不用Create了
回复
zaodt 2008-11-25




模态对话框使用 DoModal() 创建,这个函数返回时,它的窗口对象已经不存在。


非模态对话框使用 Create 创建,需要用 Destroy 释放窗口对象。
回复
ccl3311 2008-11-25
学习
回复
孤客天涯 2008-11-25
模式对话框不是用DoModal
改成
CDataInputDlg *m_DataInputDlg;
m_DataInputDlg = new CDataInputDlg ;//主程序析构函数中delete掉
m_DataInputDlg->Create(IDD_DIALOG_DATAINPUT, this);
m_DataInputDlg->ShowWindow(SW_SHOW);
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2008-11-25 10:47
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……