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


Автор: triclosan 18.10.2008, 16:00
Хочу программно послать сообщение CBN_SELCHANGE CComboBox-у

MSDN говорит делать так:
Код

SendDlgItemMessage(IDC_COMBO1,CBN_SELCHANGE);

но эффекта не наблюдаю  smile 

Автор: BorisVorontsov 18.10.2008, 21:24
CBN_SELCHANGE -- уведомление, которое шлёт элемент управления родительскому окну, а не наоборот. Иначе говоря -- уведомление есть событие, а ты отсылаешь событие элементу, который генерирует это событие.

Цитата(MSDN)

The CBN_SELCHANGE notification message is sent when the user changes the current selection in the list box of a combo box. 

Автор: triclosan 18.10.2008, 22:23
 smile спасибо.

Проблема моя вот в чем - есть функция, которая ловит сообщение CBN_SELCHANGE и делает определенные действия. Если трогать контрол руками все ок, но вот беда - метод SetCurSel данное сообщение не посылает. В принципе я вызываю эту функцию явно, работает, но я не уверен, что это корректно. К тому же для данной функции без параметров это работает, а как быть если функция нотификатор принимает параметры.

Автор: BorisVorontsov 19.10.2008, 13:07
Цитата(triclosan @  18.10.2008,  22:23 Найти цитируемый пост)
В принципе я вызываю эту функцию явно, работает, но я не уверен, что это корректно.


Функцию -- обработчик события? Если да, то вполне корректно.

Автор: Earnest 20.10.2008, 14:03
Цитата(triclosan @  18.10.2008,  23:23 Найти цитируемый пост)
а как быть если функция нотификатор принимает параметры. 

Параметры уведомления четко прописаны (они есть всегда), но ничего интересного для тебя там нет. Все обработчики уведомлений типа WM_COMMAND в MFC не имеют параметров.

Автор: triclosan 21.10.2008, 11:27
Цитата(Earnest @  20.10.2008,  14:03 Найти цитируемый пост)
Все обработчики уведомлений типа WM_COMMAND в MFC не имеют параметров. 

Угу, с WM_COMMAND проясняется.

А позвольте еще для развития кругозора поинтересоваться, например, задача программно выделить N-ый элемент CListCtrl'а путем посылки соотвествующего сообщения LVN_ITEMACTIVATE, соответствующая функция обработчик явно принимает параметры  fn(NMHDR *pNMHDR, LRESULT *pResult), например есть у меня уже реализация обработчика и неохота писать дополнительную функциональность? 



Автор: Earnest 21.10.2008, 16:50
LVN_ITEMACTIVATE это не сообщение, а уведомление. Не ты его посылаешь, чтобы выделить итем, а наоборот, контрол таким оброзом сообщает, что ему выделили итем. Это раз.
Второе: есть два вида контролов: "старые" и "новые". Старые посылают уведомления родителю в виде WM_COMMAND и фактически без параметров (т.е. параметры есть, но они ничего не добавляют к коду уведомления). Новые посылают уведомление в виде WM_NOTIFY с параметром NMHDR или его производными, зависящими от вида контрола и уведомления. Эти два вида уведомлений никогда не смешиваются. Т.е. контрол посылает либо WM_COMMAND, либо WM_NOTIFY. WM_NOTIFY посылают контролы, называемые common controls: list view, tree view, etc. За некоторыми исключениями. Например, RichEdit, хотя вроде бы является common control (по крайней мере, появился одновременно и живет вместе), но посылает WM_COMMAND -видимо, для совместимости с "просто эдит". В общем, в MSDN для каждого контрола написано, как он уведомляет парента о своих изменениях. 

Автор: triclosan 22.10.2008, 12:02
спасибо за ликбез

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