Создание нового базового производного класса 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:

Настроить

Результат

ошибка

Я не знаю, так ли это, потому что это требует идентификатор диалога как указано Вот.

Классы, такие как CDialog, CFormView, или же CPropertyPage, которые требуют идентификатор диалога.

Поэтому я не могу найти правильный способ создания базового класса 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();
}

0

Решение

Исходя из комментариев, побуждающих меня попытаться создать класс вручную, он работает:

#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
}

Я решил скопировать методы, которые были в классе приложения, в этот новый класс диалога. В конце концов они могут быть удалены из класса приложения. Единственное, что я тоже должен был сделать, это #include мой файл ресурсов, потому что изображение должно знать значение идентификатора ресурса.

Это 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);
};

Актуальные функции SaveWindowPosition, RestoreWindowPosition а также InitialiseResizeIcon здесь не показаны, так как они не имеют прямого отношения к проблеме.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector