![]() |
|
![]() ![]() ![]() |
|
vadimled |
|
|||
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 30.5.2006 Репутация: нет Всего: нет |
Цель проста: текст в ComboBox должен быть разных цветов.
Я создал класс-наследник CComboBox, написал метод DrawItem, поставил стиль контроля OwnerDrawFixed. При щелчке на ComboBox компилятор выдает ошибку: "Unhandled exception at 0x7c901230 in Misrad.exe: User breakpoint." Что я не так делаю? Каким образом мой новый класс от CComboBox должен быть связан именно с нужным мне контролем? Ведь у меня десяток ComboBoxов на панели диалога. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Чтобы связать класс и контрол, нужно поставить соответствующий DDX_Control в DoDataExchange панели диалога.
При этом предполагается, что в диалоге есть переменная твоего класса. -------------------- ... |
|||
|
||||
vadimled |
|
|||
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 30.5.2006 Репутация: нет Всего: нет |
Да! Связалось и что-то даже заработало.Однако,не так как надо.
Как сделать чтобы текст менял цвет после щелчка мыши на айтем и сохранял его в самом едите? |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Чтобы менять цвет текста в контроле, нужно обрабатывать сообщение WM_CTLCOLOR, т.е. ставить обработчик ON_WM_CTLCOLOR в родительском диалоге, либо ON_WM_CTLCOLOR_REFLECT в самом контроле, как удобнее.
Ловишь щелчок мыши, ставишь внутренний флажок, делаешь Invalidate, в OnCtlColor в зависимости от флага задаешь цвет... Добавлено @ 11:40 Перечитав первый пост, засомневалась, это ли тебе надо. Разный цвет в комбобоксе - это как? Каждая строка в списке своего цвета? Тогда нужно делать OwnerDraw, и забудь про WM_CTLCOLOR... -------------------- ... |
|||
|
||||
vadimled |
|
|||
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 30.5.2006 Репутация: нет Всего: нет |
Нет,все правильно. Ответ - в тему. Ща поиграюсь
|
|||
|
||||
vadimled |
|
|||
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 30.5.2006 Репутация: нет Всего: нет |
Проблема.Цвет меняеться у всех контролей на диалоге.
Пишу так:
И где ставиться Invalidate я не понимаю. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
У всех меняешь, вот и меняется.
Нужно добавить проверку:
А еще лучще, если у тебя свой класс CComboBox определен, сделай в нем ON_WM_CTLCOLOR_REFLECT. И флаг в нем же храни и устанавливай. Тогда поведение будет инкапсулировано. -------------------- ... |
|||
|
||||
vadimled |
|
||||
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 30.5.2006 Репутация: нет Всего: нет |
Я так понимаю,что строка
делает не нужной проверку
Кстати она ничего и не дала. Не понимаю.Ведь pWnd содержит указатель на мой конкретный контроль! Как же все остальные могут реагировать? |
||||
|
|||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
нет
OnCtlColor приходи для каждого контрола. Конечно, если ты сначала напишешь pWnd = GetDlgItem(IDC_COMBO_MY); а потом будешь спрашивать ид-р, получится ерунда. Спрашивать надо у pWnd, которое пришло в параметрах сообщения. -------------------- ... |
|||
|
||||
vadimled |
|
||||
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 30.5.2006 Репутация: нет Всего: нет |
Сделал как ты сказала. Написал так:
Текст цвет не меняет и вобще никакой реакции |
||||
|
|||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
1) Если цвет менялся при наличии обработчика в диалоге, то и здесь должен. Проверь, попадаешь ли ты в обработчик.
2) Как ты полагаешь, много смысла возвращать автоматический объект, который тут же разрушается? Это про кисть. 3) Параметром функции SetBkMode является вовсе не цвет -------------------- ... |
|||
|
||||
vadimled |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 30.5.2006 Репутация: нет Всего: нет |
Объясни пожалуйста что это значит
и где это проверить. Переписал так:
А вот
возвращает почему-то 0. Может из-за этого проблема. |
||||||
|
|||||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Поставь точку прерывания и убедись, что заходишь туда. Это не страшно:
-------------------- ... |
|||
|
||||
vadimled |
|
|||
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 30.5.2006 Репутация: нет Всего: нет |
Bce! Разобрался! Всей проблемы то поменять CBS_DROPDOWN на CBS_Drop List
Спасибо за помощь! |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |