关于无模式对话框的问题

xiezonglin 2009-08-20 08:23:08
是这样的,我一个主对话框里面点一个按钮后建立一个无模式对话框,但是我希望只打开一次这个无模式对话框.
也就是说这个无模式对话框如果没建立或者关掉了我就重新建立,否则我就不建立.
有一个方法是子对话框在销毁的时候发送消息给父对话框,但是这样比较麻烦,还得自定义消息(太多自定义消息以后又怕不小心和系统消息冲突),还得在父窗口进行消息映射.
有没办法通过判断建立这个无模式对话框的指针来判断?我试过如果通过判断这个指针是否为NULL的话在自对话框关掉的时候会出错. 或者有没有别的简单的办法直接在父对话框判断子对话框是否关闭?
...全文
150 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
楼上回答有点意思!
Conry 2009-08-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 churenxh 的回复:]
引用 5 楼 feiyuhuapeng 的回复:
在主对话框的.h里加#include "TestDlg.h"(CTestDlg是无模式对话框的类)
先定义个全局的无模式对话框的指针,如CTestDlg *m_dlg;
在构造里把m_dlg=NULL;
在你要产生的按钮事件里

if(m_dlg==NULL)
{
  m_dlg=new CTestDlg ();
  m_dlg->creat(无模式对话框的ID);
}
  m_dlg->ShowWindow(true);


楼上的已经可以解决你的问题了
窗体销毁了,指针也就相应销毁了
你的思路反了
[/Quote]
谁说的窗体销毁了,指针也就相应销毁了
那野指针是什么?

锁子被砸了,钥匙也会坏吗
xiezonglin 2009-08-21
  • 打赏
  • 举报
回复

	if(m_dlg!=NULL)
{
if(IsWindow(m_lg->m_hWnd))
{
m_dlg->SetFocus();
return;
}
}
m_dlg=new CXXDlg;
m_dlg->Create(IDD_SORT_DIALOG,this);
m_dlg->ShowWindow(SW_SHOW);

事实上我是这样写的,很奇怪一点,就是销毁窗口后m_lg->m_hWnd这个还能得到,而且是我已经在子窗口里面delete this了,事实上也已经跳到那边去了
Allen_zhang 2009-08-21
  • 打赏
  • 举报
回复
给你一段以前写的,用过没有问题,不过和你上面的差不多

在窗口外部你只能用窗口句柄来判断这个窗口是否已经销毁
至于你说你已经删掉那个窗口,但是句柄不为空,那就是你窗口关闭有问题
非模态的窗口销毁需要调用destroywindow的,你的问题很有可能是窗口关闭时没有正确销毁窗口


if ( m_pDlg != NULL && m_pDlg->m_hWnd == NULL )
{
delete m_pDlg;
m_pDlg = NULL;
}
if ( m_pDlg == NULL )
{
m_dlg=new CXXDlg;
m_dlg->Create(IDD_SORT_DIALOG,this);
m_dlg->ShowWindow(SW_SHOW);
}
churenxh 2009-08-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 feiyuhuapeng 的回复:]
在主对话框的.h里加#include "TestDlg.h"(CTestDlg是无模式对话框的类)
先定义个全局的无模式对话框的指针,如CTestDlg *m_dlg;
在构造里把m_dlg=NULL;
在你要产生的按钮事件里

if(m_dlg==NULL)
{
  m_dlg=new CTestDlg ();
  m_dlg->creat(无模式对话框的ID);
}
  m_dlg->ShowWindow(true);

[/Quote]
楼上的已经可以解决你的问题了
窗体销毁了,指针也就相应销毁了
你的思路反了
feiyuhuapeng 2009-08-20
  • 打赏
  • 举报
回复
你可以再主窗口重载ON DESTROY中把
if(m_dlg!=NULL)
{
delete m_dlg;
}
feiyuhuapeng 2009-08-20
  • 打赏
  • 举报
回复
我是在主窗口的按钮函数里掉的创建无模式对话框
在主窗口的构造里把m_dlg=NULL;
你创建了无模式对话框后m_dlg!=NUll了。
那就不会再创建新的无模式对话框
当你关闭无模式对话框后m_dlg就是NULL了
feiyuhuapeng 2009-08-20
  • 打赏
  • 举报
回复
不用,所有代码是在主窗口中设置的
xiezonglin 2009-08-20
  • 打赏
  • 举报
回复
if(m_dlg==NULL)
{
m_dlg=new CTestDlg ();
m_dlg->creat(无模式对话框的ID);
}
m_dlg->ShowWindow(true);
有没有办法像上面这样通过判断建立对话框的那个指针来判断是否关掉,
但是要是子对话框销毁的时候没有把m_dlg设为NULL的话,上面那个判断会出错.
xiezonglin 2009-08-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 feiyuhuapeng 的回复:]
在主对话框的.h里加#include "TestDlg.h"(CTestDlg是无模式对话框的类)
先定义个全局的无模式对话框的指针,如CTestDlg *m_dlg;
在构造里把m_dlg=NULL;
在你要产生的按钮事件里

if(m_dlg==NULL)
{
  m_dlg=new CTestDlg ();
  m_dlg->creat(无模式对话框的ID);
}
  m_dlg->ShowWindow(true);
[/Quote]
其实我主要是希望一个比较通用的程序,你这样是要在子窗口里面把这个指针设为NULL吧?
xiezonglin 2009-08-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gordon3000 的回复:]
建立无模式对话框时把主对话框指针作为父窗口传下来。
子对话框建立的时候将主对话框上面的建立按钮变灰。子对话框销毁时重新enable这个按钮。

[/Quote]
这样有一个问题就是要是由别的对话框打开那个无模式对话框的时候就无效了
feiyuhuapeng 2009-08-20
  • 打赏
  • 举报
回复
在主对话框的.h里加#include "TestDlg.h"(CTestDlg是无模式对话框的类)
先定义个全局的无模式对话框的指针,如CTestDlg *m_dlg;
在构造里把m_dlg=NULL;
在你要产生的按钮事件里

if(m_dlg==NULL)
{
m_dlg=new CTestDlg ();
m_dlg->creat(无模式对话框的ID);
}
m_dlg->ShowWindow(true);
lizhigang34 2009-08-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gordon3000 的回复:]
建立无模式对话框时把主对话框指针作为父窗口传下来。
子对话框建立的时候将主对话框上面的建立按钮变灰。子对话框销毁时重新enable这个按钮。

[/Quote]
同意..这样就很方便了
副组长 2009-08-20
  • 打赏
  • 举报
回复
建立无模式对话框时把主对话框指针作为父窗口传下来。
子对话框建立的时候将主对话框上面的建立按钮变灰。子对话框销毁时重新enable这个按钮。
zoulie 2009-08-20
  • 打赏
  • 举报
回复
主对话框里面或者设置一个全局变量
子对话框create出来,加1
destroy后减1
然后就可以判断
xiezonglin 2009-08-20
  • 打赏
  • 举报
回复
是在MFC下编程

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

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