Как сделать SetReadOnly(TRUE) для компонентов комбобокса?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 13.07.16 14:31
Оценка:
Есть комбобокс IDC_COMBO1, ему соответствует переменная m_IDC_COMBO1 типа CComboBox.
В этом комбобоксе расположены три элемента-строки--"строка 1", "строка 2", "строка 3".

(Они были добавлены программно:

m_IDC_COMBO1.Clear();
m_IDC_COMBO1.AddString("строка 1");
m_IDC_COMBO1.AddString("строка 2");
m_IDC_COMBO1.AddString("строка 3");
m_IDC_COMBO1.SetCurSel(0);


)

Комбобокс нормально работает, нет проблем с выбором элемента и с программной обработкой выбора элемента.

Но есть одна проблема: пользователь может подвести курсор мыши на текст в элементе комбобокса и изменить строку, изменить текст в этом элементе комбобокса.
Как сделать так, чтобы выбор элемента комбобокса и обьраьотка этого выбора работали, но чтобы было нельзя изменить текст у элементов комбобокса? Функции SetReadOnly я у комбобокса не нашёл.
1613 г. = 2024 г.
Re: Как сделать SetReadOnly(TRUE) для компонентов комбобокса?
От: SаNNy Россия  
Дата: 14.07.16 04:34
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Но есть одна проблема: пользователь может подвести курсор мыши на текст в элементе комбобокса и изменить строку, изменить текст в этом элементе комбобокса.

RF>Как сделать так, чтобы выбор элемента комбобокса и обьраьотка этого выбора работали, но чтобы было нельзя изменить текст у элементов комбобокса? Функции SetReadOnly я у комбобокса не нашёл.

Комбобоксу надо поставить стиль "drop list" в ресурсах
Re[2]: Как сделать SetReadOnly(TRUE) для компонентов комбобокса?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 14.07.16 07:29
Оценка:
Здравствуйте, SаNNy, Вы писали:

SNN>Здравствуйте, RussianFellow, Вы писали:


RF>>Но есть одна проблема: пользователь может подвести курсор мыши на текст в элементе комбобокса и изменить строку, изменить текст в этом элементе комбобокса.

RF>>Как сделать так, чтобы выбор элемента комбобокса и обьраьотка этого выбора работали, но чтобы было нельзя изменить текст у элементов комбобокса? Функции SetReadOnly я у комбобокса не нашёл.

SNN>Комбобоксу надо поставить стиль "drop list" в ресурсах


А как по-русски это называется? Выпадающий список? У меня стоит русская Visual C++ 2008, так там у комбобокса нет такой опции.
1613 г. = 2024 г.
Re[3]: Как сделать SetReadOnly(TRUE) для компонентов комбобокса?
От: SаNNy Россия  
Дата: 14.07.16 07:50
Оценка:
RF>А как по-русски это называется? Выпадающий список? У меня стоит русская Visual C++ 2008, так там у комбобокса нет такой опции.

По-русски, не знаю, у меня стоит английская Visual Studio
Re[3]: Как сделать SetReadOnly(TRUE) для компонентов комбобокса?
От: Evgeniy Skvortsov Россия  
Дата: 14.07.16 09:37
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>А как по-русски это называется? Выпадающий список? У меня стоит русская Visual C++ 2008, так там у комбобокса нет такой опции.


В моей студии называется — "раскрывающийся список"
Re[4]: Как сделать SetReadOnly(TRUE) для компонентов комбобокса?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 15.07.16 08:53
Оценка:
Здравствуйте, Evgeniy Skvortsov, Вы писали:

ES>Здравствуйте, RussianFellow, Вы писали:


RF>>А как по-русски это называется? Выпадающий список? У меня стоит русская Visual C++ 2008, так там у комбобокса нет такой опции.


ES>В моей студии называется — "раскрывающийся список"


Спасибо, так и сделал.
Но у меня теперь комбобокс стал серым цветом. Я же хотел бы, чтобы комбобокс стал белым цветом. Можно ли так сделать (изменить цвет фона комбобокса) и если да, то как?
1613 г. = 2024 г.
Re[5]: Как сделать SetReadOnly(TRUE) для компонентов комбобокса?
От: Evgeniy Skvortsov Россия  
Дата: 15.07.16 11:07
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Спасибо, так и сделал.

RF>Но у меня теперь комбобокс стал серым цветом. Я же хотел бы, чтобы комбобокс стал белым цветом. Можно ли так сделать (изменить цвет фона комбобокса) и если да, то как?

У меня ничего не изменилось.

Можно обрабатывать сообщение WM_CTLCOLOR, в обработчике написать что-то вроде:

if (pWnd->GetDlgCtrlID() == IDC_COMBO1) {
    pDC->SetBkColor(RGB(250, 0, 0)); // меняем цвет фона на красный :-)
}


Если хочешь как-то более кардинально изменить внешний вид — рисуй его сам, ставь ему в свойствах стиль OWNERDRAW и раскрашивай как хочешь.
Вернее придется создать класс-наследник от CComboBox и в нем переопределить OnDrawItem. Кажется так, если ничего не забыл.
Re[6]: Как сделать SetReadOnly(TRUE) для компонентов комбобокса?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 15.07.16 11:21
Оценка:
Здравствуйте, Evgeniy Skvortsov, Вы писали:

ES>Можно обрабатывать сообщение WM_CTLCOLOR, в обработчике написать что-то вроде:


ES>
ES>if (pWnd->GetDlgCtrlID() == IDC_COMBO1) {
    pDC->>SetBkColor(RGB(250, 0, 0)); // меняем цвет фона на красный :-)
ES>}
ES>


А в какой функции писать это? У меня MFC-ное приложение, а не WinAPI-шное.
1613 г. = 2024 г.
Re[7]: Как сделать SetReadOnly(TRUE) для компонентов комбобокса?
От: Evgeniy Skvortsov Россия  
Дата: 15.07.16 11:40
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>А в какой функции писать это? У меня MFC-ное приложение, а не WinAPI-шное.


Какая разница, WM_CTLCOLOR он что в WINAPI, что в MFC одинаков.

В редакторе ресурсов правый клик мышью на диалоге — мастер классов. Выбираешь закладку "Сообщения", находишь в списке WM_CTLCOLOR — двойной клик на нем, добавится обработчик с именем OnCtlColor, в нем и пишешь.

Я же уже объяснял как в MFC добавлять обработчик события.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.