Как получить доступ к состоянию переменной члена Mainfrm без использования ((CMainFrame *) AfxGetMainWnd ()) — & gt; …?

У меня есть приложение MDI в MFC для изменения. Я хочу проверить значение флага, который является переменной-членом MainFrm из класса более низкого уровня. Но я не хочу получать к нему доступ, используя
Функция ‘((CMainFrame *) AfxGetMainWnd ()) -> IsFlagOn ()’, потому что для этого я должен дать mainfrm.h в классе более низкого уровня. Я как-то чувствую, что это создаст некую циркулярную ссылку позже, после прочтения этого Почему циркулярные ссылки считаются вредными?
Какие другие способы получить значение флага из класса mainfrm. Пожалуйста, руководство!

примечание: здесь иерархия классов: mainfrm-> CTestExplorerFrame-> CTestExplorerView-> CTestExplorerTreeCtrl
Я хочу проверить с самого низкого уровня флаг, к которому имеет доступ только mainfrm

1

Решение

AfxGetMainWnd () возвращает CWnd *, который можно использовать для связи с мэйнфреймом через систему сообщений Windows. Определите пользовательское сообщение и отправьте это сообщение CWnd *

#define UWM_MYREQUEST (WM_APP + 2)

int datatoget;
CWnd* pMainframe = AfxGetMainWnd();
pMainframe->SendMessage(UWM_MYREQUEST, (WPARAM)&datatoget, 0);

Мэйнфрейму нужен такой код, чтобы получать и обрабатывать пользовательское сообщение:

ON_MESSAGE (UWM_MYREQUEST, OnMyRequest)

LRESULT CMainFrame::OnMyRequest(WPARAM wparam, LPARAM lparam)
{
int* ptoget = (int*)wparam;
*ptoget = m_datarequested;
return 0;
}
2

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

Я бы объявил (чисто виртуальный) интерфейсный класс, где у вас есть чисто виртуальный вызов, чтобы получить значение интересующего вас флага в CTestExplorerTreeCtrl. Затем MainFrame реализует этот интерфейсный класс и передает указатель на CTestExplorerTreeCtrl. Таким образом, вы можете избежать любых ссылок на класс MainFrame.

0

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