Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Работа с сообщениями  (Прочитано 34509 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Postum
Гость
« : 12-01-2005 18:26 » 

Есть необходимость обрабатывать сообщение, принадлежащее одному классу (например, производному от CTreeView) в другом классе (например, производному от CListView).
Можно ли это сделать напрямую? Как вообще правильно реализовать подобный механизм передачи управления? Если для этого необходимо создавать и обрабатывать собственные сообщения, то просьба подсказать информацию по этой теме.
Спасибо.
Записан
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #1 : 14-01-2005 10:47 » 

1) Теоретически ты должен переписать в CTreeView Претр и там сказать, что если приходит это сообшение, то его надо послать классу CListView
2) Во всяком случае ты можешь всегда отправить свои сообщения :
   а) в классе, производном от  CTreeView, пишешь (в .h )
        #define   WM_GOODBYE   (WM_USER + 5)
         здесь WM_USER - стандартная константа в Windows для создания
                         собственных сообшений
         5 - произвольное число
   б) в классе, производном от  CListView, пишешь (в .h ) после раздела AFX_MSG

protected:
   //{{AFX_MSG(...)
            .... - тут могут стоять стандартные сообшения
   //}}AFX_MSG

   //************
   afx_msg LRESULT OnGoodbye(WPARAM wParam , LPARAM lParam);   
   //************

   DECLARE_MESSAGE_MAP()
       
        OnGoodbye – HandlerName (ти задаешь его сам)

     в)  в классе, производном от  CListView, пишешь (в .cpp  ) в разделе
        BEGIN_MESSAGE_MAP - END_MESSAGE_MAP

         BEGIN_MESSAGE_MAP(CNonmod_diaView, CView)
   //{{AFX_MSG_MAP(...)
   
   //*********
   ON_MESSAGE(WM_GOODBYE , OnGoodbye)
   //*********
   
   //}}AFX_MSG_MAP
        END_MESSAGE_MAP()

   В б) и в) очень важно место написания !

      А затем определяешь в коде где-то функцию
         LRESULT твой_CListView::OnGoodbye(WPARAM wParam , LPARAM lParam)
         {...}

     г) в классе, производном от  CListView, пишешь там, где надо послать сообщение :
         pointer_класс_производный_от_CTreeView->SendMessage(WM_GOODBYE , twoe_soobshenie)
                   ili:
::SendMessage(hwnd_класс_производный_от_CListView, WM_GOODBYE , twoe_soobshenie)

Если надо, могу прислатъ примерчик
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #2 : 14-01-2005 11:19 » 

не совсем понял "сообщение, принадлежащее одному классу"? Как может сообщение классу принадлежать? Пожалуйста поподребнее, что ты имеешь ввиду.

Свои сообщения отправлять можено для этого необходимо определить "своё" сообщение
это как правило 32битное число. Область разрешённая для пользователя начинается с WM_USER

#define MY_FIRST_MESSAGE WM_USER+1

сихронная отправка сообщения (будет ожидаться выход из SendMesage) окну с хендлом hwnd:
DWORD dw1 = 1;
DWORD dw2 = 2;
::SendMessage(MY_FIRST_MESSAGE, (WPARAM)dw1, (LPARAM)dw2);
в (WPARAM)dw1, (LPARAM)dw2 необходимые для передачи данные, могут быть 0.

для асинхронной передачи используется
::PostMessage(MY_FIRST_MESSAGE, (WPARAM)dw1, (LPARAM)dw2);
в этом случае ожидания выхода из обработчика не происходит и процесс (или thread)
продолжается.

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Postum
Гость
« Ответ #3 : 14-01-2005 14:31 » 

не совсем понял "сообщение, принадлежащее одному классу"? Как может сообщение классу принадлежать? Пожалуйста поподребнее, что ты имеешь ввиду.

Я имею ввиду следующее. Сообщение генерируется окном. Окно является экземпляром того или иного класса. Как обработать это сообщение внутри класса окна я знаю. Надо пойти в Class Wizard, зажечь галочку, в *.cpp файл класса добавится функция и т.д. Как это сделать где-либо вне класса окна я не знаю.

