关于CDialog 非模态对话框

jmac 2008-12-08 06:09:42
在CDialog 本窗口中怎么再打开一个自身一样的窗口,使用非模态对话框形式,因为要同时操作二个窗口
...全文
614 点赞 收藏 14
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
dch4890164 2008-12-08

#pragma once


// CShowItSelsDlg dialog
class CShowItSelsDlg : public CDialog
{
// Construction
public:
CShowItSelsDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data
enum { IDD = IDD_SHOWITSELS_DIALOG };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support


// Implementation
protected:
HICON m_hIcon;

// Generated message map functions
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
CDialog* pSelf;//定义一个指向自身的指针
};


之后在外部调用对话框的地方

CShowItSelsDlg dlg;//创建父对话框
m_pMainWnd = &dlg;
dlg.pSelf = new CShowItSelsDlg();//创建同样的子对话框
dlg.pSelf->Create(IDD_SHOWITSELS_DIALOG,&dlg);
INT_PTR nResponse = dlg.DoModal();

最后控制显示子非模式对话框

BOOL CShowItSelsDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

//显示对话框
if (pSelf)
{
pSelf->ShowWindow(SW_SHOW);
}
return TRUE; // return TRUE unless you set the focus to a control
}

注意两个对话框覆盖在一起了,拖一下就知道是两个了
回复
Hi_tech 2008-12-08
void CDlgdlgDlg::OnButton1()
{
if(!_dlg)
{
_dlg = new CDlgdlgDlg;

_dlg->Create(IDD_DLGDLG_DIALOG);
_dlg->ShowWindow(SW_SHOW);
}
}
刚才少了个大括号
补充一下
回复
Hi_tech 2008-12-08
[Quote=引用 10 楼 ilovedrv 的回复:]
定义一个 CDlgdlgDlg

1. 添加成员变量

private:
CDlgdlgDlg *_dlg;


2. 在对话框上添加一个按钮,一下为响应函数

void CDlgdlgDlg::OnButton1()
{
_dlg = new CDlgdlgDlg;

_dlg->Create(IDD_DLGDLG_DIALOG);

}
[/Quote]
接着上面的
在你的构造函数中令*_dlg=NULL;
之后在
void CDlgdlgDlg::OnButton1()
{
if(!_dlg)
{
_dlg = new CDlgdlgDlg;

_dlg->Create(IDD_DLGDLG_DIALOG);
_dlg->ShowWindow(SW_SHOW);
}

在析构函数中释放
if(_dlg!=NULL)
delete _dlg;
即可

回复
jmac 2008-12-08
[Quote=引用 4 楼 cnzdgs 的回复:]
CXxxDialog* dlg = new CXxxDialog;
dlg->Create(资源ID, NULL);
dlg->ShowWindow(SW_SHOW);
[/Quote]

我试过了,这种方法不行啊,调用过后,还是只有一个窗口
回复
ilovedrv 2008-12-08
定义一个 CDlgdlgDlg

1. 添加成员变量

private:
CDlgdlgDlg *_dlg;


2. 在对话框上添加一个按钮,一下为响应函数

void CDlgdlgDlg::OnButton1()
{
_dlg = new CDlgdlgDlg;

_dlg->Create(IDD_DLGDLG_DIALOG);

}


回复
jmac 2008-12-08
[Quote=引用 2 楼 zaodt 的回复:]
最好是在主窗口中,用你自己的对话框类构建 2 个一样的窗口,然后操作。

如你自己的类为 CMyDialog


在主窗口中定义两个对象:

CMyDialog m_dlg[2];


在需要的地方建立窗口:


m_dlg[0].Create(...);
m_dlg[0].ShowWindow( SW_SHOW );

m_dlg[1].Create(...);
m_dlg[1].ShowWindow( SW_SHOW );


如果还要更多的,你就用循环处理。
[/Quote]
现在我是在自身的窗口再打开一个窗口
回复
jmac 2008-12-08
[Quote=引用 1 楼 jason_wentzel 的回复:]
void CTestDialog::OnTest()
{
CTestDialog dlg;
dlg.DoModal();
}
[/Quote]
现在我是在自身的窗口再打开一个窗口
回复
jmac 2008-12-08
这种方法不行啊,调用过后,还是只有一个窗口
回复
孤客天涯 2008-12-08
刚试过了,可以的,不过以前碰到过崩掉过,不知道什么原因。
回复
zaodt 2008-12-08
[Quote=引用 3 楼 jason_wentzel 的回复:]
用非模对态话框,如果Create的时候用同一个ID会出错的。
[/Quote]


你再试试看!
回复
cnzdgs 2008-12-08
CXxxDialog* dlg = new CXxxDialog;
dlg->Create(资源ID, NULL);
dlg->ShowWindow(SW_SHOW);
回复
孤客天涯 2008-12-08
用非模对态话框,如果Create的时候用同一个ID会出错的。
回复
zaodt 2008-12-08
最好是在主窗口中,用你自己的对话框类构建 2 个一样的窗口,然后操作。

如你自己的类为 CMyDialog


在主窗口中定义两个对象:

CMyDialog m_dlg[2];


在需要的地方建立窗口:


m_dlg[0].Create(...);
m_dlg[0].ShowWindow( SW_SHOW );

m_dlg[1].Create(...);
m_dlg[1].ShowWindow( SW_SHOW );


如果还要更多的,你就用循环处理。
回复
孤客天涯 2008-12-08
void CTestDialog::OnTest()
{
CTestDialog dlg;
dlg.DoModal();
}
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2008-12-08 06:09
社区公告

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