| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > изменение свойств Edit Box |
| Автор: OPQ 2.8.2006, 07:17 | ||
| Здравствуйте люди. Я новичок в 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 2.8.2006, 08:23 |
| Вообще-то сделано нормально, только я бы в отдельную функцию это засунул. А вообще-то для изменения стилей окна существует метод ModifyStyle для основных и ModifyStyleEx для дополнительных свойств. Почитай в MSDN о свойствах окна, и тебе станет все ясно. Удачи! |
| Автор: Earnest 2.8.2006, 08:26 |
| 1) Лучше написать функцию, которая будет делать enable обоим полям в зависимости от текущего состояния радио-опции и вызывать ее из обоих обработчиков. Если все 4 радио-кнопки образуют группу (т.е. только одна из них может быть включена), то узнать, какая, можно одним вызовом GetCheckedRadioButon. Написанная функция тебе также пригодится и при инициализации диалога (для предустановки параметров). Вообще, состояние полей лучше привязывать к состоянию переменных или других полей, а не к действиям пользователя. 2) Продвинутый вариант: заставить работать обработчики ON_UPDATE_COMMAND_UI для каждого поля, чье состояние нужно менять, как это делается для немодальной диалоговой панели. |
| Автор: OPQ 2.8.2006, 08:42 |
| Earnest, а можно пример? |
| Автор: Dart 2.8.2006, 08:56 | ||
Что-то типа
|
| Автор: Earnest 2.8.2006, 12:48 | ||
Насчет единой функции, я имела в виду немного другое:
И вызывать этот метод из всех OnBtnClicked. Больше там ничего делать не надо, так что можно поставить один обработчик на диапазон. Насчет асинхронного обновления: Ну, сам, может и не найдет, но если показать, то все просто. Чтобы работали обработчики ON_UPDATE, нужно добавить обработчик сообщения WM_KICKIDLE, а в нем вызывать UpdateDialogControls(). Сообщение определено в "afxpriv.h". Я уже писала об этом в форуме. В этом случае достаточно будет написать свой OnUpdate для каждого поля, а обработчики OnBtnClicked вообще не нужны. |
| Автор: OPQ 3.8.2006, 11:50 |
| Спасибо! У меня ещё один вопрос |
| Автор: Earnest 3.8.2006, 15:43 |
| 1) Можно переопределить PreTranslateMessage для диалога, в котором ловить нажатие ENTER и проверять, не в едите ли фокус, и тогда делать что тебе надо (и возвращать TRUE). 2) При нажатии ENTER генерируется команда от кнопки по-умолчанию. Выход происходит, т.к. по умолчанию DefaultButton = OK. Переставь с помощью SetDefID. Или в дизайнере диалогов поставь свойство Default у нужной кнопки, а не у OK. |
| Автор: OPQ 8.8.2006, 16:02 |
| Как отловить нажатие ENTER я разобрался, а как отловить нажатие других клавиш, например '*' , '/' , '+' , '-' И если можно еще пара вопросов. 1. Как на Radio Button поставить картинку из ресурсов типа BITMAP, в свойствах Appearance Bitmap ставлю true, а чта дальше делать не знаю 2. Как програмно изменить рисунок в Picture Control ? еще раз спасибо! |
| Автор: Earnest 8.8.2006, 18:26 |
| 1) RadioButton - это просто CButton, у последнего есть функция SetBitmap. 2) PictureControl - это, кажется, CStatic. Есть аналогичная ф-я. |
| Автор: Gremlin 7.9.2006, 12:07 |
| А вот мне помогите с этим Едитом! Хочу чтобы текст был выровнен по вертикали по центру! Тоесть я изменил размеры всего поля и оно стало в два раза больше текста и нужно выравнивание! гы увеличения кегля не предлагать |
| Автор: zkv 7.9.2006, 12:31 | ||
так текст в едите можно крутить, а выравнивание вроде в свойствах можно указать |
| Автор: Earnest 8.9.2006, 06:38 |
| По-моему, в эдите вертикальное выравнивание не предусмотрено... |
| Автор: Gremlin 8.9.2006, 06:49 |
| блин я бы не спрашивал еслибы если бы было предусмотрено штатно но сделать надо |
| Автор: Dart 8.9.2006, 10:52 |
| Gremlin, только создавать всой контрол. В принципе, есть еще одна достаточно простая возможность: на CEdit создать Child'а тоже CEdit, но без WS_BORDER. У родительского убрать WS_TABSTOP и WS_DISABLED и позиционировать его туда, куда тебе нужно в OnMove и OnSize. Другой вариант - писать с нуля и плясать от CWnd. |
| Автор: Bishop 9.9.2006, 08:14 | ||
Gremlin,
Вот в таком вот примерно акцепте. Через EM_SETRECT выставляется прямоугольник, в который будет выведен текст. Применимо только для Multiline полей. |
| Автор: Gremlin 19.9.2006, 18:11 |
| Вот ешо вопрос про Едит. Хочу чтобы в поле можно было вводить только цыфры и символы "-" и ".". Я в принципе сделал в обработчике по изменению производить эту проверку но мне кажется это не правильно ибо символ сначала заносится в едит а потом если не удовлетворяет условию удаляется. Есть ли у кого пример как это сделать с помощью я так понимаю WM_KEYDOWN? |
| Автор: Earnest 20.9.2006, 08:26 |
| Сделай свой обработчик WM_CHAR и проверяй в нем. Если символ устраивает, вызывай стандартный обработчик, нет - ничего не делай или пищи. |
| Автор: Gremlin 20.9.2006, 12:59 |
| а как пикнуть? |
| Автор: vinter 20.9.2006, 15:20 | ||
|
| Автор: Gremlin 20.9.2006, 17:22 |
| гыгы это шутка была а по теме: Создал OnChar ставлю внутри точку остановки жму символ и нефига не заходит а выполняется сразу обработчит на изменение Едита! |
| Автор: Earnest 21.9.2006, 18:48 |
| Видимо, что-то делаешь неправильно. Проверь, что 1) OnChar переопределено у наследника CEdit (а не у диалога!) 2) обработчик подключен в карту сообщений 3) контрол правильно субклассирован (т.е. есть DDX_Control с переменной нужного класса) |
| Автор: Gremlin 22.9.2006, 18:08 |
| У меня 4 класса С...App, C...Dlg и два класса PropertySheet, вот на одной из вкладок и находится Edit Box так где мне нужно переопреелять onChar? |
| Автор: Bishop 23.9.2006, 18:55 | ||
| Gremlin, Можно и так (если Edit Box такой один и/или не хочешь заниматься наследованием/субклассированием):
только для твоего PropertySheet. |
| Автор: Gremlin 25.9.2006, 17:16 |
| а почему нельзя для нескольких? у меня их 4 таких поля на одном щите, и где я должен эту функцию вызывать? в обработчике по изменению? |
| Автор: Earnest 26.9.2006, 16:48 |
| Если нужно для нескольких, то небольшое изменение в вышеприведенном коде от Bishop: pMsg->hwnd == pEdit->m_hWnd заменяешь на проверку всех 4 полей. Можно функцию написать, чтобы красивее было. Вариант со своим классом и обработчиком OnChar - сделай все эдиты этим классом. |
| Автор: Gremlin 26.9.2006, 17:41 |
| а если проверять в котором чичас эдите курсор и проверять тока по этому эдиту? |
| Автор: Earnest 26.9.2006, 19:37 |
Это и есть pMsg->hWnd. Тебе надо проверить, что это hWnd совпадает с одним из твоих. |
| Автор: Gremlin 27.9.2006, 18:41 | ||
немножко переделал но мне кажется не очень красиво вышло слишком много кода
|
| Автор: Bishop 28.9.2006, 07:09 | ||
| Gremlin, хотя бы так
|
| Автор: Gremlin 28.9.2006, 17:47 |
| ага я примерно так и думал тока реализовать не получалось |
| Автор: Dart 29.9.2006, 14:27 |
| Есть еще один метод, достаточно простой в использовании, но несколько корявый (Не бейте меня, профи Ловить событие изменения edit box, а потом UpdateData(TRUE); UpdateData(FALSE); Только возможно, придется ещё устанавливать позицию курсора. Зато кода 2 строчки |
| Автор: Bishop 30.9.2006, 08:35 |
Dart, это не метод, а побочный эффект.
|
| Автор: Dart 30.9.2006, 09:19 |
Почему же, очень даже метод Я исходил из того предположения, что в результате необходимо получить необходимые данные определённого типа (ну, int, float, и т.п.). Если не заморачиваться вводом специфичных данных (а как правило это и не надо), то такой метод упрощает решение вопросов правильности ввода данных. Все твои мысли в принципе правильные, но тем не менее, если необходимо быстро решить этот вопрос, то лучшего решения пожалуй и не стоит придумывать. Потом, ведь не обязательно вешать это на обработчик EN_CHANGE, можно и на другие. Я и сам так не делаю, когда хочется сделать всё нарядно. Я и в предыдущем посте сказал, что это несколько коряво. Но тем не менее такой вариант имеет право на жизнь. |
| Автор: Earnest 30.9.2006, 10:50 |
А ты попробуй - наверняка понравится Для контроля ввода есть, в основном, 2 пути: контроль каждого CHAR - для этого надо свой эдит писать, и способ этот хорош только для тех случаев, когда можно задать позиционный шаблон, типа номера телефона и пр. Второй способ - ждать пока пользователь не закончит мучить эдит, потом считать и поправить (проверить, отформатировать). |
| Автор: Dart 30.9.2006, 13:41 |
Не понравится, я такие вещи к потере фокуса обычно привязываю Слушайте, ну что мы из элементарного вопроса флуд устроили? Я ж уже говорил Но, такая возможность есть? - ЕСТЬ, и я о ней сказал. И основной смысл в моем посте был именно в том, чтобы весь контроль за правильностью введения и интерпретации информации можно возложить на MFC. А уж воспользуется ли кто этим или нет - не мне решать. Может, кому-нибудь и такой метод понравится. Потом, вовсе не означает использование EN_CHANGE. |