mfc基于对话框的程序

请帮忙利用VS2017生成一个半成品的mfc程序,要求:运行程序之后生成的对话框出现两个按钮,一个可以打开新的对话框并关闭当前对话框;另一个只关闭当前对话框。
新的对话框有一个按钮,可以刷新这个新对话框的所有内容,重新开始。
只需要帮忙构造一下这个半成品框架就好,剩下我自己研究努力,感谢!

题主,这个问题我来替你解决,若有帮助,还望采纳,点击回答右侧采纳即可。


好的,请按照以下步骤来生成半成品的MFC程序:

  1. 打开 Visual Studio 2017,在主页中选择 “创建新项目”。

  2. 在弹出的“新建项目”窗口中,选择 Visual C++,然后选择 “MFC应用程序” 作为项目类型。给项目取一个名字,然后点击“下一步”。

  3. 在“应用程序类型”页面,选择“对话框”作为应用程序类型,并确保勾选了“预定义的活动框架”。

  4. 在“高级特性”页面,确保勾选了“使用MFC运行库”。

  5. 在下一页中,点击“完成”按钮,然后选择“添加类”来为程序添加新的类。

  6. 选择“对话框”,给新的对话框命名为“NewDialog”,然后点击“添加”。

  7. 打开“Resource.h”文件,并为新对话框ID定义一个新的宏,例如“IDD_NEW_DIALOG”。

  8. 打开“MainDlg.cpp”文件,并在类定义中添加一个公共函数来处理“打开新对话框”按钮的单击事件。例如:

public:
afx_msg void OnBnClickedOpenDialog();
  1. 在“OnInitDialog”函数中添加以下代码来将“打开新对话框”按钮的单击事件与新对话框的显示关联起来:
m_btnOpenNewDialog.SetBuddyWindow(GetDlgItem(IDOK));
m_btnOpenNewDialog.SetButtonText(_T("Open New Dialog"));
m_btnOpenNewDialog.SetTooltipText(_T("Open a new dialog and close this one"));
m_btnOpenNewDialog.SetCallbackFunction((DialogCallbackFunction)OnBnClickedOpenDialog, this);
  1. 在“MainDlg.cpp”文件中添加以下代码来实现“打开新对话框”按钮的单击事件:
void CMainDlg::OnBnClickedOpenDialog()
{
    CNewDialog dlg;

    if (dlg.DoModal() == IDOK)
    {
        this->EndDialog(IDOK);
    }
}
  1. 在“NewDialog.cpp”文件中,在类定义中添加一个公共函数来处理“刷新”按钮的单击事件。例如:
public:
afx_msg void OnBnClickedRefresh();
  1. 在“OnInitDialog”函数中添加以下代码来将“刷新”按钮的单击事件与刷新操作关联起来:
m_btnRefresh.SetBuddyWindow(GetDlgItem(IDOK));
m_btnRefresh.SetButtonText(_T("Refresh"));
m_btnRefresh.SetTooltipText(_T("Refresh the dialog"));
m_btnRefresh.SetCallbackFunction((DialogCallbackFunction)OnBnClickedRefresh, this);
  1. 在“NewDialog.cpp”文件中添加以下代码来实现“刷新”按钮的单击事件:
void CNewDialog::OnBnClickedRefresh()
{
    // Do something to refresh the contents of the dialog
}
  1. 在“NewDialog.h”文件中,为“刷新”按钮和其它控件定义ID。例如:
enum { IDD = IDD_NEW_DIALOG };
CButton m_btnRefresh; // ID: IDC_REFRESH
  1. 现在,可以调试并运行程序了。在主对话框中,可以单击“打开新对话框”按钮打开新对话框,或者单击“关闭”按钮退出程序。在新对话框中,可以单击“刷新”按钮来执行刷新操作。

希望这个半成品框架能够对您有所帮助。如果您有任何问题或者需要进一步的帮助,请随时与我联系。

引用 皆我百晓生 小程序回复内容作答:
以下是一个基于对话框的半成品MFC程序的示例:

首先,在VS2017中创建一个新的MFC项目。选择MFC应用程序(对话框)模板,并命名为"DialogBasedMFC"。

在"DialogBasedMFC.h"文件中,你需要定义一个新的对话框类"NewDialog",并在其中添加一个刷新按钮的响应函数。

#pragma once

#include "afxwin.h"

// 对话框基类
class CDialogBasedMFCDlg : public CDialogEx
{
public:
    CDialogBasedMFCDlg(CWnd* pParent = nullptr);
    enum { IDD = IDD_DIALOGBASEDMFC_DIALOG };

protected:
    virtual void DoDataExchange(CDataExchange* pDX);
    DECLARE_MESSAGE_MAP()

public:
    afx_msg void OnBnClickedButton1(); // 打开新对话框
    afx_msg void OnBnClickedButton2(); // 关闭当前对话框
};

// 新对话框
class NewDialog : public CDialogEx
{
public:
    NewDialog(CWnd* pParent = nullptr);
    enum { IDD = IDD_NEW_DIALOG };

protected:
    virtual void DoDataExchange(CDataExchange* pDX);

DECLARE_MESSAGE_MAP()

public:
    afx_msg void OnBnClickedButtonRefresh(); // 刷新按钮
};

在"DialogBasedMFC.cpp"文件中,你需要实现这两个类的成员函数。

#include "pch.h"
#include "framework.h"
#include "DialogBasedMFC.h"
#include "DialogBasedMFCDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

CDialogBasedMFCDlg::CDialogBasedMFCDlg(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_DIALOGBASEDMFC_DIALOG, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CDialogBasedMFCDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CDialogBasedMFCDlg, CDialogEx)
    ON_BN_CLICKED(IDC_BUTTON1, &CDialogBasedMFCDlg::OnBnClickedButton1)
    ON_BN_CLICKED(IDC_BUTTON2, &CDialogBasedMFCDlg::OnBnClickedButton2)
