【问题标题】:CDialogEx constructor and inherited Create() methodCDialogEx 构造函数和继承的 Create() 方法
【发布时间】:2020-04-24 15:31:38
【问题描述】:

当我以编程方式从对话框资源 ID 创建非模式对话框时,我使用以下代码:

CDialogEx myDialog(IDD_DIALOG1, this);
...
myDialog.Create(IDD_DIALOG1, this);

可以看出这不是很实用,因为需要将对话 ID 传递两次。 我对创建对话框有什么误解吗? 有没有办法避免这种重复?

MFC类CDialogEx提供构造函数是什么原因

CDialogEx(UINT nIDTemplate, CWnd* pParent=NULL);

也是一个继承的方法

virtual BOOL CDialog::Create(UINT nIDTemplate, CWnd* pParentWnd = NULL);

这迫使我重复对话 ID?

背后的原因是我想从CDialogEx 派生一个自己的类myDialogClass,但此时不想分配ID。将虚拟 ID 传递给 CDialogEx 构造函数是否可行? 我想在创建对话窗口时分配 ID,而不是之前。

class MyDialogClass: public CDialogEx{
    ...
    public:
    MyDialogClass(CWnd* pParent=NULL):CDialogEx(DUMMY_ID, pParent){}
}

此外,我想将我的对话框类提取到自己的库(MFC 扩展库)中,并在其他代码中使用它。 我的对话框类为普通 DC 提供了一个额外的内存 DC,但这可能只是任何其他功能。 我想在多种情况下使用此附加功能。

【问题讨论】:

  • 这取决于你想要的对话框:模态与否。 Create 用于无模式对话。
  • 我想创建一个无模式对话框。情况确实如此。我已经更新了问题以使这一点更清楚。我的对话框应该提供额外的功能(在这种情况下是内存 DC),但确切的功能并不重要,在这里。我想把它放到一个外部类库中。
  • CDialog 有一个默认构造函数。我不知道CDialogEx,而且我不在电脑附近检查它。 These 指南可能会对您有所帮助。

标签: c++ mfc dialog


【解决方案1】:

“我对创建对话框的理解有误吗?” 有两种情况可以使用对话框:模态和非模态。你混合他们:

CDialog & CDialogEx 提供了一个无参数构造函数,可以用于无模式场景。你的代码变成:

CDialogEx myDialog();
// ...
myDialog.Create(IDD_DIALOG1, this);

有关如何正确实现无模式对话框的更多信息,请参阅 this

【讨论】:

  • 感谢您提供的信息。出于某种原因,我确信不存在无参数构造函数。
  • @noop 它发生了。
  • “无参数构造函数受到保护,只能在派生类中使用”,根据 MS 文档。但是,这正是我想要做的。但也许这就是我监督这个的原因。
  • MS 文档在某种程度上提供了正确的信息。它们并不总是与实际代码同步。构造函数当前是公开的。请参阅上图或计算机上的 afxwin.h 和 afxdialogex.h 文件。
猜你喜欢
  • 1970-01-01
  • 2014-11-22
  • 2023-03-27
  • 1970-01-01
  • 2014-12-27
  • 2017-02-12
  • 2016-03-24
相关资源
最近更新 更多