
MFC如何创建无模式对话框a
2个回答
展开全部
1、首先创建对话框模板资源
2、从CDialog类派生自己的无模式对话框类:CModelessDlg
3、在合适的位置动态创建(new)CModelessDlg的对象:pDlg
4、调用pDlg的Create函数创建无模式对话框
5、调用pDlg的ShowWindow函数显示无模式对话框;
6、覆盖OnOK和OnCancel函数,执行DestroyWindow函数销毁无模式对话框
7、覆盖PosNcDestroy函数,执行delete
this;
2、从CDialog类派生自己的无模式对话框类:CModelessDlg
3、在合适的位置动态创建(new)CModelessDlg的对象:pDlg
4、调用pDlg的Create函数创建无模式对话框
5、调用pDlg的ShowWindow函数显示无模式对话框;
6、覆盖OnOK和OnCancel函数,执行DestroyWindow函数销毁无模式对话框
7、覆盖PosNcDestroy函数,执行delete
this;
展开全部
具体实现步骤如下:
在资源IDE中新建一个对话框IDD_ModelssDlg,并设置为可见;
利用Wizard为这个对话框建立一个类CModelessDlg;
为CModelessDlg添加一个数据成员CDialog
*
m_pParent;
为CModelessDlg添加一个新的构造子CModelessDlg(CDialog
*
pParent),在其中将pParent赋值给m_pParent;
CModelessDlg::CModelessDlg(CDialog
*pParent)
{
m_pParent
=
pParent;
}
为CModelessDlg添加一个成员函数Create(),在其中调用CDialog::Create(CModelessDlg::IDD);
BOOL
CModelessDlg::Create()
{
return
CDialog::Create(CModelessDlg::IDD);
}
重载OnOK()和OnCancel(),添加对DestroyWindow()的调用以销毁非模态对话框本身。
void
CModelessDlg::OnOK()
{
UpdateData();
DestroyWindow();
}
void
CModelessDlg::OnCancel()
{
UpdateData(FALSE);
DestroyWindow();
}
在CVCDlg中添加一个数据成员CModelessDlg
*
m_MDlg;
在CVCDlg的构造子中调用m_MDlg
=
new
CModelessDlg(this)以构造非模态对话框对象;
CVCDlg::CVCDlg(CWnd*
pParent)
:
CDialog(CVCDlg::IDD,
pParent)
{
m_hIcon
=
AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_MDlg
=
new
CModelessDlg(this);
}
在CVCDlg的析构子中调用delete
m_MDlg以析构非模态对话框对象;
CVCDlg::~CVCDlg()
{
if
(m_MDlg
!=
NULL)
delete
m_MDlg;
}
在应用程序对话框模板中增加一个按钮并映射其点击消息至OnOpenDlg(),并在OnOpenDlg()中调用m_MDlg->Create()来创建并显示非模态对话框,将m_MDlg与显示的非模态窗口绑定;
void
CVCDlg::OnOpenDlg()
{
if
(m_MDlg->GetSafeHwnd()
==
NULL)
m_MDlg->Create();
else
m_MDlg->SetWindowPos(&wndTopMost,300,400,NULL,NULL,SWP_NOSIZE);
}
在OnOK()中调用if
(m_MDlg->GetSafeHwnd()
!=
NULL)
m_MDlg->OnOK()以实现可能已经打开的非模态对话框的数据交换。注意要进行这样的调用必须将CModelessDlg中OnOK()设置为public型,并且此时m_MDlg可能非NULL,但其可能已未与任何窗口绑定,故不能用m_MDlg
!=
NULL来作为测试条件。在OnCancel()中同样处理。
void
CVCDlg::OnOK()
{
//此时m_MDlg可能非NULL,但其可能已未与任何窗口绑定,故不能用m_MDlg
!=
NULL来作为测试条件,下同
if
(m_MDlg->GetSafeHwnd()
!=
NULL)
m_MDlg->OnOK();
//要进行这样的调用必须将CModelessDlg中OnOK()设置为public型
CDialog::OnOK();
}
void
CVCDlg::OnCancel()
{
if
(m_MDlg->GetSafeHwnd()
!=
NULL)
m_MDlg->OnCancel();
//要进行这样的调用必须将CModelessDlg中OnCancel()设置为public型
CDialog::OnCancel();
}
另有:利用SetWindowPos()函数以设置窗口的位置,用CenterWindow()使窗口自动居中(基于VC++2.0以上版本)。
在资源IDE中新建一个对话框IDD_ModelssDlg,并设置为可见;
利用Wizard为这个对话框建立一个类CModelessDlg;
为CModelessDlg添加一个数据成员CDialog
*
m_pParent;
为CModelessDlg添加一个新的构造子CModelessDlg(CDialog
*
pParent),在其中将pParent赋值给m_pParent;
CModelessDlg::CModelessDlg(CDialog
*pParent)
{
m_pParent
=
pParent;
}
为CModelessDlg添加一个成员函数Create(),在其中调用CDialog::Create(CModelessDlg::IDD);
BOOL
CModelessDlg::Create()
{
return
CDialog::Create(CModelessDlg::IDD);
}
重载OnOK()和OnCancel(),添加对DestroyWindow()的调用以销毁非模态对话框本身。
void
CModelessDlg::OnOK()
{
UpdateData();
DestroyWindow();
}
void
CModelessDlg::OnCancel()
{
UpdateData(FALSE);
DestroyWindow();
}
在CVCDlg中添加一个数据成员CModelessDlg
*
m_MDlg;
在CVCDlg的构造子中调用m_MDlg
=
new
CModelessDlg(this)以构造非模态对话框对象;
CVCDlg::CVCDlg(CWnd*
pParent)
:
CDialog(CVCDlg::IDD,
pParent)
{
m_hIcon
=
AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_MDlg
=
new
CModelessDlg(this);
}
在CVCDlg的析构子中调用delete
m_MDlg以析构非模态对话框对象;
CVCDlg::~CVCDlg()
{
if
(m_MDlg
!=
NULL)
delete
m_MDlg;
}
在应用程序对话框模板中增加一个按钮并映射其点击消息至OnOpenDlg(),并在OnOpenDlg()中调用m_MDlg->Create()来创建并显示非模态对话框,将m_MDlg与显示的非模态窗口绑定;
void
CVCDlg::OnOpenDlg()
{
if
(m_MDlg->GetSafeHwnd()
==
NULL)
m_MDlg->Create();
else
m_MDlg->SetWindowPos(&wndTopMost,300,400,NULL,NULL,SWP_NOSIZE);
}
在OnOK()中调用if
(m_MDlg->GetSafeHwnd()
!=
NULL)
m_MDlg->OnOK()以实现可能已经打开的非模态对话框的数据交换。注意要进行这样的调用必须将CModelessDlg中OnOK()设置为public型,并且此时m_MDlg可能非NULL,但其可能已未与任何窗口绑定,故不能用m_MDlg
!=
NULL来作为测试条件。在OnCancel()中同样处理。
void
CVCDlg::OnOK()
{
//此时m_MDlg可能非NULL,但其可能已未与任何窗口绑定,故不能用m_MDlg
!=
NULL来作为测试条件,下同
if
(m_MDlg->GetSafeHwnd()
!=
NULL)
m_MDlg->OnOK();
//要进行这样的调用必须将CModelessDlg中OnOK()设置为public型
CDialog::OnOK();
}
void
CVCDlg::OnCancel()
{
if
(m_MDlg->GetSafeHwnd()
!=
NULL)
m_MDlg->OnCancel();
//要进行这样的调用必须将CModelessDlg中OnCancel()设置为public型
CDialog::OnCancel();
}
另有:利用SetWindowPos()函数以设置窗口的位置,用CenterWindow()使窗口自动居中(基于VC++2.0以上版本)。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询