END_MESSAGE_MAP()

void CDialogBasedMFCDlg::OnBnClickedButton1()
{
    NewDialog newDlg;
    newDlg.DoModal(); // 打开新对话框
}

void CDialogBasedMFCDlg::OnBnClickedButton2()
{
    OnOK(); // 关闭当前对话框
}

NewDialog::NewDialog(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_NEW_DIALOG, pParent)
{
}

void NewDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(NewDialog, CDialogEx)
    ON_BN_CLICKED(IDC_BUTTON_REFRESH, &NewDialog::OnBnClickedButtonRefresh)
END_MESSAGE_MAP()

void NewDialog::OnBnClickedButtonRefresh()
{
    // 刷新按钮响应,重新开始
    // 在这里添加你需要的代码
}

最后,在资源文件的"DialogBasedMFC.rc"中,添加一个新对话框:

IDD_NEW_DIALOG DIALOG DISCARDABLE  0, 0, 200, 200
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "New Dialog"
FONT 8, "MS Sans Serif"
BEGIN
    PUSHBUTTON      "Refresh",      IDC_BUTTON_REFRESH,7,4,50,14
END

IDD_DIALOGBASEDMFC_DIALOG DIALOGEX 0, 0, 266, 137
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "DialogBasedMFC"
FONT 9, "Arial"
BEGIN
    DEFPUSHBUTTON   "Exit",         IDCANCEL,189,119,50,14
    CONTROL         "", IDC_STATIC, "Static", SS_BITMAP | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 189, 0, 76, 119
    PUSHBUTTON      "Open",         IDC_BUTTON1,187,52,50,14
    PUSHBUTTON      "Close",        IDC_BUTTON2,187,77,50,14
END

完成上述步骤后,编译并运行程序,你将会看到一个具有两个按钮的对话框。点击"Open"按钮将会打开一个新的对话框,并关闭当前对话框。点击"Close"按钮将会关闭当前对话框。新对话框上的"Refresh"按钮还没有实现具体功能,你可以在NewDialog::OnBnClickedButtonRefresh()中添加你希望实现的功能代码。

希望这可以帮到你。祝你好运!

结合GPT给出回答如下请题主参考
好的,下面是详细的步骤:

  1. 打开Visual Studio 2017,选择创建一个MFC应用程序。

  2. 在下一步中选择“对话框”,默认选项即可。

  3. 点击下一步,输入项目名称和项目位置,然后点击“创建”。

  4. Visual Studio 2017会自动创建一个基于对话框的MFC程序,并打开MainFrm.cpp文件。

  5. 在MainFrm.cpp文件中,找到CMainFrame::OnCreate函数。在函数中添加以下代码:

CRect rect;
GetClientRect(&rect);
m_wndView.Create(NULL, NULL, WS_CHILD | WS_VISIBLE, rect, this, 0, NULL);

这段代码可以创建一个视图窗口。

  1. 在该函数的下面添加以下代码:
SetWindowText(_T("My MFC Application"));

CMenu* pMenu = GetMenu();
if (pMenu != NULL)
{
    pMenu->DeleteMenu(ID_FILE_NEW, MF_BYCOMMAND);
    DrawMenuBar();
}

这段代码可以设置主窗口的标题,并从菜单中删除“新建”选项。

  1. 接下来,在应用程序的资源中添加一个对话框。右键单击“资源”,选择“添加资源”,然后选择“对话框”。

  2. 双击新添加的对话框,将其打开。在对话框中添加两个按钮,一个是“打开新对话框”,另一个是“关闭对话框”。

  3. 在“打开新对话框”按钮的单击事件中添加以下代码:

CNewDialog dlgNew;
dlgNew.DoModal();

这段代码可以创建一个新的对话框并打开它。

  1. 在“关闭对话框”按钮的单击事件中添加以下代码:
CDialogEx::OnCancel();

这段代码可以关闭当前对话框。

  1. 最后,在新的对话框中添加一个按钮,用于刷新该对话框。在该按钮的单击事件中添加以下代码:
Invalidate();
UpdateWindow();

这段代码可以强制对话框重绘,以刷新其内容。

至此,一个基于对话框的MFC程序就完成了。运行程序之后将会看到两个按钮,一个可以打开新的对话框并关闭当前对话框,另一个只关闭当前对话框。新的对话框有一个按钮,可以刷新这个新对话框。

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
首先,我们需要创建一个基于对话框的MFC程序。在Visual Studio 2017中,选择“文件”->“新建”->“项目”,然后选择“MFC应用程序”,为项目命名并设置位置,点击“确定”创建项目。
接下来,我们需要添加两个按钮和一些控件。右键点击对话框资源,选择“添加资源”,分别添加两个按钮(IDC_BUTTON1和IDC_BUTTON2)和一个静态文本控件(IDC_STATIC)。
然后,我们需要为这两个按钮添加消息处理函数。双击第一个按钮(IDC_BUTTON1),在弹出的代码编辑器中输入以下代码:

void CMyDialog::OnBnClickedButton1()
{
    CDialog::OnOK();
}

双击第二个按钮(IDC_BUTTON2),在弹出的代码编辑器中输入以下代码:

void CMyDialog::OnBnClickedButton2()
{
    CDialog::OnOK();
}

接下来,我们需要实现刷新新对话框的功能。首先,在对话框类的头文件中添加一个指向新对话框类的指针成员变量,例如:

class CMyDialog : public CDialogEx
{
    // ...
public:
    CMyNewDialog* m_pNewDialog; // 新对话框的指针
};

