Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться с ComboBox, При щелчке на ComboBox выдает ошибку 
V
    Опции темы
vadimled
Дата 4.12.2006, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 30.5.2006

Репутация: нет
Всего: нет



Цель проста: текст в ComboBox должен быть разных цветов.
Я создал класс-наследник CComboBox, написал метод DrawItem,
поставил  стиль контроля OwnerDrawFixed.
При щелчке на ComboBox компилятор выдает ошибку:
"Unhandled exception at 0x7c901230 in Misrad.exe: User breakpoint."
Что я не так делаю?
Каким образом мой новый класс от CComboBox должен быть связан именно с нужным мне
контролем? Ведь у меня десяток  ComboBoxов на панели диалога. 
PM MAIL   Вверх
Earnest
Дата 4.12.2006, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Чтобы связать класс и контрол, нужно поставить соответствующий DDX_Control в DoDataExchange панели диалога.
При этом предполагается, что в диалоге есть переменная твоего класса.


--------------------
...
PM   Вверх
vadimled
Дата 4.12.2006, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 30.5.2006

Репутация: нет
Всего: нет



Да! Связалось и что-то даже заработало.Однако,не так как надо. 

Как сделать чтобы текст менял цвет после щелчка мыши на айтем 
и сохранял его в самом едите?
PM MAIL   Вверх
Earnest
Дата 5.12.2006, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Чтобы менять цвет текста в контроле, нужно обрабатывать сообщение WM_CTLCOLOR, т.е. ставить обработчик ON_WM_CTLCOLOR в родительском диалоге, либо ON_WM_CTLCOLOR_REFLECT в самом контроле, как удобнее.
Ловишь щелчок мыши, ставишь внутренний флажок, делаешь Invalidate, в OnCtlColor в зависимости от флага задаешь цвет...

Добавлено @ 11:40 
Перечитав первый пост, засомневалась, это ли тебе надо.
Разный цвет в комбобоксе - это как? Каждая строка в списке своего цвета? Тогда нужно делать OwnerDraw, и забудь про WM_CTLCOLOR...


--------------------
...
PM   Вверх
vadimled
Дата 5.12.2006, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 30.5.2006

Репутация: нет
Всего: нет



Нет,все правильно. Ответ - в тему. Ща поиграюсь
PM MAIL   Вверх
vadimled
Дата 5.12.2006, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 30.5.2006

Репутация: нет
Всего: нет



Проблема.Цвет меняеться у всех контролей на диалоге.
Пишу так:
Код

HBRUSH CMisradDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    if(flagSelHTg){
        pWnd = GetDlgItem(IDC_COMBO_MY);
        HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
        pDC->SetTextColor(RGB(255, 0, 0));
        pDC->SetBkMode(TRANSPARENT);
        return hbr;
    }
    else
        return CDialog::OnCtlColor(pDC, pWnd, nCtlColor );
}


И где ставиться Invalidate я не понимаю.
PM MAIL   Вверх
Earnest
Дата 5.12.2006, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



У всех меняешь, вот и меняется.
Нужно добавить проверку:

Код

if (pWnd->GetDlgCtrlID() == IDC_COMBO_MY)
{
   // вот тогда меняй
}


А еще лучще, если у тебя свой класс CComboBox определен, сделай в нем ON_WM_CTLCOLOR_REFLECT. И флаг в нем же храни и устанавливай. Тогда поведение будет инкапсулировано.


--------------------
...
PM   Вверх
vadimled
Дата 5.12.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 30.5.2006

Репутация: нет
Всего: нет



Я так понимаю,что строка 
Код

       pWnd = GetDlgItem(IDC_COMBO_MY);

делает не нужной проверку  
Код

pWnd->GetDlgCtrlID() == IDC_COMBO_MY

Кстати она ничего и не дала. 
Не понимаю.Ведь pWnd  содержит указатель на мой конкретный контроль!
Как же все остальные могут реагировать?
PM MAIL   Вверх
Earnest
Дата 5.12.2006, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(vadimled @  5.12.2006,  18:26 Найти цитируемый пост)
Я так понимаю,что строка 
делает не нужной проверку

нет

Цитата(vadimled @  5.12.2006,  18:26 Найти цитируемый пост)
Не понимаю.Ведь pWnd  содержит указатель на мой конкретный контроль!

OnCtlColor приходи для каждого контрола.
Конечно, если ты сначала напишешь  pWnd = GetDlgItem(IDC_COMBO_MY); а потом будешь спрашивать ид-р, получится ерунда.
Спрашивать надо у pWnd, которое пришло в параметрах сообщения.


--------------------
...
PM   Вверх
vadimled
Дата 5.12.2006, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 30.5.2006

Репутация: нет
Всего: нет



Цитата

А еще лучще, если у тебя свой класс CComboBox определен, сделай в нем ON_WM_CTLCOLOR_REFLECT

Сделал как ты сказала.

Написал так:
Код

HBRUSH CHighTgCombo::CtlColor(CDC* pDC, UINT nCtlColor)
{
        CBrush hbr;
         hbr.CreateSolidBrush(RGB( 255, 255, 0 ));
         pDC->SetTextColor(RGB(255, 0, 0));
         pDC->SetBkMode(RGB( 255, 255, 0 ));
         return  hbr;
}        

Текст цвет не меняет и вобще никакой реакции
PM MAIL   Вверх
Earnest
Дата 6.12.2006, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



1) Если цвет менялся при наличии обработчика в диалоге, то и здесь должен. Проверь, попадаешь ли ты в обработчик. 
2) Как ты полагаешь, много смысла возвращать автоматический объект, который тут же разрушается? Это про кисть.
3) Параметром функции SetBkMode является вовсе не цвет


--------------------
...
PM   Вверх
vadimled
Дата 6.12.2006, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 30.5.2006

Репутация: нет
Всего: нет



Объясни пожалуйста что это значит
Цитата

Проверь, попадаешь ли ты в обработчик.

и где это проверить.
Переписал так:
Код

HBRUSH CHighTgCombo::CtlColor(CDC* pDC, UINT nCtlColor)
{
         hbr.CreateSolidBrush(RGB( 255, 255, 0 ));
         pDC->SetTextColor(RGB(255, 0, 0));
         pDC->SetBkMode(OPAQUE);
         return  hbr;
}

А вот
Код

     pDC->SetTextColor(RGB(255, 0, 0));

возвращает почему-то 0. Может из-за этого проблема.
PM MAIL   Вверх
Earnest
Дата 6.12.2006, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(vadimled @  6.12.2006,  10:42 Найти цитируемый пост)
Объясни пожалуйста что это значит
и где это проверить.

Поставь точку прерывания и убедись, что заходишь туда.

Цитата(vadimled @  6.12.2006,  10:42 Найти цитируемый пост)
возвращает почему-то 0. Может из-за этого проблема. 

Это не страшно:
Цитата

Return Value
An RGB value for the previous text color.






--------------------
...
PM   Вверх
vadimled
Дата 6.12.2006, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 30.5.2006

Репутация: нет
Всего: нет



Bce! Разобрался! Всей проблемы то поменять CBS_DROPDOWN  на  CBS_Drop List  
Спасибо за помощь!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0849 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.