创建一个新的基 CDialogEx 派生类

安德鲁·特拉克尔

我有很多CDialogEx派生类在以下方面做这样的事情OnInitDialog

CMeetingScheduleAssistantApp::InitialiseResizeIcon(m_bmpResize, m_lblResize, this);
CMeetingScheduleAssistantApp::RestoreWindowPosition(_T("PublisherDB"), this, true);

然后,我将以下内容添加到每个派生的对话框类中:

int CPublishersDatabaseDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CDialogEx::OnCreate(lpCreateStruct) == -1)
        return -1;

    // Save Initial window size to m_rcInit
    GetWindowRect(&m_rcInit);

    return 0;
}

void CPublishersDatabaseDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
    // Set the minimum window size to initial size.
    lpMMI->ptMinTrackSize.x = m_rcInit.Width();
    lpMMI->ptMinTrackSize.y = m_rcInit.Height();

    CDialogEx::OnGetMinMaxInfo(lpMMI);
}

void CPublishersDatabaseDlg::OnClose()
{
    CMeetingScheduleAssistantApp::SaveWindowPosition(_T("PublisherDB"), this);
    CDialogEx::OnClose();
}

每个对话框唯一不同的是用于保存窗口位置的短语。

我想要一个CDialogEx可以继承的基础类,它将执行上述操作。我看过SO,似乎有些问题并创建了一个CDialog类并从另一个CDialog继承但是我想创建的这个类更通用。有效地用作基础而不是CDialogEx.

这能做到吗?我是否过于复杂了?

问题

为什么我尝试创建一个新类,派生自CDialogEx

设置

结果

错误

我不知道这是否是因为它需要一个对话框ID为说明这里

类,如CDialogCFormView,或CPropertyPage,这需要一个对话ID

所以我无法找到正确的方法来创建用于我所有其他对话框类的基本 CDialogEx 类。

更新

我创建了这段代码,它告诉我这CResizingDialog不是类或命名空间:

#include "ResizingDialog.h"
#include "resource.h"
#include "stdafx.h"

IMPLEMENT_DYNAMIC(CResizingDialog, CDialogEx)

CResizingDialog::CResizingDialog(const CString& strWindowID, UINT nIDTemplate, CWnd* pParent = nullptr)
    : m_strWindowID(strWindowID), CDialogEx(nIDTemplate, pParent)
{

}

CResizingDialog::~CResizingDialog()
{
}

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

BEGIN_MESSAGE_MAP(CResizingDialog, CDialogEx)
    ON_WM_CREATE()
    ON_WM_GETMINMAXINFO()
    ON_WM_CLOSE()
END_MESSAGE_MAP()


int CResizingDialog::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CDialogEx::OnCreate(lpCreateStruct) == -1)
        return -1;

    // Save Initial window size to m_rcInit
    GetWindowRect(&m_rcInit);

    return 0;
}


void CResizingDialog::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
    // Set the minimum window size to initial size.
    lpMMI->ptMinTrackSize.x = m_rcInit.Width();
    lpMMI->ptMinTrackSize.y = m_rcInit.Height();

    CDialogEx::OnGetMinMaxInfo(lpMMI);
}


void CResizingDialog::OnClose()
{
    SaveWindowPosition(m_strWindowID, this);

    CDialogEx::OnClose();
}
安德鲁·特拉克尔

根据鼓励我尝试手动创建类的评论,我让它工作:

#include "stdafx.h"
#include "resource.h"
#include "ResizingDialog.h"

IMPLEMENT_DYNAMIC(CResizingDialog, CDialogEx)

CResizingDialog::CResizingDialog(const CString& strWindowID, UINT nIDTemplate, CWnd* pParent /* nullptr */, bool bOnlyStorePosition /* false */)
    : m_strWindowID(strWindowID),
      m_bOnlyStorePosition(bOnlyStorePosition), CDialogEx(nIDTemplate, pParent)
{

}

CResizingDialog::~CResizingDialog()
{
}

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

BEGIN_MESSAGE_MAP(CResizingDialog, CDialogEx)
    ON_WM_CREATE()
    ON_WM_GETMINMAXINFO()
    ON_WM_CLOSE()
END_MESSAGE_MAP()

