Доступ к элементам управления Windows из другого класса или окна

В программе MFC я пытаюсь получить доступ к элементам управления, которые находятся в одном окне (классе), из другого окна (братского или дочернего) с кодом в другом файле .cpp. Обычно доступ к элементу управления осуществляется с помощью переменной DDX_Control, определенной в файле класса .cpp.

DDX_Control(pDX, IDC_STATUS, m_Status); 

Код другого окна находится в другом файле, поэтому у меня нет доступа к управляющей переменной (m_Status). Что я сделал, так это использовал FindWindow, чтобы найти главное окно, а затем GetDlgItem, чтобы найти интересующий меня элемент управления:

CWnd * tmpWnd = CWnd::FindWindow(NULL,"MainWindow");  // find the main dialog box
CStatic * tmpStatus = (CStatic*) tmpWnd->GetDlgItem(IDC_Status);
tmpStatus->SetWindowText(“Status Report);

Это прекрасно работает в отладчике, но терпит неудачу при выполнении вне отладчика. FindWindow правильно получает идентификатор окна, но GetDlgItem возвращает значение null.

В идеале я хотел бы получить доступ к управляющей переменной (m_Status) из другого окна, но я не знаю, как это сделать. Я понимаю, что GetDlgItem далеко не идеален ни при каких обстоятельствах.

Одним из решений было бы послать сообщение классу главного окна и сказать ему, что делать, но мне нужно было бы иметь подпрограмму для обработки каждого элемента управления и знать, как обрабатывать любые данные, которые я отправляю.

Есть ли «правильный» способ сделать это? Спасибо

Окончательный ответ - привести к исходному классу:

((CspDlg *)AfxGetMainWnd())->m_Status.SetWindowText("Отчет");


person user938797    schedule 05.04.2014    source источник


Ответы (1)


Поскольку вы создали «главное» окно, у вас есть объект или указатель для него. Или вы можете вызвать AfxGetMainWnd(), чтобы получить указатель на него. Затем вы можете использовать это для доступа к общедоступному члену, такому как m_Status. Все ваши окна взаимосвязаны, и нет необходимости использовать FindWindow для поиска любого окна в вашей собственной программе.

Тот факт, что некоторые переменные могут быть определены в другом файле, значения не имеет. Это можно решить с помощью подходящего использования #include "theotherfile.h" и указателей/ссылок на объекты.

person ScottMcP-MVP    schedule 05.04.2014
comment
Спасибо за быстрый ответ. Я попробую и опубликую свои результаты. Да, я могу получить доступ к m_Status с помощью включения, но сейчас это не имеет смысла или я использую его неправильно. - person user938797; 06.04.2014
comment
Хорошо, я показываю здесь свое невежество, но я все еще не знаю, как получить доступ к управляющей переменной m_Status. У меня есть файл .h, но шаги для доступа к управляющей переменной мне не ясны. Пожалуйста, помоги, если можешь. Спасибо. - person user938797; 06.04.2014
comment
Нам нужно увидеть код. Является ли m_Status общедоступным элементом главного окна? Отображается ли он в то время, когда вы хотите получить к нему доступ? Если да, то (используя имя класса главного окна вместо CMain) это может сделать это за вас: ((CMain*)AfxGetMainWnd())->m_Status.SetWindowText(Report); - person ScottMcP-MVP; 06.04.2014
comment
Это именно то, что я ожидал, чтобы работать, но не работает. Вот простой способ взглянуть на это: CWnd * mainWnd2 = AfxGetMainWnd(); mainWnd2-›m_Status; За исключением того, что он не находит m_Status. Файл .h включен. Я не уверен, какой код будет полезен. Вот код ddx в spDlg.cpp: DDX_Control(pDX, IDC_STATUS, m_Status); и файл .h: Public: CStatic m_Status; Затем у меня есть отдельный файл .cpp с кодом с кодом CWnd выше. У него есть включаемый файл: #include spdlg.h Мне не хватает чего-то простого в доступе к общедоступным членам класса. - person user938797; 06.04.2014
comment
Да, вам не хватает чего-то основного, так это того, что CWnd не имеет члена m_Status. Приведите указатель к реальному классу главного окна*, подобному CMain, о котором я упоминал в предыдущем комментарии. - person ScottMcP-MVP; 06.04.2014
comment
Я сделал это, вырезал и вставил из вашего комментария ((CMain*)AfxGetMainWnd())-›m_Status.SetWindowText(Report); вот сообщения об ошибках: ошибка C2065: 'CMain': необъявленный идентификатор: ошибка C2059: синтаксическая ошибка: ')' 1›: ошибка C2039: 'm_Status': не является членом 'CWnd' 1›: см. объявление ' CWnd' - person user938797; 06.04.2014
comment
Прочитайте мой комментарий еще раз. Я сказал вам, что использовать вместо CMain. - person ScottMcP-MVP; 06.04.2014
comment
Думаю, я понял. Мне нужно выполнить приведение к классу с m_Status в нем:((CspDlg *)AfxGetMainWnd())-›m_Status.SetWindowText(Report); По крайней мере, это не выдает сообщение об ошибке. Тестирую сейчас. Спасибо, что указали мне правильное направление! - person user938797; 06.04.2014
comment
ВАУ! Это сработало! Большое спасибо, я ценю вашу помощь и ваше терпение. - person user938797; 07.04.2014