然后,在对话框类的源文件中初始化这个指针,并在按钮的消息处理函数中实现刷新功能:

BOOL CMyDialog::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // 初始化新对话框
    m_pNewDialog = new CMyNewDialog();
    ASSERT(m_pNewDialog);
    m_pNewDialog->Create(IDD_MYNEWDIALOG, this);

    return TRUE;
}

void CMyDialog::OnBnClickedButton1()
{
    CDialog::OnOK();
}

void CMyDialog::OnBnClickedButton2()
{
    CDialog::OnOK();
}

最后,我们需要在新对话框类中添加一个刷新按钮和相应的消息处理函数:

class CMyNewDialog : public CDialogEx
{
    // ...
public:
    afx_msg void OnBnClickedRefresh();
};

.cpp文件中实现刷新功能:

BEGIN_MESSAGE_MAP(CMyNewDialog, CDialogEx)
    ON_BN_CLICKED(IDC_REFRESH, &CMyNewDialog::OnBnClickedRefresh)
END_MESSAGE_MAP()

void CMyNewDialog::OnBnClickedRefresh()
{
    // 刷新新对话框的内容
    // ...
}

现在,你可以运行程序,点击第一个按钮会关闭当前对话框,点击第二个按钮也会关闭当前对话框。点击第一个按钮后,新对话框会打开,点击刷新按钮可以刷新新对话框的内容。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

这个简单
首先你要一个主窗口(可以是不可见的)去维持程序主消息循环
否则你关闭对话框,程序就结束了。
然后就简单了,你要显示就是 dlg.DoModal(); 关闭就是 dlg.SendMessage(WM_CLOSE, wparam, lparam)

参考gpt4:
结合自己分析给你如下建议:
首先,我们需要创建一个MFC对话框应用程序。在Visual Studio 2017中,选择“文件”>“新建”>“项目”,然后选择“MFC应用程序”模板。给项目起个名字,例如“MFCDemo”。
接下来,我们需要在资源视图中添加两个按钮和一个对话框。右键单击“对话框”文件夹,选择“添加资源”,然后选择“对话框”。在打开的对话框设计器中,添加两个按钮,分别命名为“btnOpenNewDialog1”和“btnCloseCurrentDialog”。
现在,我们需要为这两个按钮添加消息处理函数。双击“btnOpenNewDialog1”按钮,将打开的消息映射函数设置为OnBnClickededTxtOpenNewDialog。同样,双击“btnCloseCurrentDialog”按钮,将关闭消息映射函数设置为OnBnClickededTxtCloseCurrentDialog。
接下来,我们需要实现这两个消息处理函数。在对话框类的头文件中,添加以下代码:


#include "afxdialogex.h"

class CMyDialog : public CDialogEx
{
    // ...
protected:
    // Generated message map functions
    afx_msg void OnBnClickededTxtOpenNewDialog();
    afx_msg void OnBnClickededTxtCloseCurrentDialog();
    DECLARE_MESSAGE_MAP()
};

    
在对话框类的源文件中,实现这两个消息处理函数:

BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)
    ON_BN_CLICKED(IDC_BUTTON1, &CMyDialog::OnBnClickededTxtOpenNewDialog)
    ON_BN_CLICKED(IDC_BUTTON2, &CMyDialog::OnBnClickededTxtCloseCurrentDialog)
END_MESSAGE_MAP()

void CMyDialog::OnBnClickededTxtOpenNewDialog()
{
    CMyNewDialog dlg;
    dlg.DoModal();
}

void CMyDialog::OnBnClickededTxtCloseCurrentDialog()
{
    GetParent()->EndDialog(IDOK);
}

    
最后,我们需要创建一个新的对话框类,用于显示刷新内容的新对话框。在资源视图中,添加一个新的对话框资源,并设置其ID为“IDC_MYNEWDIALOG”。在新对话框的设计器中,添加一个按钮,将其ID设置为“IDC_BUTTON3”。

双击新对话框的“确定”按钮,将“BN_CLICKED”事件映射函数设置为OnBnClickededTxtRefreshContents。在对话框类的头文件中,添加以下代码:

        

#include "afxdialogex.h"

class CMyNewDialog : public CDialogEx
{
public:
    CMyNewDialog(CWnd* pParent = nullptr);

    enum { IDD = IDD_MYNEWDIALOG };

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

    // Generated message map functions
    afx_msg void OnBnClickededTxtRefreshContents();
    DECLARE_MESSAGE_MAP()
};

    
在对话框类的源文件中,实现DoDataExchange函数以支持数据交换:

        

BEGIN_MESSAGE_MAP(CMyNewDialog, CDialogEx)
    ON_BN_CLICKED(IDC_BUTTON3, &CMyNewDialog::OnBnClickededTxtRefreshContents)
END_MESSAGE_MAP()

void CMyNewDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_BUTTON3, m_btnRefresh);
}

    
实现OnBnClickededTxtRefreshContents函数以刷新新对话框的内容:

        

void CMyNewDialog::OnBnClickededTxtRefreshContents()
{
    m_btnRefresh->SetWindowText(_T("刷新内容"));
}

现在,你可以运行程序,点击第一个按钮,将打开一个新的对话框并关闭当前对话框;点击第二个按钮,将只关闭当前对话框。点击新对话框中的“刷新内容”按钮,将更新新对话框的文本。

援引讯飞星火:
首先,我们需要创建一个新的MFC对话框应用程序。在Visual Studio中,选择"File" > "New" > "Project...",然后在弹出的对话框中选择"MFC Application",为项目命名并设置位置,然后点击"OK"。

接下来,我们需要添加两个按钮到主对话框。右键点击主对话框的空白区域,选择"Add Button",然后分别命名为"btnOpenNewDialog"和"btnCloseDialog"。

