Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Отправка и прием сообщений


Автор: mishka20 29.4.2009, 22:15
Я создал не стандартный элемент, на базе класса, унаследованного от CWnd. Мой элемент содержит 16 кнопок. Припомощи функции Create разместил его в главном окне. Мне нужно, чтобы при нажатии на одну из кнопок элемента, от него посылалось сообщение главному окну.

Пишу в функции обработчика одной из кнопок:

      
Код

 AfxGetMainWnd()->PostMessage(BN_CLICKED, 0, 0);


Для класса главного окна создал карту сообщений:


Код

       BEGIN_MESSAGE_MAP()
                    ON_CONTROL(BN_CLICKED, <ID_моего_элемента>, <обработчик>)
       END_MESSAGE_MAP()


Это почему-то не работает.... Что не так? Подкажите...

Автор: Albor 30.4.2009, 13:45
AfxGetMainWnd - это родительское окно. Это оно посылает сообщение а не контрол.
может вот так из контрола:
Код

::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), BN_CLICKED,0,0);

Автор: mishka20 30.4.2009, 22:16
Не Помогло.... =((((

Люди, ну как из нестандартного элемента, дочернего от CWnd, отправить сообщение в родительское окно и принятьего там????  Можно в общих чертах объснить... Я уже мозг сломал.  smile 
Мжет быть надо в параметры lParam и wParam что-нибудь вписать? Или может от конкретных элементов должны исходить конкретные сообщения и деть так как я делаю нелзя? Как тогда надо?

Автор: Albor 1.5.2009, 09:50
Цитата(mishka20 @  30.4.2009,  22:16 Найти цитируемый пост)
Мжет быть надо в параметры lParam и wParam что-нибудь вписать? 

В чём проблема? Поставь, испытай. wParam в младшем слове должен содержать ID контрола. Можно  воспользоваться утилитой Spy, просмотрев где теряется данное сообщение, с какими параметрами оно поступает и т.д.

Автор: mishka20 1.5.2009, 20:45
Вписал ID контрола. Утилита, как я понял, только системные сообщения показывает. Снова ступор.... ((

Автор: Earnest 4.5.2009, 09:39
 smile 
Послать нужно сообщение, а BN_CLICKED - это код уведомления, причем, кажется равный нулю. Ну и что ты посылаешь? Нечто вроде телепатического сигнала. Хоть попробуй разобраться, что и как происходит в системе.
Посылать нужно команду: WM_COMMAND, с кодом уведомления BN_CLICKED. Как сформировать сообщение - сам разбирайся с помощью MSDN, крепче запомнишь. Обработчик в карте сообщений у тебя правильный, но можно короче: ON_BN_CLICKED или вообще ON_COMMAND.

Стандартный, нестандартный контрол - глубоко фиолетово, принцип общий. Лучше всего прочитать в MSDN техническую статью про прохождение сообщений и диспетчеризацию команд. Кроме того, на rsdn вроде была хорошая статья на русском об этом. Когда в голове на эту тему проясниться, все станет просто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)