
MFC里面怎么得到默认对话框的对象
建立一个MFC[exe]工程后会有一个默认的对话框或文档,怎么得到这个默认的对象或指针呢?我重新阐述一下我的问题吧:我用MFC创建了两个对话框分别对应两个类CDlg和CN...
建立一个MFC[exe]工程后会有一个默认的对话框或文档,怎么得到这个默认的对象或指针呢?
我重新阐述一下我的问题吧:
我用MFC创建了两个对话框分别对应两个类CDlg和CNewDlg
class CDlg::public CDialog
{
..............
public:
CNewDlg* pNew;//已初始化为NULL
...............
}
在CDlg的一个按钮响应函数里
CDlg::OnClick()
{
if (pNew == NULL) //不存在子窗口则创建一个
{
pNew = new CNewDlg;
pNew-> Create(IDD_MAIN);
pNew-> ShowWindow(SW_SHOW);
}
else //只能有一个子窗口,若已存在则激活它
pNew-> SetActiveWindow();
}
在CNewDlg的WM_CLOSE消息响应函数里面
OnClose()
{
DestroyWindow();
delete this;
GetParent()-> SendMessage(WM_DEL);//发送自定义消息给CDlg窗口
}
然后在CDlg的WM_DEL消息响应函数里面
OnDel()
{
pNew = NULL;
}
主要部分大致如上,编译能通过,但是在关闭子窗口的时候会出错,查出错就在执行GetParent()-> SendMessage(WM_DEL)这条语句后,
但是为什么会错不明白,是SendMessage的返回值问题么?
请高手赐教! 展开
我重新阐述一下我的问题吧:
我用MFC创建了两个对话框分别对应两个类CDlg和CNewDlg
class CDlg::public CDialog
{
..............
public:
CNewDlg* pNew;//已初始化为NULL
...............
}
在CDlg的一个按钮响应函数里
CDlg::OnClick()
{
if (pNew == NULL) //不存在子窗口则创建一个
{
pNew = new CNewDlg;
pNew-> Create(IDD_MAIN);
pNew-> ShowWindow(SW_SHOW);
}
else //只能有一个子窗口,若已存在则激活它
pNew-> SetActiveWindow();
}
在CNewDlg的WM_CLOSE消息响应函数里面
OnClose()
{
DestroyWindow();
delete this;
GetParent()-> SendMessage(WM_DEL);//发送自定义消息给CDlg窗口
}
然后在CDlg的WM_DEL消息响应函数里面
OnDel()
{
pNew = NULL;
}
主要部分大致如上,编译能通过,但是在关闭子窗口的时候会出错,查出错就在执行GetParent()-> SendMessage(WM_DEL)这条语句后,
但是为什么会错不明白,是SendMessage的返回值问题么?
请高手赐教! 展开
6个回答
展开全部
这样做:
1.自定义消息 #define WM_NEWDLG_CLOSE WM_USER + 5
2.激活NewDlg代码(这是从我的一个工程中拷贝过来的代码,m_pRecvDlg对应你的NewDlg),在CDlg中实现(就是你的按钮处理过程)
if(m_pRecvDlg == NULL)
m_pRecvDlg = new CRecvDlg(this);
ASSERT(m_pRecvDlg != NULL);
if(m_pRecvDlg->GetSafeHwnd() == NULL)
{
m_pRecvDlg->Create(IDD_DIALOG_RECVWIDOW, this);
m_pRecvDlg->ShowWindow(SW_SHOW);
}
else
{
m_pRecvDlg->ShowWindow(SW_RESTORE);
m_pRecvDlg->SetForegroundWindow();
m_pRecvDlg->SetActiveWindow();
}
3.在CNewDlg::OnClose函数中增加:
GetParent()->SendMessage(WM_NEWDLG_CLOSE);
4.在CDlg中处理自定义消息.
LRESULT CDlg::OnNewdlgExit(WPARAM wParam, LPARAM lParam)
{
if(m_pRecvDlg != NULL)
{
m_pRecvDlg->DestroyWindow();
delete m_pRecvDlg;
m_pRecvDlg = NULL;
}
return 0L;
}
这样可以了,GOOD LUCK!
1.自定义消息 #define WM_NEWDLG_CLOSE WM_USER + 5
2.激活NewDlg代码(这是从我的一个工程中拷贝过来的代码,m_pRecvDlg对应你的NewDlg),在CDlg中实现(就是你的按钮处理过程)
if(m_pRecvDlg == NULL)
m_pRecvDlg = new CRecvDlg(this);
ASSERT(m_pRecvDlg != NULL);
if(m_pRecvDlg->GetSafeHwnd() == NULL)
{
m_pRecvDlg->Create(IDD_DIALOG_RECVWIDOW, this);
m_pRecvDlg->ShowWindow(SW_SHOW);
}
else
{
m_pRecvDlg->ShowWindow(SW_RESTORE);
m_pRecvDlg->SetForegroundWindow();
m_pRecvDlg->SetActiveWindow();
}
3.在CNewDlg::OnClose函数中增加:
GetParent()->SendMessage(WM_NEWDLG_CLOSE);
4.在CDlg中处理自定义消息.
LRESULT CDlg::OnNewdlgExit(WPARAM wParam, LPARAM lParam)
{
if(m_pRecvDlg != NULL)
{
m_pRecvDlg->DestroyWindow();
delete m_pRecvDlg;
m_pRecvDlg = NULL;
}
return 0L;
}
这样可以了,GOOD LUCK!
展开全部
可能是delete this;的问题.
你把这一句写到
void CNewDlg::PostNcDestroy()中.
dlg.h:
#include "newdlg.h"
class CDlg:..
{
...
public:
CNewDlg *pNew;
...
}
在“CDlg 类的一个按钮响应函数”里面加如下语句:
pNew = new CNewDlg;
pNew->m_pDlg = (void *)this;
newdlg.h中
写指针
classCNewDlg:..
{
public:
void *m_pDlg;
}
newdlg.cpp中
#include "dlg.h"
实现CNewDlg类的wm_close消息。加如下代码:
delete this;
((CDlg *)m_pDlg)->pNew = NULL;
你把这一句写到
void CNewDlg::PostNcDestroy()中.
dlg.h:
#include "newdlg.h"
class CDlg:..
{
...
public:
CNewDlg *pNew;
...
}
在“CDlg 类的一个按钮响应函数”里面加如下语句:
pNew = new CNewDlg;
pNew->m_pDlg = (void *)this;
newdlg.h中
写指针
classCNewDlg:..
{
public:
void *m_pDlg;
}
newdlg.cpp中
#include "dlg.h"
实现CNewDlg类的wm_close消息。加如下代码:
delete this;
((CDlg *)m_pDlg)->pNew = NULL;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
AfxGetMainWnd();何时何地都可以得到当前程序中的主窗口。
你的逻辑好复杂啊。用一个简单的成员指针来实现吧。
CDlg里面定义一个公共成员的CNewDlg*变量,也就是你的 pNew。
CNewDlg 类里面定义一个公共的CDlg*变量,m_pTheDlg。
注意在双方的头文件前面都相互包含(include)。
在“CDlg 类的一个按钮响应函数”里面加如下语句:
pNew = new CNewDlg;
pNew->m_pTheDlg = this;
实现CNewDlg类的wm_close消息。加如下代码:
delete m_pTheDlg->pNew;
m_pTheDlg->pNew = NULL;
完成了,简单吧。
你的逻辑好复杂啊。用一个简单的成员指针来实现吧。
CDlg里面定义一个公共成员的CNewDlg*变量,也就是你的 pNew。
CNewDlg 类里面定义一个公共的CDlg*变量,m_pTheDlg。
注意在双方的头文件前面都相互包含(include)。
在“CDlg 类的一个按钮响应函数”里面加如下语句:
pNew = new CNewDlg;
pNew->m_pTheDlg = this;
实现CNewDlg类的wm_close消息。加如下代码:
delete m_pTheDlg->pNew;
m_pTheDlg->pNew = NULL;
完成了,简单吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
WM_ClOSE消息映射里把 CDlg 类的成员函数 pNew 置为 NULL
我的想法是,
比如 在原对话框里有个按钮, 点击按钮,就产生新对话框.
响应按钮消息的函数
void onClick()
{
pNew = new CNewDlg
pNew->DoModal();
delete pNew;
pNew = NULL;
}
这样也行吧,都可以在原对话框里做,
为什么还要在 新对话框的消息里把 指向自己的指针 置为NULL;
我的想法是,
比如 在原对话框里有个按钮, 点击按钮,就产生新对话框.
响应按钮消息的函数
void onClick()
{
pNew = new CNewDlg
pNew->DoModal();
delete pNew;
pNew = NULL;
}
这样也行吧,都可以在原对话框里做,
为什么还要在 新对话框的消息里把 指向自己的指针 置为NULL;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
stone_dongdong说的
有道理~不过还应该销毁句饼
在CDlg 头文件定义CNewDlg *m_pNewDlg;
建立非摸式对话框时
m_pNewDlg = pNew;
要自定义一个消息WM_CLOSENEWDLG;
关闭非模式对话框时
if( GetParent() )
GetParent()->SendMessage( )
在消息响应函数里面
if( m_pNewDlg )
{
if( m_pNewDlg->getsafehwnd() )
{
HWND hWnd;
hWnd = m_pNewDlg->m_hWnd;
::destroywindow( hWnd )
}
m_pNewDlg = NULL;
}
就这样做~呵呵
有道理~不过还应该销毁句饼
在CDlg 头文件定义CNewDlg *m_pNewDlg;
建立非摸式对话框时
m_pNewDlg = pNew;
要自定义一个消息WM_CLOSENEWDLG;
关闭非模式对话框时
if( GetParent() )
GetParent()->SendMessage( )
在消息响应函数里面
if( m_pNewDlg )
{
if( m_pNewDlg->getsafehwnd() )
{
HWND hWnd;
hWnd = m_pNewDlg->m_hWnd;
::destroywindow( hWnd )
}
m_pNewDlg = NULL;
}
就这样做~呵呵
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
?什么东西/
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询