![]() |
|
|
![]()
|
|
| OPQ |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 31.7.2006 Репутация: нет Всего: нет |
Здравствуйте люди. Я новичок в MFC, поэтому не убивайте меня сильно, если вопрос покажется глупым
Есть диалог, 4 Radio Button и 2 Edit Box, надо чтобы при выборе первого Radio Button у первый Edit Box Disabled = false, а у второго Disabled = true, при выборе второго Radio Button - наоборот. А при выборе 3 и 4 Radio Button оба Edit Box были Disabled = true. Я это сделал вот так, но не уверен, что это хорошо, как можно сделать по-другому?
|
|||
|
||||
| Dart |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 26.6.2006 Где: Саратов, РФ Репутация: 2 Всего: 2 |
Вообще-то сделано нормально, только я бы в отдельную функцию это засунул.
А вообще-то для изменения стилей окна существует метод ModifyStyle для основных и ModifyStyleEx для дополнительных свойств. Почитай в MSDN о свойствах окна, и тебе станет все ясно. Удачи! --------------------
ЦитатаЛюблю смотреть, как другие работают Дж. К. ДжеромСайт: www.ecosigma.ruПочта: [email protected] |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
1) Лучше написать функцию, которая будет делать enable обоим полям в зависимости от текущего состояния радио-опции и вызывать ее из обоих обработчиков. Если все 4 радио-кнопки образуют группу (т.е. только одна из них может быть включена), то узнать, какая, можно одним вызовом GetCheckedRadioButon.
Написанная функция тебе также пригодится и при инициализации диалога (для предустановки параметров). Вообще, состояние полей лучше привязывать к состоянию переменных или других полей, а не к действиям пользователя. 2) Продвинутый вариант: заставить работать обработчики ON_UPDATE_COMMAND_UI для каждого поля, чье состояние нужно менять, как это делается для немодальной диалоговой панели. -------------------- ... |
|||
|
||||
| Dart |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 26.6.2006 Где: Саратов, РФ Репутация: 2 Всего: 2 |
Только без поллитра в этом новичку не разобраться. Так что лучше 1 вариант, как и советует Earnest. Просто когда у тебя будет реальный проект, большое количество функций неизбежно приведет к каше в твоей голове. --------------------
ЦитатаЛюблю смотреть, как другие работают Дж. К. ДжеромСайт: www.ecosigma.ruПочта: [email protected] |
|||
|
||||
| OPQ |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 31.7.2006 Репутация: нет Всего: нет |
Earnest, а можно пример?
|
|||
|
||||
| Dart |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 26.6.2006 Где: Саратов, РФ Репутация: 2 Всего: 2 |
Что-то типа
Это сообщение отредактировал(а) Dart - 2.8.2006, 08:58 --------------------
ЦитатаЛюблю смотреть, как другие работают Дж. К. ДжеромСайт: www.ecosigma.ruПочта: [email protected] |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Насчет единой функции, я имела в виду немного другое:
И вызывать этот метод из всех OnBtnClicked. Больше там ничего делать не надо, так что можно поставить один обработчик на диапазон. Насчет асинхронного обновления: Ну, сам, может и не найдет, но если показать, то все просто. Чтобы работали обработчики ON_UPDATE, нужно добавить обработчик сообщения WM_KICKIDLE, а в нем вызывать UpdateDialogControls(). Сообщение определено в "afxpriv.h". Я уже писала об этом в форуме. В этом случае достаточно будет написать свой OnUpdate для каждого поля, а обработчики OnBtnClicked вообще не нужны. -------------------- ... |
|||
|
||||
| OPQ |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 31.7.2006 Репутация: нет Всего: нет |
Спасибо! У меня ещё один вопрос
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
1) Можно переопределить PreTranslateMessage для диалога, в котором ловить нажатие ENTER и проверять, не в едите ли фокус, и тогда делать что тебе надо (и возвращать TRUE).
2) При нажатии ENTER генерируется команда от кнопки по-умолчанию. Выход происходит, т.к. по умолчанию DefaultButton = OK. Переставь с помощью SetDefID. Или в дизайнере диалогов поставь свойство Default у нужной кнопки, а не у OK. -------------------- ... |
|||
|
||||
| OPQ |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 31.7.2006 Репутация: нет Всего: нет |
Как отловить нажатие ENTER я разобрался, а как отловить нажатие других клавиш, например '*' , '/' , '+' , '-'
И если можно еще пара вопросов. 1. Как на Radio Button поставить картинку из ресурсов типа BITMAP, в свойствах Appearance Bitmap ставлю true, а чта дальше делать не знаю 2. Как програмно изменить рисунок в Picture Control ? еще раз спасибо! |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
1) RadioButton - это просто CButton, у последнего есть функция SetBitmap.
2) PictureControl - это, кажется, CStatic. Есть аналогичная ф-я. -------------------- ... |
|||
|
||||
| Gremlin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.8.2006 Репутация: нет Всего: нет |
А вот мне помогите с этим Едитом! Хочу чтобы текст был выровнен по вертикали по центру!
Тоесть я изменил размеры всего поля и оно стало в два раза больше текста и нужно выравнивание! гы увеличения кегля не предлагать |
|||
|
||||
| zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 16 Всего: 92 |
так текст в едите можно крутить, а выравнивание вроде в свойствах можно указать |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
По-моему, в эдите вертикальное выравнивание не предусмотрено...
-------------------- ... |
|||
|
||||
| Gremlin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.8.2006 Репутация: нет Всего: нет |
блин я бы не спрашивал еслибы если бы было предусмотрено штатно но сделать надо
|
|||
|
||||
| Dart |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 26.6.2006 Где: Саратов, РФ Репутация: 2 Всего: 2 |
Gremlin, только создавать всой контрол.
В принципе, есть еще одна достаточно простая возможность: на CEdit создать Child'а тоже CEdit, но без WS_BORDER. У родительского убрать WS_TABSTOP и WS_DISABLED и позиционировать его туда, куда тебе нужно в OnMove и OnSize. Другой вариант - писать с нуля и плясать от CWnd. --------------------
ЦитатаЛюблю смотреть, как другие работают Дж. К. ДжеромСайт: www.ecosigma.ruПочта: [email protected] |
|||
|
||||
| Bishop |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 188 Регистрация: 3.6.2005 Где: Минск, Беларусь Репутация: 2 Всего: 16 |
Gremlin,
Вот в таком вот примерно акцепте. Через EM_SETRECT выставляется прямоугольник, в который будет выведен текст. Применимо только для Multiline полей. Это сообщение отредактировал(а) Bishop - 9.9.2006, 09:01 |
|||
|
||||
| Gremlin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.8.2006 Репутация: нет Всего: нет |
Вот ешо вопрос про Едит. Хочу чтобы в поле можно было вводить только цыфры и символы "-" и ".". Я в принципе сделал в обработчике по изменению производить эту проверку но мне кажется это не правильно ибо символ сначала заносится в едит а потом если не удовлетворяет условию удаляется. Есть ли у кого пример как это сделать с помощью я так понимаю WM_KEYDOWN?
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Сделай свой обработчик WM_CHAR и проверяй в нем. Если символ устраивает, вызывай стандартный обработчик, нет - ничего не делай или пищи.
-------------------- ... |
|||
|
||||
| Gremlin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.8.2006 Репутация: нет Всего: нет |
а как пикнуть?
|
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 4 Всего: 56 |
|
|||
|
||||
| Gremlin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.8.2006 Репутация: нет Всего: нет |
гыгы это шутка была
а по теме: Создал OnChar ставлю внутри точку остановки жму символ и нефига не заходит а выполняется сразу обработчит на изменение Едита! |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Видимо, что-то делаешь неправильно.
Проверь, что 1) OnChar переопределено у наследника CEdit (а не у диалога!) 2) обработчик подключен в карту сообщений 3) контрол правильно субклассирован (т.е. есть DDX_Control с переменной нужного класса) -------------------- ... |
|||
|
||||
| Gremlin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.8.2006 Репутация: нет Всего: нет |
У меня 4 класса С...App, C...Dlg и два класса PropertySheet, вот на одной из вкладок и находится Edit Box так где мне нужно переопреелять onChar?
|
|||
|
||||
| Bishop |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 188 Регистрация: 3.6.2005 Где: Минск, Беларусь Репутация: 2 Всего: 16 |
Gremlin,
Можно и так (если Edit Box такой один и/или не хочешь заниматься наследованием/субклассированием):
только для твоего PropertySheet. |
|||
|
||||
| Gremlin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.8.2006 Репутация: нет Всего: нет |
а почему нельзя для нескольких? у меня их 4 таких поля на одном щите, и где я должен эту функцию вызывать? в обработчике по изменению?
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Если нужно для нескольких, то небольшое изменение в вышеприведенном коде от Bishop:
pMsg->hwnd == pEdit->m_hWnd заменяешь на проверку всех 4 полей. Можно функцию написать, чтобы красивее было. Вариант со своим классом и обработчиком OnChar - сделай все эдиты этим классом. -------------------- ... |
|||
|
||||
| Gremlin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.8.2006 Репутация: нет Всего: нет |
а если проверять в котором чичас эдите курсор и проверять тока по этому эдиту?
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Это и есть pMsg->hWnd. Тебе надо проверить, что это hWnd совпадает с одним из твоих. -------------------- ... |
|||
|
||||
| Gremlin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.8.2006 Репутация: нет Всего: нет |
немножко переделал но мне кажется не очень красиво вышло слишком много кода
|
|||
|
||||
| Bishop |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 188 Регистрация: 3.6.2005 Где: Минск, Беларусь Репутация: 2 Всего: 16 |
Gremlin,
хотя бы так
|
|||
|
||||
| Gremlin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 28.8.2006 Репутация: нет Всего: нет |
ага я примерно так и думал тока реализовать не получалось
|
|||
|
||||
| Dart |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 26.6.2006 Где: Саратов, РФ Репутация: 2 Всего: 2 |
Есть еще один метод, достаточно простой в использовании, но несколько корявый
(Не бейте меня, профи Ловить событие изменения edit box, а потом UpdateData(TRUE); UpdateData(FALSE); Только возможно, придется ещё устанавливать позицию курсора. Зато кода 2 строчки --------------------
ЦитатаЛюблю смотреть, как другие работают Дж. К. ДжеромСайт: www.ecosigma.ruПочта: [email protected] |
|||
|
||||
| Bishop |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 188 Регистрация: 3.6.2005 Где: Минск, Беларусь Репутация: 2 Всего: 16 |
Dart, это не метод, а побочный эффект.
|
|||
|
||||
| Dart |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 26.6.2006 Где: Саратов, РФ Репутация: 2 Всего: 2 |
Почему же, очень даже метод Я исходил из того предположения, что в результате необходимо получить необходимые данные определённого типа (ну, int, float, и т.п.). Если не заморачиваться вводом специфичных данных (а как правило это и не надо), то такой метод упрощает решение вопросов правильности ввода данных. Все твои мысли в принципе правильные, но тем не менее, если необходимо быстро решить этот вопрос, то лучшего решения пожалуй и не стоит придумывать. Потом, ведь не обязательно вешать это на обработчик EN_CHANGE, можно и на другие. Я и сам так не делаю, когда хочется сделать всё нарядно. Я и в предыдущем посте сказал, что это несколько коряво. Но тем не менее такой вариант имеет право на жизнь. --------------------
ЦитатаЛюблю смотреть, как другие работают Дж. К. ДжеромСайт: www.ecosigma.ruПочта: [email protected] |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
А ты попробуй - наверняка понравится Для контроля ввода есть, в основном, 2 пути: контроль каждого CHAR - для этого надо свой эдит писать, и способ этот хорош только для тех случаев, когда можно задать позиционный шаблон, типа номера телефона и пр. Второй способ - ждать пока пользователь не закончит мучить эдит, потом считать и поправить (проверить, отформатировать). -------------------- ... |
|||
|
||||
| Dart |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 26.6.2006 Где: Саратов, РФ Репутация: 2 Всего: 2 |
Не понравится, я такие вещи к потере фокуса обычно привязываю Слушайте, ну что мы из элементарного вопроса флуд устроили? Я ж уже говорил Но, такая возможность есть? - ЕСТЬ, и я о ней сказал. И основной смысл в моем посте был именно в том, чтобы весь контроль за правильностью введения и интерпретации информации можно возложить на MFC. А уж воспользуется ли кто этим или нет - не мне решать. Может, кому-нибудь и такой метод понравится. Потом, вовсе не означает использование EN_CHANGE. --------------------
ЦитатаЛюблю смотреть, как другие работают Дж. К. ДжеромСайт: www.ecosigma.ruПочта: [email protected] |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |