| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Как правильно послать сообщение контролу |
| Автор: triclosan 18.10.2008, 16:00 | ||
| Хочу программно послать сообщение CBN_SELCHANGE CComboBox-у MSDN говорит делать так:
но эффекта не наблюдаю |
| Автор: BorisVorontsov 18.10.2008, 21:24 | ||
CBN_SELCHANGE -- уведомление, которое шлёт элемент управления родительскому окну, а не наоборот. Иначе говоря -- уведомление есть событие, а ты отсылаешь событие элементу, который генерирует это событие.
|
| Автор: triclosan 18.10.2008, 22:23 |
| Проблема моя вот в чем - есть функция, которая ловит сообщение CBN_SELCHANGE и делает определенные действия. Если трогать контрол руками все ок, но вот беда - метод SetCurSel данное сообщение не посылает. В принципе я вызываю эту функцию явно, работает, но я не уверен, что это корректно. К тому же для данной функции без параметров это работает, а как быть если функция нотификатор принимает параметры. |
| Автор: Earnest 20.10.2008, 14:03 |
Параметры уведомления четко прописаны (они есть всегда), но ничего интересного для тебя там нет. Все обработчики уведомлений типа WM_COMMAND в MFC не имеют параметров. |
| Автор: triclosan 21.10.2008, 11:27 | ||
Угу, с 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 |
| спасибо за ликбез |