int CResizingDialog::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CDialogEx::OnCreate(lpCreateStruct) == -1)
        return -1;

    // Save Initial window size to m_rcInit
    GetWindowRect(&m_rcInit);

    return 0;
}

void CResizingDialog::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
    // Set the minimum window size to initial size.
    lpMMI->ptMinTrackSize.x = m_rcInit.Width();
    lpMMI->ptMinTrackSize.y = m_rcInit.Height();

    CDialogEx::OnGetMinMaxInfo(lpMMI);
}

void CResizingDialog::OnClose()
{
    SaveWindowPosition(m_strWindowID, this);

    CDialogEx::OnClose();
}

void CResizingDialog::OnOK()
{
    SaveWindowPosition();
    CDialogEx::OnOK();
}

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

    if(!m_bOnlyStorePosition)
        InitialiseResizeIcon(m_bmpResize, m_lblResize, this);

    RestoreWindowPosition(m_strWindowID, this, true);

    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
}

我决定将 app 类中的方法复制到这个新的对话框类中。最终它们可以从应用程序类中删除。我唯一需要做的就是#include我的资源文件,因为图像需要知道资源 ID 的值。

这是ResizingDialog.h标题:

#pragma once
#include <afxwin.h>

class CResizingDialog : public CDialogEx
{
    DECLARE_DYNAMIC(CResizingDialog)

public:
    CResizingDialog(const CString& phrase, UINT nIDTemplate, CWnd* pParent = nullptr, bool bOnlyStorePosition = false); // Constructor
    virtual ~CResizingDialog(); // Destructor

protected:
    void OnOK() override;
    virtual void DoDataExchange(CDataExchange* pDX) override;    // DDX/DDV support
    void SaveWindowPosition(void) { SaveWindowPosition(m_strWindowID, this); }

public:
    BOOL OnInitDialog() override;
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    afx_msg void OnGetMinMaxInfo(MINMAXINFO* lpMMI);
    afx_msg void OnClose();
    DECLARE_MESSAGE_MAP()

private:
    CBitmap m_bmpResize;
    CStatic m_lblResize;
    CRect m_rcInit;
    CString m_strWindowID;
    bool m_bOnlyStorePosition;

    void RestoreWindowPosition(CString strWindow, CWnd* pWindow, bool bOverrideState = false);
    void SaveWindowPosition(CString strWindow, CWnd* pWindow);
    void InitialiseResizeIcon(CBitmap& rBmpResize, CStatic& rLblResize, CWnd* pDialog);
};

实际功能SaveWindowPositionRestoreWindowPositionInitialiseResizeIcon这里没有显示,因为它们不直接涉及到这个问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从派生类创建基类对象

来自分类Dev

从基类创建派生类的实例

来自分类Dev

从基础创建派生类

来自分类Dev

从派生类派生一个类

来自分类Dev

基于另一个类创建一个新的派生类型

来自分类Dev

如何禁止C ++派生类从基类派生,但允许另一个派生类

来自分类Dev

创建一个实现派生类单例的基类

来自分类Dev

从基类的派生类访问属性

来自分类Dev

静态实例基类/派生类

来自分类Dev

从基类方法克隆派生类

来自分类Dev

非多态派生类的基类

来自分类Dev

基类中派生类的组成

来自分类Dev

从派生类访问基类对象

来自分类Dev

派生类定义的基类集合

来自分类Dev

对派生类对象的基类引用

来自分类Dev

从基类指针访问派生类

来自分类Dev

从基类指针克隆派生类

来自分类Dev

从基类方法克隆派生类

来自分类Dev

静态实例基类/派生类

来自分类Dev

从派生类计算基类参数

来自分类Dev

基类中派生类的组成

来自分类Dev

从基类修改派生类的值

来自分类Dev

如何从另一个派生类对象调用派生类虚拟方法

来自分类Dev

使用派生类放置新的

来自分类Dev

派生类指向基类对象的指针如何调用派生类的方法?

来自分类Dev

为什么派生类指针指向基类可以调用派生类成员函数?

来自分类Dev

从基类和派生类之外的方法返回任何派生类类型

来自分类Dev

派生类指向基类对象的指针如何调用派生类的方法?

来自分类Dev

C ++继承:指向基类的派生类指针调用派生类方法