然后,我们需要为这两个按钮添加点击事件处理函数。双击第一个按钮,Visual Studio会自动生成一个名为"OnBnClickedbtnOpenNewDialog"的函数。在这个函数中,我们需要创建一个新的对话框,并显示它。代码如下:

void CMainDlg::OnBnClickedbtnOpenNewDialog()
{
    CDialogNew dlg;
    dlg.DoModal();
    this->Close();
}

同样,我们也需要为第二个按钮添加类似的处理函数。双击第二个按钮,Visual Studio会自动生成一个名为"OnBnClickedbtnCloseDialog"的函数。在这个函数中,我们只需要关闭当前对话框即可。代码如下:

void CMainDlg::OnBnClickedbtnCloseDialog()
{
    this->Close();
}

最后,我们需要为新的对话框添加一个刷新按钮。首先,我们需要在资源视图中打开"Resource.h"文件,然后在对话框设计器中添加一个新的按钮,并设置其ID为IDC_BUTTON1。然后,我们需要为这个按钮添加一个点击事件处理函数。右键点击新添加的按钮,选择"Add Event Handler",然后选择"BN_CLICKED"。在弹出的对话框中,选择"OnBnClickedIDC_BUTTON1",然后点击"Add and Edit Code..."。在弹出的代码编辑窗口中,添加以下代码:

void CDialogNew::OnBnClickedIDC_BUTTON1()
{
    // 这里添加刷新对话框内容的代码
}

这样,我们就完成了你的要求。你可以根据需要修改"OnBnClickedIDC_BUTTON1"函数中的代码,以实现刷新对话框内容的功能。

【以下回答由 GPT 生成】

首先在VS2017中创建一个MFC应用程序选择对话框作为应用程序类型

在资源视图中找到你创建的对话框资源文件比如IDD_MYDIALOG

打开IDD_MYDIALOG对话框并在上面添加两个按钮分别命名为IDC_OPEN_DIALOG和IDC_CLOSE_DIALOG

双击IDD_MYDIALOG对话框会自动生成代码可以在该代码中处理按钮的点击事件

在IDD_MYDIALOG的初始化函数OnInitDialog()添加以下代码注释中有详细说明):

BOOL CMyDialog::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // 添加两个按钮的点击事件处理函数
    m_btnOpenDialog.SubclassDlgItem(IDC_OPEN_DIALOG, this);
    m_btnCloseDialog.SubclassDlgItem(IDC_CLOSE_DIALOG, this);

    // 返回FALSE阻止焦点转移
    return FALSE; 
}

添加响应按钮点击事件的函数代码如下

// 打开新的对话框,并关闭当前对话框
void CMyDialog::OnBnClickedOpenDialog()
{
    CNewDialog newDialog;

    newDialog.DoModal();

    OnCancel();
}

// 仅关闭当前对话框
void CMyDialog::OnBnClickedCloseDialog()
{
    OnCancel();
}

定义新的对话框类CNewDialog在该类中添加一个按钮IDC_REFRESH并处理其点击事件

class CNewDialog : public CDialogEx
{
    DECLARE_DYNAMIC(CNewDialog)

public:
    CNewDialog(CWnd* pParent = nullptr);   // 标准构造函数
    virtual ~CNewDialog();

// 对话框数据
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_NEW_DIALOG };
#endif

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

    DECLARE_MESSAGE_MAP()

private:
    CButton m_btnRefresh;
public:
    afx_msg void OnBnClickedRefresh();
};

新的对话框类CNewDialog的实现代码如下

IMPLEMENT_DYNAMIC(CNewDialog, CDialogEx)

CNewDialog::CNewDialog(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_NEW_DIALOG, pParent)
{
}

CNewDialog::~CNewDialog()
{
}

void CNewDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_REFRESH, m_btnRefresh);
}

BEGIN_MESSAGE_MAP(CNewDialog, CDialogEx)
    ON_BN_CLICKED(IDC_REFRESH, &CNewDialog::OnBnClickedRefresh)
END_MESSAGE_MAP()

CNewDialog对话框类中刷新按钮的点击事件处理函数

void CNewDialog::OnBnClickedRefresh()
{
    // TODO: 刷新对话框的内容

    // 关闭当前对话框并打开一个新的对话框,以达到刷新效果
    CNewDialog newDialog;
    newDialog.DoModal();
}

至此你已经完成了在MFC基于对话框的程序中生成两个按钮和一个新的对话框的构建

祝你成功


【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

参考gpt

// MyDialog.h
#pragma once

#include "ChildDialog.h" // 包含新对话框的头文件

class MyDialog : public CDialogEx
{
    DECLARE_DYNAMIC(MyDialog)

public:
    MyDialog(CWnd* pParent = nullptr);   // 标准构造函数
    virtual ~MyDialog();

// 对话框数据
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_MYDIALOG };
#endif

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

    DECLARE_MESSAGE_MAP()

private:
    ChildDialog m_childDialog; // 新对话框对象

public:
    afx_msg void OnBnClickedOpenDialog();
    afx_msg void OnBnClickedCloseDialog();
};

// MyDialog.cpp
#include "MyDialog.h"
#include "afxdialogex.h"

IMPLEMENT_DYNAMIC(MyDialog, CDialogEx)

MyDialog::MyDialog(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_MYDIALOG, pParent)
{
}

MyDialog::~MyDialog()
{
}

void MyDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(MyDialog, CDialogEx)
    ON_BN_CLICKED(IDC_OPEN_DIALOG, &MyDialog::OnBnClickedOpenDialog)
    ON_BN_CLICKED(IDC_CLOSE_DIALOG, &MyDialog::OnBnClickedCloseDialog)