Задача: в проекте типа Explorer (СTreeView, CListView) в зависимости от выбора пользователем того или иного узла TreeView менять содержимое ListView.
Записан
Postum
Гость
« Ответ #4 : 14-01-2005 14:48 » 

Malaja, Джон
Спасибо за код. С пользовательскими сообщениями более или менее понятно, кроме одного, как получить hwnd от CListView?
Записан
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #5 : 14-01-2005 16:18 » 

Postum,

Если ты создаешь оба окна CTreeView и CListView из твоего основного View - класса, то можешь при создании передавать им как параметр указатель на этот View - класс, а в своих  CTreeView и CListView  сделать дополнительные конструкторы для этого. Кроме того, сделай в этом View - классе функции getTreeViewWnd и getListViewWnd, с помощью которых ты сможешь извне получать эти поинтеры.
Т.е. перед отправлением сообщения делаешь :

         CTreeView* p = m_pMyMainView->getTreeViewWnd();

а потом :

         p->SendMessage(WM_GOODBYE , twoe_soobshenie)
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 14-01-2005 16:44 » 

Postum, ну... дык эт вообщето нехилая теория. ТУт без полбанки не разберёшься.
Если хочешь в сообщениях винды разобраться то нужно с API начинать, MFC конечно хорошо, но всю поднаготную скрывает. Дело в том, что MFC сама "распределяет" сообщения между окнами. В общем за пару минут не объяснишь. Придётся за учебники взятся, а потом с вопросами разберёмся. Хотя силных сложностей там нету.

Если у тебя MFC то делай как Malaja говорит. А получить хендл любого производного от CWnd окна можно так:

HWND hwnd = m_pMyListCtrl->GetSafeHwnd();

зы. Malaja поздравляю с "русским" (может с опозданием, "давненько я тут не бывал" )
Как решилось всё? Неуж-то враги разрешили русскую клаву поставить? Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #7 : 14-01-2005 16:58 » 

Джон,

Спасибочки за сочувствие и поддержку!!!  Жжешь
ага, они прямо разогнались!  Отлично
Мне Сережа (спасибо ему большое) подсказал страничку http://www.translit.ru! И теперь я всем врагам назло пишу по-русски (правда иногда в спешке не те буквы ввожу, а проверять некогда - наблюдатель же все время пытается ситуацию контролировать, хотя у самого работы ведь до чертиков!!!  :?)

Так что теперь даже самой приятно!   Ха-ха-ха
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #8 : 14-01-2005 17:04 » 

Postum,  сорри, вот почему-то только ща заметил задачу. Вообще-то "красиво" её можно решить другим способом, раз уж у тебя MFC и Document/View архитектура надо её задействовать, используя как связующее звено CDocument. У каждого View есть доступ к нему

Сценарий:  Изменения происходят в Tree  ( Для List всё делается точно так же только наоборот)

1. Определяем изменение в Трее (напр сменили узел)
2. Информируем документ об этом ()
GetDocument()->ВызовФункции для фиксирования изменения данных (все данные в ДОС!!!)
3. Говорим доку -  апдейтни все View кроме меня
GetDocument()->UpdateAllViews(this);

В List классе надо переписать ф-ю OnUpdate() в которй например потребовать от документа состояние изменившегося в п. 2. объекта

Например если лист показвает инфу объекта CMyFolder, то типа:

in CMyFirstExplorerDoc :public CDocument
.....

CMyFolder *m_pActiveFolder;

void SetActiveFolder(CMyFolder *pActiveFolder)
{
m_pActiveFolder = pActiveFolder;
}

CMyFolder *GetActiveFolder() { return  m_pActiveFolder; }


Тогда
где-нить в CMyFirstExplorerTreeView::OnChange()

GetDocument()->SetActiveFoldewr(GetTreeCtrl().GetSelItem()->GetItemData())
GetDocument()->UpdateAllViews(this);

ну и соответственно в CMyFirstExplorerListView::OnUpdate()
MyFillList( GetDocument()->GetActiveFolder() );

Код не прогонял - синтаксические ошибки возможны. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 14-01-2005 17:06 » 

