Вопрос № 58655: Здравствуйте, уважаемые эксперты.
Пишу в эту рассылку и в СС++
Есть окно (диалог), при инициализации создаю в нем несколько дочерних кнопок.
1) Как заставить дочерние button`ы отсылать сообщения родительскому окну, от том что на нее - кн...
Вопрос № 58.655
Здравствуйте, уважаемые эксперты.
Пишу в эту рассылку и в СС++
Есть окно (диалог), при инициализации создаю в нем несколько дочерних кнопок.
1) Как заставить дочерние button`ы отсылать сообщения родительскому окну, от том что на нее - кнопку - навели мышь, увели мышь, левой (правой) кнопкой мыши щелкнули по button`у.
Нужно сделать чтобы родительское окно (диалог), могло обрабатывать сообщения от дочерних button`ов. Какие сообщения дожно отрабатывать родительское окно (диалог)?
2) Как зная ID кнопки, заставить ее сменить цвет с умолчательного на желты(любой другой) и обратно.
Пожалуйста приведите примеры.
Пишу под Windows на VC7
Отправлен: 12.10.2006, 12:41
Вопрос задал: Zeitgeist (статус: 1-ый класс)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 2)
Отвечает: Sergey A. Wedensky
Здравствуйте, Zeitgeist!
1) Сообщение о нажатии кнопки приходит родительскому окну в виде
WM_COMMAND с WPARAM = MAKELONG(BN_CLICKED, идентификатор_кнопки).
Получить уведомления о наведении и пр. Вам так просто не удастся.
Обычно переопределение поведения контролов осуществляется с помощью
субклассинга (см. MSDN, напр. 'Safe Subclassing in Win32' и далее по
ссылкам), т.е. наследования оконной процедуры.
Можно, правда, обрабатывать WM_SETCURSOR (оно приходит родительскому
диалогу даже при движении мыши по дочерним контролам).
2) Заменить цвет фона (и не только) контрола можно обрабатывая WM_CTLCOLORXXX. Для
кнопки это будет WM_CTLCOLORBTN:
WPARAM = DC (контекст окна), которому Вы можете, например, установить
цвет для вывода текста (SetTextColor) и пр.
LPARAM = HWND кнопки.
Вернуть Вы должны HBRUSH - handle кисти, которой будет
отрисовываться фон кнопки.
Но если Вы хотите переопределить вид и поведение стандартных элементов управления
(сделать их активными, реагирующими на наведение/отведение мыши,
нестандартно отрисовывающимися и т.д.), советую все-же
поинтересоваться subclassing'ом.
Ответ отправил: Sergey A. Wedensky (статус: 5-ый класс)
Ответ отправлен: 12.10.2006, 13:07
Отвечает: Melamed
Здравствуйте, Zeitgeist!
Чтобы отсылать сообщение родительскому окну, когда на кнопку навели мышь, необходимо
написать потомок от класса CButton. Он должен обрабатывать событие WM_MOUSEMOVE.
Чтобы отловить событие увода вможно либо захватить мышь, и отслеживать увод курсора мыши
с кнопки, не забыв при первом уводе курсора мыши послать сообщение к родите
83;ьскому окну и отменит захват мыши, либо использовать таймер. Так как я стороник первого
способа, то в приложении приведе пример реализации этого способа.
При реализации обеих способов надо обработать пользовательские события UM_MOUSEENTRY и UM_MOUSELEAVE. Обработчики
этих сообщений присоединяются в карте сообщений с помощью макроса ON_MESSAGE
Приложение:
Ответ отправил: Melamed (статус: 6-ой класс)
Ответ отправлен: 12.10.2006, 14:17