END_MESSAGE_MAP()

void MyDialog::OnBnClickedOpenDialog()
{
    // 打开新对话框并关闭当前对话框
    m_childDialog.DoModal();
    EndDialog(IDOK);
}

void MyDialog::OnBnClickedCloseDialog()
{
    // 关闭当前对话框
    EndDialog(IDOK);
}

// ChildDialog.h
#pragma once

class ChildDialog : public CDialogEx
{
    DECLARE_DYNAMIC(ChildDialog)

public:
    ChildDialog(CWnd* pParent = nullptr);   // 标准构造函数
    virtual ~ChildDialog();

// 对话框数据
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_CHILDDIALOG };
#endif

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

    DECLARE_MESSAGE_MAP()

public:
    afx_msg void OnBnClickedRefresh();
};

// ChildDialog.cpp
#include "ChildDialog.h"
#include "afxdialogex.h"

IMPLEMENT_DYNAMIC(ChildDialog, CDialogEx)

ChildDialog::ChildDialog(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_CHILDDIALOG, pParent)
{
}

ChildDialog::~ChildDialog()
{
}

void ChildDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(ChildDialog, CDialogEx)
    ON_BN_CLICKED(IDC_REFRESH, &ChildDialog::OnBnClickedRefresh)
END_MESSAGE_MAP()

void ChildDialog::OnBnClickedRefresh()
{
    // 刷新新对话框的内容
    // ...
}

上述代码中的IDD_MYDIALOGIDD_CHILDDIALOG应替换为您在对话框编辑器中创建的对话框的ID。您还需要在资源文件中创建两个对话框,并将其ID与代码中的相应ID匹配。


Windows编程与MFC # 3 基于对话框的应用程序(1)_真·skysys的博客-CSDN博客 创建基于对话框的应用程序框架对话框是Windows系统的一种特殊的窗口,用于应用程序和用户之间进行信息交互,其作用非常重要。控件是嵌入在对话框或其它父窗口中的一种特殊子窗口。Visual Studio提供了大量控件用于数据输入与显示。在Resource View的资源树中双击某个ID,可在中间区域内显示相应的资源界面。双击IDD_ADDITION_DIALOG时,中间区域就会显示Addition对话框模板。在Addition对话框模板上点右键,然后在右键菜单中选择Properties,则在右._基于对话框的应用程序 https://blog.csdn.net/qq_33583069/article/details/106157520

首先,请确保你已经安装了Visual Studio 2017和MFC库。接下来,按照以下步骤创建一个简单的MFC应用程序,包含你描述的功能。

步骤1:创建MFC应用程序

  1. 打开Visual Studio 2017,选择“文件”->“新建”->“项目”。
  2. 在弹出的对话框中,选择“Visual C++”->“MFC应用程序”,然后输入项目名称和位置,点击“确定”。
  3. 在“新建MFC应用程序”对话框中,选择“对话框”模板,然后点击“下一步”。
  4. 取消勾选“启动文档”复选框,然后点击“完成”。

步骤2:设计用户界面

  1. 在资源视图中,找到主对话框的IDD_MAINDLG_DIALOG,双击打开它。
  2. 在对话框上添加两个按钮,分别命名为IDC_BUTTON_OPEN_DIALOG和IDC_BUTTON_CLOSE。

步骤3:添加代码

  1. 在资源视图中,找到主对话框的类(通常为CMainDlg),双击打开它的源文件(通常是MainDlg.cpp)。
  2. CMainDlg::OnInitDialog()函数中添加以下代码:
BOOL CMainDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // TODO: 在此添加额外的初始化代码
    GetDlgItem(IDC_BUTTON_OPEN_DIALOG)->SetWindowText(_T("打开新对话框"));
    GetDlgItem(IDC_BUTTON_CLOSE)->SetWindowText(_T("关闭"));

    return TRUE;  // 除非您通过设置焦点或按回车键使控件可见,否则不需要处理此消息
}
  1. 找到CMainDlg::OnButtonOpenDialog()函数,添加以下代码:
void CMyDialog::OnButtonOpenDialog()
{
    CMyDialog dlg;
    dlg.DoModal();
}
  1. 找到CMainDlg::OnButtonClose()函数,添加以下代码:
void CMainDlg::OnButtonClose()
{
    Close();
}
  1. 添加一个新的对话框类。在资源视图中右键点击IDD_DIALOG1的空白区域,选择“添加”->“类”,命名为CMyDialog,基类选择为CDialogEx。
  2. 在CMyDialog的源文件(通常是MyDialog.cpp)中,找到CMyDialog::DoModal()函数,添加以下代码:
BOOL CMyDialog::DoModal()
{
    // TODO: 在此添加额外的初始化代码
    // TODO: 调用 LoadFrame 函数以加载对话框资源。例如:LoadFrame(IDD_DIALOG1)
    return CDialogEx::DoModal();
}
  1. 在CMyDialog的源文件中,找到CMyDialog::OnOK()函数,添加以下代码:
void CMyDialog::OnOK()
{
    // TODO: 在此添加额外的验证代码和/或调用 OnOK “默认”处理方法。例如:CDialogEx::OnOK();
    CDialogEx::OnOK(); //调用默认的处理方法,刷新对话框并关闭它。
}

步骤4:编译和运行程序

  1. 点击Visual Studio工具栏上的“本地Windows调试器”,或者按下F5键编译并运行程序。
  2. 在弹出的主对话框上,点击“打开新对话框”按钮,将打开一个新的对话框。点击“确定”按钮将刷新该对话框并关闭它。点击“取消”按钮将关闭对话框而不进行任何操作。
  3. 在主对话框上,点击“关闭”按钮将关闭整个应用程序。

