2013-08-05 2 views
1

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

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

+1

магазин главное окно в переменной где-нибудь? –

ответ

2

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; 
} 
+0

Это именно то, что я хотел. Я думал о отправке пользовательского сообщения, но я полностью забыл, что мы также можем получить его благодаря этому. Спасибо ScottMcP-MVP –

+1

Это зависит от вас, какое решение вы берете, но подход с использованием сообщения Windows не очень эффективен, довольно медленный по сравнению с прямой вызов, и вам нужно определить собственное сообщение и обработчик сообщений для каждого члена данных, который вы хотите прочитать. Кроме того, он не является безопасным по типу, и вы используете специальный код Windows :) – Clemens

+0

Я, это абсолютно верно @Clemens. Я, очевидно, подумаю об этом. Благодарю. –

0

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

Смежные вопросы