Malaja, Может тебе подарить руско-немецкую клаву? у меня где-то в келлере завалялась.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Postum
Гость
« Ответ #10 : 14-01-2005 18:55 » 

Джон, не понял вызова
SetActiveFoldewr(GetTreeCtrl().GetSelItem()->GetItemData())

объекты CMyFolder и CTreeCtrl - разные
Записан
Postum
Гость
« Ответ #11 : 14-01-2005 19:24 » 

Malaja,

Я этот проект создал Wizard'ом, и хоть убей не могу понять, где создаются окна CTreeView и CListView и какой "основной" View
« Последнее редактирование: 20-12-2007 19:40 от Алексей1153++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 15-01-2005 22:25 » 

Postum, в визарде на самом последнем шаге предлагается уточнить класс view - вверху выбираешь вью, внизу имеется список с классами, производными от вью
Записан

Postum
Гость
« Ответ #13 : 17-01-2005 05:43 » 

Postum, в визарде на самом последнем шаге предлагается уточнить класс view - вверху выбираешь вью, внизу имеется список с классами, производными от вью
это я знаю
Записан
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #14 : 17-01-2005 08:25 » 

Ребята - во-первых, извините, что не отвечала, просто болею я.  Жаль

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

Postum,
если ты создавал все в визарде, то у тебя вообше изначално толко один класс типа View, а остальные ты создал потом ручками, или это не так? Если нет - обЪясни в 2 словах, что ты создавал, тогда я смогу это воспроизвести.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Postum
Гость
« Ответ #15 : 17-01-2005 11:12 » 

Malaja,
проект был создан в Microsoft Visual C++ 6.0 при помощи MFC AppWizard (exe). Тип приложения: Single document. На шаге 5 из 6 визарда стиль проекта установлен: Windows Explorer.
Визард создал следующие классы: СTreeView, CFrameWnd, CWinApp, CDocument, CListView.
Записан
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #16 : 17-01-2005 12:15 » 

Постум,

извини, я думала, что ты обычный проект создал.
В этом случае у тебя нет общего View, посему тебе удобней всего делать либо по схеме, данной Джоном, либо оставаться при моей, но в этом случае поинтеры на оба View держать не в общем View, а в CDocument.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #17 : 17-01-2005 12:50 » 

Джон, не понял вызова
SetActiveFoldewr(GetTreeCtrl().GetSelItem()->GetItemData())

объекты CMyFolder и CTreeCtrl - разные

Беда в том, что Tree просто контролл. А как связать контролл с данными? Для этого у каждого элемента дерева
(item) есть поле data - 32 битное число, в которое обычно записывают указатель на объект.

CMyObject *pMyObj = new CMyObject();
....
инициаллизация объекта

HTREEITEM hti = GetTreeCtrl().InsertItem(pMyObj->GetTitle(),0,0,TVI_ROOT);
GetTreeCtrl().SetItemData(hti,(DWORD_PTR)pMyObj);


.....

Потом в любом месте можно получить этот указатель
HTREEITEM hti = GetTreeCtrl().GetSelectedItem();
CMyObject *pMyObjfromTREE = (CMyObject*) (GetTreeCtrl().GetItemData(hti));

В данном примере, если например ф-я SetActiveFolder получает в качестве параметра указатель на CMyObject
то

void SetActiveFolder(CMyObject *pObj);

то вызов её в CMyTreeView может выглядеть след образом:

GetDocument()->SetActiveFolder( (CMyObject*)(GetTreeCtrl().GetItemData(hti)) );

Так же функционирует это и для CListCtrl.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Postum
Гость
« Ответ #18 : 17-01-2005 13:41 » 

Джон,

что в данном случае называется объектом? Допустим, мне надо в ListView динамически создавать какие-то контролы (диалоги) в зависимости от состояния TreeView. Получается, что все это я должен делать в CDocument?
Записан
Postum
Гость
« Ответ #19 : 17-01-2005 13:53 » 

Malaja,

оба View создаются через сплиттер функцией CreateView, я не могу понять как использовать пойнтеры в твоей схеме
Записан
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #20 : 17-01-2005 14:27 » 