这是一个简单的MFC应用程序框架,包含了两个对话框和一个主窗口。在CMyDialog中,我们只实现了OnOK方法,该方法在用户点击“确定”按钮时被调用,用于刷新对话框并关闭它。你可以根据需要在CMyDialog中添加其他功能和控件。

请注意,这只是一个基本的框架,实际的应用程序可能需要更多的功能和逻辑。同时,确保你了解MFC的基本概念和用法,以便更好地扩展和修改这个应用程序。

打开YourProjectName.rc文件(在“资源文件”文件夹下)。
双击IDD_YOUR_DIALOG(主对话框的ID)以打开对话框编辑器。
在主对话框上添加两个按钮,一个按钮的ID设置为IDC_BUTTON_OPEN_SECOND_DIALOG,另一个按钮的ID设置为IDC_BUTTON_CLOSE。在辅助对话框上添加一个按钮,按钮的ID设置为IDC_BUTTON_REFRESH。

在主对话框的类文件(例如YourProjectNameDlg.cpp)中添加以下代码:

#include "YourProjectNameDlg.h"
#include "afxdialogex.h"
#include "SecondDialog.h" // 包含辅助对话框的头文件

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// 主对话框

CYourProjectNameDlg::CYourProjectNameDlg(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_YOUR_DIALOG, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CYourProjectNameDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CYourProjectNameDlg, CDialogEx)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_BUTTON_OPEN_SECOND_DIALOG, &CYourProjectNameDlg::OnBnClickedButtonOpenSecondDialog)
    ON_BN_CLICKED(IDC_BUTTON_CLOSE, &CYourProjectNameDlg::OnBnClickedButtonClose)
END_MESSAGE_MAP()

BOOL CYourProjectNameDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();
    SetIcon(m_hIcon, TRUE); // 设置大图标
    SetIcon(m_hIcon, FALSE); // 设置小图标

    return TRUE;
}

void CYourProjectNameDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // 用于绘制的设备上下文

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // 中心图标在客户区矩形中居中显示
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // 图标绘制
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialogEx::OnPaint();
    }
}

HCURSOR CYourProjectNameDlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}

void CYourProjectNameDlg::OnBnClickedButtonOpenSecondDialog()
{
    // 打开辅助对话框
    CSecondDialog dlg;
    dlg.DoModal();
}

void CYourProjectNameDlg::OnBnClickedButtonClose()
{
    // 关闭主对话框
    OnOK();
}


然后,创建辅助对话框:

在解决方案资源管理器中,右键单击项目名称,选择“添加”->“类”。
选择“MFC类”,点击“添加”。
选择“对话框”作为基类,然后单击“完成”。
将辅助对话框的类名设置为CSecondDialog。
在辅助对话框的类文件(例如SecondDialog.cpp)中添加以下代码:

#include "SecondDialog.h"
#include "afxdialogex.h"

// 辅助对话框

IMPLEMENT_DYNAMIC(CSecondDialog, CDialogEx)

CSecondDialog::CSecondDialog(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_SECOND_DIALOG, pParent)
{
}

CSecondDialog::~CSecondDialog()
{
}

void CSecondDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CSecondDialog, CDialogEx)
    ON_BN_CLICKED(IDC_BUTTON_REFRESH, &CSecondDialog::OnBnClickedButtonRefresh)
END_MESSAGE_MAP()

BOOL CSecondDialog::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    return TRUE;
}

void CSecondDialog::OnBnClickedButtonRefresh()
{
    // 在这里添加刷新辅助对话框内容的代码
}


在这个半成品框架中,你需要添加适当的代码来处理按钮点击事件和刷新辅助对话框内容的逻辑。主对话框中的按钮可以打开和关闭辅助对话框,而辅助对话框中的按钮可以用于刷新内容。

直接搜索模式对话框和非模式对话框就有相应的代码了

在Visual Studio 2017中创建一个基于MFC的应用程序,可以按照以下步骤进行:
1、打开Visual Studio 2017,选择“文件”->“新建”->“项目”。
2、在“新建项目”对话框中,选择“Visual C++”->“MFC”,然后选择“MFC应用程序”。
3、在“应用程序向导”中,输入项目名称和位置,然后点击“确定”。
4、在“应用程序向导”中,选择“对话框”,然后点击“完成”。

现在,你应该有一个基本的MFC应用程序,其中包含一个对话框。下面是在这个对话框中添加两个按钮和一个打开新对话框的功能:
1、打开资源视图,找到你的对话框模板,双击它。
2、在对话框编辑器中,点击工具箱,找到“按钮”控件,然后在对话框模板上拖动两次来创建两个按钮。
3、右键点击一个按钮,选择“添加事件处理程序”,在“点击”事件中添加一个新的处理程序。
4、在新的事件处理程序中,添加如下代码:

// 打开新的对话框并关闭当前对话框  
ON_BN_CLICKED(IDC_BUTTON1, &CMFCApplication1Dlg::OnBnClickedButton1)  
{  
    CNewDlg dlg; // 假设CNewDlg是新对话框的类名  
    dlg.DoModal(); // 打开新对话框  
    OnOK(); // 关闭当前对话框  
}

5、对于另一个按钮,添加如下代码:

// 只关闭当前对话框  
ON_BN_CLICKED(IDC_BUTTON2, &CMFCApplication1Dlg::OnBnClickedButton2)  
{  
    OnOK(); // 关闭当前对话框  
}

