![]() |
|
|
![]()
|
|
| Zolex |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 24.10.2006 Репутация: нет Всего: нет |
Здравствуйте.
Вот стоит сия задача передо мною и разобраться в ней нет сил моих, помогите чем сможете... Программа пишется в VC6. Выбран стандартный тэмплэйт МFC Application Wizarad (exe). (однооконный, однодокументный) Далее в MainFraim окно делится на два вида. Один - наследник CTreeView, другой - CListView. Причем оба вида(класса) находяться в разных файлах (одноименных). CTreeView заполняется некими элементами... Далее задача такая - при смене элемента CTreeView (OnSelchanged, то есть при тычке мышью в какой-то Item дерева), СListView должен заполняться некими элементами. То есть допустим в классе СListView есть метод заполнения списка элементами с названием AddItems. Вот как его вызвать из СTreeView при событии CTreeView::OnSelchanged и передать ему выбранный Item СTreeView? Заранее спасибо... Это сообщение отредактировал(а) Zolex - 24.10.2006, 19:27 |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Из TreeView это вызывать не стОит: пусть виды живут себе, ничего друг о друге не зная - целее будут.
Лучше эту логику вынести в родительское окно, т.е. в MainFrame. Обработчик SELCHANGED можно ведь поставить родителю. Т.е. получает MainFrame уведомление о смене текущего элемента в дереве и вызывает себе нужный метод ListView. Для удобства ссылки на виды (нужного типа) можно запомнить в переменных MainFrame при создании клиента. -------------------- ... |
|||
|
||||
| Zolex |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 24.10.2006 Репутация: нет Всего: нет |
Спасибо, понял все, за исключением как SELCHANGED поставить в MainFraim. Не могли бы по-подробнее объяснить? До этого я пользовался ClassWizard для впихивания этого кода в программу....
|
|||
|
||||
| Kostt |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 169 Регистрация: 8.1.2006 Где: Томск Репутация: 2 Всего: 3 |
Просто создай в родителе метод и вызывай его по событию OnSelChanged.
Указатель на родителя можно получить функцией CWnd GetParent() |
|||
|
||||
| Earnest |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Все просто.
Хотя в случае сплиттера, родителем вложенных видов является именно он, но он пересылает все команды и уведомления своему родителю, т.е. рамке. В классе CMainFrame добавляем обработчик:
Еще одно замечание: идентификатор вида, вложенного в сплиттер, равен IdFromRowCol(row, col). Эта функция, к сожалению, не является статической, хотя вполне могла бы быть. Поэтому нельзя определить статическую константу IDC_MYTREE = IdFromRowCol (row, col). Но можно просто списать слова (вряд ли они изменяться в ближайшие сто лет):
(вместо row, col подставь соответствующие значения). -------------------- ... |
||||
|
|||||
| xTr1m |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: нет Всего: 1 |
Есть еще один способ, правда не знаю на сколько грамотный. В CTreeView ловишь, когда меняется элемент и пишешь что-то вроде
[code=cpp] CTestDoc *pDoc = (CTestDoc*)GetDocument(); pDoc->UpdateAllView(NULL, REFRESH_SECOND_VIEW,
REFRESH_SECOND_VIEW объявляешь в документе
ну и во втором виде переопределяешь функцию OnUpdate()
Суть, наверное, понятно, но все же объясню. После того, как ты поменял элемент в дереве документ посылает все видам OnUpdate с командой REFRESH_SECOND_VIEW. Второй вид принимает этот Update смотрит, что команда совпадает и делает что нужно. Строчка
Это мы передаем все что угодно (структуру, переменную и т.д) и потом ловим это из pHint |
||||||||
|
|||||||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Можно и так, если оба вида принадлежат одному документу и он вообще есть...
-------------------- ... |
|||
|
||||
| Zolex |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 24.10.2006 Репутация: нет Всего: нет |
Огромное всем спасибо за ответы.
В итоге я всех запутал и запутался сам. Но тем не менее, разобрался и сделал по-другому, но опять уперся в стену. Итак с самого начала было так (не так безоблачно, как я описал в начале). В MainFrm в функции OnCreateClient вызываeтся функция класса CMySplitter, которая заведует делением окна. При этом создаются виды CmyView (от СView) и CMyListView (отCListView). В CMyView далее вызывает функции класса CMyTree, который заведует созданием дерева в CMyView. Дерево создается опять же в новом окне, наложенным поверх CMyView. Теперь с СMyTree в обработчике OnSelChanged я делаю следующее :
Ура, все работает отлично, там в AddItems передаются еще кой какие параметры, сейчас не в этом суть. Теперь по оконцовке нам надо перерисовать все виды, дабы заполненный список отобразился. Вот в функции AddItems я пишу в конце :
И все, программа вылетает, на строчке pDoc->UpdateAllViews(NULL); Причем, если тоже сделать в OnDraw, все работает:
Ну это я так, себя проверял. Так вот подскажите кто нибудь, где мне апдэйтить виды? Заранее БОЛЬШОЕ человеческое Спасибо. |
||||||
|
|||||||
| xTr1m |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: нет Всего: 1 |
AddItems эта функция какого класса? Проверь pDoc наверняка он NULL или 0xcececece
pDoc->UpdateAllViews(NULL, REDRAW) нужно писать в функции OnSelchanged вида дерева Если не получится, то отправь мне на мыло свой прект, посмотрю |
|||
|
||||
| Zolex |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 24.10.2006 Репутация: нет Всего: нет |
AddItems - это ф-ция CMyListView
|
|||
|
||||
| Zolex |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 24.10.2006 Репутация: нет Всего: нет |
Вообщем, Все!
Огромное всем спасибо еще раз. В итоге сделал через UpdateView. На OnSelChanged получаю документ, записываю туда переменную и апдэйчу виды. А в CListView OnUpdate читаю из документа переменную и заполняю список... Оказалось все довольно просто. Еще раз убеждаюсь, запрограммировать можно все, главное понять как. |
|||
|
||||
| xTr1m |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: нет Всего: 1 |
Ну можно безусловно и так. Обращайся
|
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |