在 MFC(Microsoft Foundation Classes)中,CDialog 类提供了一个名为 CreateIndirect 的公共方法,用于动态创建对话框,但与 Create 不同的是,CreateIndirect 允许您通过传递一个对话框模板结构的指针来创建对话框。

以下是 CDialog 类的 CreateIndirect 方法的声明:
virtual BOOL CreateIndirect(
    LPCDLGTEMPLATE lpDialogTemplate,
    CWnd* pParentWnd = NULL,
    HINSTANCE hInst = NULL
);

该方法接受三个参数:

  •  lpDialogTemplate:一个指向对话框模板结构的指针。

  •  pParentWnd:一个可选的指向父窗口的指针。

  •  hInst:一个可选的实例句柄。


使用这个方法,您可以在运行时创建一个对话框,而不需要在资源编辑器中定义对话框模板。以下是一个简单的示例,演示如何使用 CreateIndirect 方法:
// MyDialog.h
#pragma once

#include "afxwin.h"

class CMyDialog : public CDialog
{
public:
    CMyDialog(CWnd* pParent = nullptr); // 默认构造函数

    // Dialog Data
    #ifdef AFX_DESIGN_TIME
        enum { IDD = IDD_MYDIALOG };
    #endif

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

    // Implementation
protected:
    DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnBnClickedOk();
    afx_msg void OnBnClickedCancel();
};

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

// CMyDialog 对话框

IMPLEMENT_DYNAMIC(CMyDialog, CDialog)

CMyDialog::CMyDialog(CWnd* pParent /*=nullptr*/)
    : CDialog(pParent)  // 使用默认构造函数进行初始化
{
    // 创建对话框模板
    DLGTEMPLATE dlgTemplate;
    memset(&dlgTemplate, 0, sizeof(dlgTemplate));
    dlgTemplate.style = WS_POPUP | WS_VISIBLE | WS_BORDER | DS_MODALFRAME | WS_CAPTION | DS_CENTER;
    dlgTemplate.cx = 200;
    dlgTemplate.cy = 100;

    // 创建对话框
    CreateIndirect(&dlgTemplate);
}

void CMyDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
    ON_BN_CLICKED(IDOK, &CMyDialog::OnBnClickedOk)
    ON_BN_CLICKED(IDCANCEL, &CMyDialog::OnBnClickedCancel)
END_MESSAGE_MAP()

void CMyDialog::OnBnClickedOk()
{
    // TODO: 在此添加控件通知处理程序代码
    OnOK();
}

void CMyDialog::OnBnClickedCancel()
{
    // TODO: 在此添加控件通知处理程序代码
    OnCancel();
}

在这个示例中,CMyDialog 类使用默认构造函数,然后在构造函数中创建了一个简单的对话框模板结构 DLGTEMPLATE,并调用了 CDialog 类的 CreateIndirect 方法,传递了对话框模板结构的指针。这样,您可以在运行时动态创建对话框。


转载请注明出处:http://www.zyzy.cn/article/detail/17318/MFC/CDialog