现在,你需要创建新的对话框类(在这个例子中,我假设它的名字是CNewDlg)。你可以通过以下步骤来完成:
1、在资源视图中,右键点击“对话框模板”,选择“添加资源”。
2、在“添加资源”对话框中,选择“对话框”,然后点击“新建”。
3、双击新创建的对话框模板,添加你需要的控件。在这个例子中,我添加了一个按钮。
4、右键点击新创建的对话框模板,选择“添加类”。
5、在“添加类向导”中,输入类名(在这个例子中,我假设它是CNewDlg),然后选择“CDialogEx”作为基类。然后点击“完成”。
6、在新创建的类中,为按钮添加点击事件处理程序。在事件处理程序中,添加如下代码:

// 刷新新对话框的所有内容,重新开始  
ON_BN_CLICKED(IDC_BUTTON3, &CNewDlg::OnBnClickedButton3)  
{  
    // 在这里添加刷新对话框的代码  
    // ...  
}

7、最后,你需要在你的应用程序类(通常是CMainFrame)中添加对新对话框类的支持。你可以在CMainFrame的DoDataExchange方法中添加如下代码:

void CMainFrame::DoDataExchange(CDataExchange* pDX)  
{  
    CDialogEx::DoDataExchange(pDX);  
    //{{AFX_DATA_MAP(CMainFrame)  
    DDX_Control(pDX, IDC_BUTTON1, m_button1);  
    DDX_Control(pDX, IDC_BUTTON2, m_button2);  
    //}}AFX_DATA_MAP  
}

img

img

这就是一个基本的半成品框架,满足你的需求。你可以根据自己的需要进行进一步的开发和完善。希望这能帮助到你!

VS2013 MFC基于对话框编程


基于C++的MFC的入门教程_51CTO博客_c++开发教程 基于C++的MFC的入门教程,一、创建基于对话框的MFC应用程序框架程序的创建过程:选择“文件|新建|项目”菜单;在“新建项目”对话框中,选择“MFC应用程序”,输入工程名称,选择“确定”。选择“基于对话框”,即创建基于对话框的应用程序,选择“完成”。一直下一步新建完成后如下图所示二、对话框应用程序框架介绍1、资源视图用AppWizard创建基于对话框的应用程序框架(假定工程名为Dialog)后,项目工作区上增加了一个“资源视图”选项卡。或者,通过视图找到“资源视图”选. https://blog.51cto.com/u_14114084/3651576

结合GPT给出回答如下请题主参考
以下是一个符合您要求的基于对话框的MFC程序的半成品代码。

首先,在VS2017中创建一个MFC对话框程序,我们称之为MyApp。在资源视图中打开MyApp.rc文件,并添加两个按钮,分别命名为IDOK1和IDOK2。在该对话框中添加下面的代码:

// MyAppDlg.h

#pragma once

class CMyAppDlg : public CDialogEx
{
    DECLARE_DYNAMIC(CMyAppDlg)

public:
    CMyAppDlg(CWnd* pParent = nullptr);
    virtual ~CMyAppDlg();

    enum { IDD = IDD_MYAPP_DIALOG };

protected:
    virtual void DoDataExchange(CDataExchange* pDX);

    DECLARE_MESSAGE_MAP()

private:
    CWnd* m_pWnd; // 用于存放新对话框的指针

public:
    afx_msg void OnBnClickedOk1();
    afx_msg void OnBnClickedOk2();
};

// MyAppDlg.cpp

#include "stdafx.h"
#include "MyApp.h"
#include "MyAppDlg.h"
#include "afxdialogex.h"
#include "NewDlg.h" // 新建对话框头文件

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

CMyAppDlg::CMyAppDlg(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_MYAPP_DIALOG, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

CMyAppDlg::~CMyAppDlg()
{
}

void CMyAppDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CMyAppDlg, CDialogEx)
    ON_BN_CLICKED(IDOK1, &CMyAppDlg::OnBnClickedOk1)
    ON_BN_CLICKED(IDOK2, &CMyAppDlg::OnBnClickedOk2)
END_MESSAGE_MAP()

void CMyAppDlg::OnBnClickedOk1()
{
    CNewDlg dlgNew; // 新建对话框实例

    // 这里需要传递本对话框指针给新对话框
    dlgNew.m_pParent = this;

    // 存储新对话框指针,以便在OnBnClickedRefresh()函数中操作
    m_pWnd = &dlgNew;

    // 打开新对话框并隐藏本对话框
    dlgNew.DoModal();
    ShowWindow(SW_HIDE);
}

void CMyAppDlg::OnBnClickedOk2()
{
    // 关闭本对话框
    EndDialog(IDOK);
}

在此代码中,我们定义了名为CMyAppDlg的对话框类,并添加了两个按钮的消息处理程序OnBnClickedOk1和OnBnClickedOk2。OnBnClickedOk1的代码会打开一个新的对话框CNewDlg,并隐藏本对话框。OnBnClickedOk2的代码会直接关闭本对话框。

然后,创建一个新的对话框类CNewDlg,并在资源视图中添加一个按钮,命名为IDOK。在该对话框中添加下面的代码:

// NewDlg.h

#pragma once

class CMyAppDlg; // 前向声明

class CNewDlg : public CDialogEx
{
    DECLARE_DYNAMIC(CNewDlg)

public:
    CNewDlg(CWnd* pParent = nullptr);
    virtual ~CNewDlg();

    enum { IDD = IDD_NEWDLG_DIALOG };

protected:
    virtual void DoDataExchange(CDataExchange* pDX);

    DECLARE_MESSAGE_MAP()

public:
    CMyAppDlg* m_pParent; // 用于存放上一个对话框的指针
    afx_msg void OnBnClickedOk();
    afx_msg void OnBnClickedRefresh();
};

// NewDlg.cpp

#include "stdafx.h"
#include "MyApp.h"
#include "NewDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

CNewDlg::CNewDlg(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_NEWDLG_DIALOG, pParent)
{
    m_pParent = nullptr;
}

CNewDlg::~CNewDlg()
{
}

void CNewDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CNewDlg, CDialogEx)
    ON_BN_CLICKED(IDOK, &CNewDlg::OnBnClickedOk)
    ON_BN_CLICKED(IDC_BUTTON_REFRESH, &CNewDlg::OnBnClickedRefresh)
END_MESSAGE_MAP()

void CNewDlg::OnBnClickedOk()
{
    EndDialog(IDOK);

    // 关闭新对话框并打开上一个对话框
    m_pParent->ShowWindow(SW_SHOW);
}

void CNewDlg::OnBnClickedRefresh()
{
    // 刷新当前对话框
    MessageBox(_T("Refreshed!"));
}

在此代码中,我们定义了名为CNewDlg的对话框类,并添加了一个IDOK按钮。当用户单击IDOK按钮时,我们将关闭当前对话框并打开上一个对话框。当用户单击IDC_BUTTON_REFRESH按钮时,我们会弹出一个消息框来通知用户当前对话框已刷新。

最后,您需要在应用程序的主函数中调用CMyAppDlg的DoModal方法来运行对话框。在MyApp.cpp文件中添加以下代码:

// MyApp.cpp

#include "stdafx.h"
#include "MyApp.h"
#include "MyAppDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

BEGIN_MESSAGE_MAP(CMyAppApp, CWinApp)
    ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()

CMyAppApp::CMyAppApp()
{
}

CMyAppApp theApp;

BOOL CMyAppApp::InitInstance()
{
    CWinApp::InitInstance();

    CMyAppDlg dlg;
    m_pMainWnd = &dlg;
    dlg.DoModal();

    return FALSE;
}

启动程序后,您将看到MyApp对话框上的两个按钮。单击第一个按钮将打开一个新的对话框,该对话框有一个刷新按钮,您可以单击该按钮以刷新该对话框。单击第二个按钮将直接关闭MyApp对话框。

在你的主对话框的OnInitDialog函数中,你可以通过调用SetParent函数来设置新对话框的父窗口为当前对话框:

cpp
void CYourMainDialog::OnInitDialog()
{
    CDialog::OnInitDialog();

    // TODO: 在此添加额外的初始化代码
    CDialog* pChildDialog = new CDialog(IDD_YOUR_DIALOG);
    pChildDialog->Create(this, IDD_YOUR_DIALOG); // 创建新对话框
    pChildDialog->ShowWindow(SW_SHOW); // 显示新对话框
}

先建个主窗口,最后调用程序主消息循环维持窗口,中间加按钮控件

半成品代码如下:
你可以将其复制到VS2017中的一个MFC项目中,然后运行程序即可看到对话框和按钮的效果:

// MainDlg.h
#pragma once

class CMainDlg : public CDialogEx
{
public:
    CMainDlg(CWnd* pParent = nullptr);   // 标准构造函数
    virtual ~CMainDlg();

// 对话框数据
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_MAINDLG };
#endif

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

// 实现
protected:
    HICON m_hIcon;
    CButton m_btnOpen;
    CButton m_btnClose;

    // 生成的消息映射函数
    virtual BOOL OnInitDialog();
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()

public:
    afx_msg void OnBtnOpenClicked();
    afx_msg void OnBtnCloseClicked();
};

// MainDlg.cpp
#include "MainDlg.h"
#include "ChildDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

CMainDlg::CMainDlg(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_MAINDLG, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

CMainDlg::~CMainDlg()
{
}

void CMainDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_BTN_OPEN, m_btnOpen);
    DDX_Control(pDX, IDC_BTN_CLOSE, m_btnClose);
}

BEGIN_MESSAGE_MAP(CMainDlg, CDialogEx)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_BTN_OPEN, &CMainDlg::OnBtnOpenClicked)
    ON_BN_CLICKED(IDC_BTN_CLOSE, &CMainDlg::OnBtnCloseClicked)
END_MESSAGE_MAP()

BOOL CMainDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    SetIcon(m_hIcon, TRUE);         // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标

    return TRUE;
}

void CMainDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // 用于绘制的设备上下文

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // 居中绘制图标
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialogEx::OnPaint();
    }
}

HCURSOR CMainDlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}

void CMainDlg::OnBtnOpenClicked()
{
    CChildDlg dlg;
    dlg.DoModal();
    EndDialog(IDOK);
}

void CMainDlg::OnBtnCloseClicked()
{
    EndDialog(IDOK);
}

// ChildDlg.h
#pragma once

class CChildDlg : public CDialogEx
{
public:
    CChildDlg(CWnd* pParent = nullptr);   // 标准构造函数
    virtual ~CChildDlg();

// 对话框数据
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_CHILDDLG };
#endif

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

// 实现
protected:
    HICON m_hIcon;
    CButton m_btnRefresh;

    // 生成的消息映射函数
    virtual BOOL OnInitDialog();
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()

public:
    afx_msg void OnBtnRefreshClicked();
};

// ChildDlg.cpp
#include "ChildDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

CChildDlg::CChildDlg(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_CHILDDLG, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

CChildDlg::~CChildDlg()
{
}

void CChildDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_BTN_REFRESH, m_btnRefresh);
}

BEGIN_MESSAGE_MAP(CChildDlg, CDialogEx)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_BTN_REFRESH, &CChildDlg::OnBtnRefreshClicked)
END_MESSAGE_MAP()

BOOL CChildDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    SetIcon(m_hIcon, TRUE);         // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标

    return TRUE;
}

void CChildDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // 用于绘制的设备上下文

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // 居中绘制图标
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialogEx::OnPaint();
    }
}

HCURSOR CChildDlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}

void CChildDlg::OnBtnRefreshClicked()
{
    // 刷新新对话框的内容
}

添加按钮控件,然后通过事件函数控制另一个按钮