Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Дополнения к нижесказанному 21.07.03 14:43 Число просмотров: 1879
Автор: amirul <Serge> Статус: The Elderman
|
> Такую обработку несложно построить в BC++, т.к. все > контролы являются членами класса формы приложения. Т.е из > указанных выше функций (методов формы) видны все контролы. > Гораздо сложнее это реализовать в VC++. Это связано с тем, В VC++ (в частности в MFC Class Wizard-е - вызывается клавишей Ctrl-W) можно добавлять переменные в сгенеренный класс. В частности в класс диалога можно добавить переменные TreeView-а и TabCtrl-а.
> что классы, в которых созданы члены-контролы ничего не > знают друг о друге, и не видят соответствующих контролов в > общем случае. Например, если Вы создали приложение с Это правильно что не видят. Потому, что программист должен сам знать чего хочет, а среда разработки - только инструмент. Кроме того в общем случае на один и тот же контрол можно добавить много переменных разных типов, а можно и вообще не засорять пространство имен, если оно не нужно.
> CTreeView – СFormView, где на форму положили CTabCtrl и для > каждой закладки создали по диалогу CPage1,…., CPage20, то > для каждого класса!!! придётся писать соответсвующие > обработчики bool FillControls(unsigned int msg), bool > DisplayControls. При этом необходимо ещё найти приемлемый > механизм обмена сообщениями между классами.
> У кого есть идеи? Предлагаю для затравки тупой метод > решения задачи - использование глобальных указателей на > каждый из диалогов. Умные – предложите Вы. Совершенно необязательно даже в этом случае делать их глобальными. О них необходимо знать только диалогу - поэтому и поместить их надо мемберами в диалог. CTreeView через Class Wizard, а страницы - по мере создания (насколько я понял страницы добавляются только динамически, то бишь появляются только в рантайме, поэтому добавить переменные и для них через Class Wizard нельзя, так как он привязан к Design Time-у).
Но есть и более эффективный вариант (и более правильный с точки зрения ООП). С TreeView-ом разобрались, а для страниц правильнее сделать общий базовый класс, с описанием всех функций, необходимых для работы (скорее всего виртуальных, но это зависит от конкретной задачи). Далее при добавлении страницы в поле lParam записывать указатель на CPage (базовый класс). После таких манипуляций станет возможно в Class Wizard-е добавить только переменную для CTabCtrl-а. А перечислять все страницы при помощи CTabCtrl::GetItem(). Делаем обратное преобразование из lParam-а к (CPage *) и работаем с этим указателем через его виртуальные интерфейсы.
Кроме того, как уже было указано, использование case-ов не по CPP-овски. Вызов функции тоже можно считать сообщением, поэтому вместо FillControls(STARTUP) лучше делать прямой вызов ClearControls()-ов. Ну в крайнем случае сделать приватную helper-функцию, которая будет заниматься непосредственно перечислением, а в нее слать pointer-to-member на необходимую функцию (я конечно не уверен, что это можно делать с виртуальными функциями, но насколько я себе представляю это не так уж сложно реализовать, а значит скорее всего реализовано в CPP)
|
|
|