Люди,

кто навскидку помнит, как из CMainFrame вызвать CDocument?
Поинтеры на оба View уже есть в CMainFrame, их надо перегнать в CDocument.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #21 : 17-01-2005 19:48 » 

в конструкторе документа заполнить (извиняюсь Улыбаюсь ) член-переменную m_pMyDoc , имеющую тип указателя на документ и расположенную в theApp
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #22 : 17-01-2005 20:09 » 

class CGuard2Doc;
class CGuard2App : public CWinApp
{
public:

CGuard2Doc* m_pMyDoc;
...
...
}


extern CGuard2App theApp;
 
CGuard2Doc::CGuard2Doc()
{

   theApp.m_pMyDoc=this;
}
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #23 : 18-01-2005 08:43 » 

Алеша,

спасибочки! Мне почему-то казалось, что там где-то еще какие-то апи - функции для этого были. Короче, старость и маразм - не радость. Ага

Постум,

я сделала маленький примерчик, где этот механизм (с сообшениями) работает, посему если хочешь - кину тебе на мыло.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Postum
Гость
« Ответ #24 : 18-01-2005 08:45 » 

Malaja,

да, спасибо, с удовольствием посмотрю.

ящик:                     mail_al at hotbox dot ru
« Последнее редактирование: 18-01-2005 09:00 от Postum » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #25 : 18-01-2005 10:10 » 

Postum, ListCtrl уже сам по-себе есть контролл, и как ты в нём диалоги показывать собираешься не пойму?
CListView - просто "овъювизированный" контролл, и если посмотреть его ф-ции, то их будет всего одна! - GetListCtrl(), то же самое и с деревом. Проще говоря - CListView это большой контролл растянутый до размеров клиентской области MDI или SDI приложения.
Под объектом в данном случае понимается объект структуры данных. Например ты хочешь показать некую базу данных представляющую собой дерево, каждый узел этого дерева содержит собственную информацию (например Имя возраст и тп) плюс список объектов такого же типа. Ессно, отображаем для удобства навигации слева только узлы в виде дерева, а справа в списке показываем  столбики с Именем ВОзрастом и тд
Списку необходимо передать инфу о том, поля какого объекта необходимо показать. Таким образом передаём указатель на узел выбранный в дереве.
В случае с Explorer это может быть инфа о папке содержимое которой необходимо отобразить в правой часть и тд и тп
Если тебе необходимо сменять диалоги или контроллы, то лучше тогда справа выбрать не CLIstView, а CFormView, который представляет собой диалог "растягиваемый" до размеров клиентской области.
Тогда передаваемый объект может содержать в себе инфу, о том какой контролл или диалог должен быть отображён. Всё зависит от конкретной задачи.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #26 : 18-01-2005 10:37 » 

Кстати, упустил из вида, въюхи можно так же получить с помощъю функций сплитера

m_wndSpliter.GetPane(0,0)  - левой въю при вертикальном разделении;
m_wndSpliter.GetPane(0,1) - правый

Сплитер - дочерний объект или CMainFrame или CChildFrame в зависимости от типа приложения SDI,  MDI.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Postum
Гость
« Ответ #27 : 19-01-2005 06:38 » 

Malaja,

спасибо за пример, разобрался с задачей
Записан
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #28 : 19-01-2005 08:08 » 

Постум,

во-первых, рада, что тебе это помогло.
Второе - у меня вчера было немного времени (пока начальство мысли по проекту рожало  Отлично ), посему я попробовала сделать так, как сказал Джон - примерчик  работает, посему если хочешь - кину тебе и его на мыло.    Ха-ха-ха Из 2-х возможностей решения задачи всегда легче выбирать, чем из 1-й.
Джон - спасибо за очередную порцию знаний!  Ага
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #29 : 13-03-2005 13:58 » 

Malaja кидай Улыбаюсь
посмотрю - век живу век учусь


и при чём тут старость? Улыбаюсь это у тебя-то старость??? да ну брось ерунду молоть Улыбаюсь)
« Последнее редактирование: 13-03-2005 14:03 от Алексей1153 » Записан

Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines