| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Действия в зависимости от состояния радиокнопки |
| Автор: Hawkmoth 24.5.2010, 14:02 | ||||
| Такой нубский вопрос. В диалоге есть две радиокнопки, Radio1 и Radio2. После выбора одной из них пользователь жмет на кнопку "Ок", и должно выполняться действие, соответствующее выбранной радиобаттон. Для простоты, пусть вылазят сообщения "Нажата радиокнопка 1" и "Нажата радиокнопка 2", соответственно. Ход моей мысли такой: создаем собственно диалог, добавляем 2 радиокнопки -> для первой ставим галочку на "Group" -> присваиваем член-переменную m_Radio. В OnInitDialog() прописываю
Затем в обработчике событий при нажатии на кнопку "Ок" прописываю
И теперь при тестировании получившегося приложения независимо от положения кнопок, выдается сообщение "Нажата радиокнопка 1". Как поправить? |
| Автор: BorisVorontsov 24.5.2010, 16:47 |
| CButton::GetState? |
| Автор: Earnest 24.5.2010, 17:38 |
| Если m_Radio - это переменная, связанная с радиокнопками, и в DoDataExchange есть соответствующее предложение DDX_Radio и кнопки правильно расположены (подряд, на второй кнопке нет WS_GROUP) и т.д. - то добавть перед swith'ем UpdateData (TRUE). Добавлено через 1 минуту и 35 секунд Кстати, в OnInitDialog не нужно вызывать UpdateData (FALSE) - это будет уже второй раз. Достаточно вызвать базовый метод OnInitDialog, а перед ним (или в конструкторе) сделать необходимые присваивания. |
| Автор: Hawkmoth 24.5.2010, 20:32 | ||||||
Earnest, спасибо! Именно этого, по-видимому, и не хватало
BorisVorontsov, возможно, более логичный вариант... Я еще деревянный, и синтаксис с ходу мне плохо дается... Что-то вроде этого:
Или совсем вру? |
| Автор: Earnest 25.5.2010, 07:36 |
| Можно и так, только тогда удобнее через диалог спрашивать: IsDlgButtonChecked (IDC_MYBUTTON) - чтобы каждую кнопку не извлекать. |
| Автор: Albor 26.5.2010, 12:00 | ||||||
Это метод CWnd. Возвращает ID выбранной радиокнопки в группе от nIDFirstButton до nIDLastButton. Использовать можно примерно так:
Добавлено через 4 минуты и 54 секунды Заодно - установить радиокнопку:
|
| Автор: Hawkmoth 26.5.2010, 19:22 | ||
Спасибо, с этим вопросом я более-менее разобрался)). Тогда еще вопрос вдогонку: как изначально неактивную группу радиокнопок (у каждой в свойствах проставлено "Disabled" сделать активной программно? Т. е. есть, допустим, диалог с группой из трех "серых" радиокнопок и кнопка, при нажатии на которую эти контролы активизируются. Конструкция
Не работает, ругается на left of '.EnableWindow' must have class/struct/union type (m_Radio - переменная, присвоенная через CW первой радиокнопке в группе). |
| Автор: Hawkmoth 26.5.2010, 19:45 |
| Так, в своём частном случае разобрался. Вот в таком виде желаемый эффект достигнут: void CPage_1::OnButton1() { GetDlgItem(IDC_RADIO1)->EnableWindow(TRUE); GetDlgItem(IDC_RADIO2)->EnableWindow(TRUE); } А если у меня не две кнопки в радиогруппе, а 1000? |
| Автор: Albor 26.5.2010, 23:05 | ||
Примерно так:
Данный код переберёт все окна от IDC_RADIO1 до IDC_RADIO1000 и выполнит над ними операцию EnableWindow. Необязательно, чтобы все окна были радиокнопками. |