Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как взаимодействуют CTreeView и CMyView 
V
    Опции темы
RastaDja
Дата 23.3.2011, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



Доброго времени суток!
Есть окно типа Explorer. В нем два контрола дерево и окошко вывода.
Сообщения от дерева ловлю в классе окна дерева CTreeView
Код

BEGIN_MESSAGE_MAP(CLeftView, CTreeView)
    ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnTvnSelchangedCfgTree)
END_MESSAGE_MAP()


void CLeftView::OnTvnSelchangedCfgTree(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
    HTREEITEM item = pNMTreeView->itemNew.hItem;
    CString str2 = m_Tree->GetItemText(item);
    *pResult = 0;
}

В правом окне рисую с помощю
Код

BEGIN_MESSAGE_MAP(CMyView, CListView)
    //...
    ON_WM_PAINT()
END_MESSAGE_MAP()
void CMyView::OnPaint()
{
    CPaintDC dc(this);
    dc.TextOut(20,20,_T("текст"));
}


Как мне связать эти окна? (Тоесть как я могу получить данные из дерева и передать их в другой класс. Думал завести глобальные переменные, но где их обьявить? Или может как-то правильно ловить сообщения)
Спассибо.


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
RastaDja
Дата 23.3.2011, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



Так  никто и не ответил... smile .
Пришлось бить в бубен самому:
1. В CMyDoc сделал следующее:
Код

class CMyDoc : public CDocument
{
//...
public:
    void SetTreeText(CString szText){m_szTreeText=szText;} //это функции для передачи параметра между контролами
    CString GetTreeText(){ return m_szTreeText;}
//...
protected:
    CString m_szTreeText;       // а это, собственно, наш параметр
//...
}


2. В CTreeView классе надо поймать сообщение юзания нужного пункта в дереве (как я это делал написано выше - в вопросе), и сделать обновление для всех контролов (можно и не для всех (а только для нужного вам), но для всех проще), предварительно передав параметр
Код

void CLeftView::OnTvnSelchangedCfgTree(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
    HTREEITEM item = pNMTreeView->itemNew.hItem;
    CString str = m_Tree->GetItemText(item);
    GetDocument()->SetTreeText(str);            // тут мы передадим наш параметр
    GetDocument()->UpdateAllViews(this);     // а тут скажем обновить все контролы
    *pResult = 0;
}


3. Последний шаг. В CMyView обработаем сообщение OnUpdate.
Код

void CMyView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
{
    CString szText=GetDocument()->GetTreeText();
    GetListCtrl().DeleteAllItems();
    GetListCtrl().InsertItem( 0, szText, 0); // добавляем в список данные
}


Собственно так. Но вот хочу спросить. Есть ли какой-то попроще способ, чтоб не передавать через параметры, ведь если этих параметров будет много, то не очень хочется возится с большим числом переменных или масивами.
Спасибо!

Это сообщение отредактировал(а) RastaDja - 23.3.2011, 15:58


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
Albor
Дата 23.3.2011, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Сообщение от дерева можно ловить и в документе и во фрейме. Определи в документе (а не в виде) обработчик и получай данные сразу в документ.
PM MAIL ICQ   Вверх
RastaDja
Дата 24.3.2011, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



Цитата(Albor @  23.3.2011,  16:35 Найти цитируемый пост)
Определи в документе (а не в виде) обработчик и получай данные сразу в документ. 

Подскажите как это сделать (в MFC раньше не работал)


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
Albor
Дата 24.3.2011, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Цитата(RastaDja @  24.3.2011,  10:29 Найти цитируемый пост)
Подскажите как это сделать (в MFC раньше не работал)

Посмотри как данный обработчик прописался в  класс CLeftView. В хеадере есть строка, начинается с afx и заканчивается именем функции обработчика, в срр- файле должна быть запись в карте сообщений (BEGIN_MESSAGE_MAP...END_MESSAGE_MAP()) и определение функции. Обработчик из CLeftView удали.
PM MAIL ICQ   Вверх
RastaDja
Дата 28.3.2011, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: нет
Всего: 5



Спасибо. Разобрался.
разница в том, что сообщение другое надо ловить.
Код

ON_NOTIFY(TVN_SELCHANGED, AFX_IDW_PANE_FIRST, OnTreeItemSelChanged)

где AFX_IDW_PANE_FIRST - это наше дерево (константа для этого типа приложения).


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0526 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.