Поиск:

Ответ в темуСоздание новой темы Создание опроса
> изменение свойств Edit Box, MFC 
:(
    Опции темы
OPQ
Дата 2.8.2006, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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.

Я это сделал вот так, но не уверен, что это хорошо, как можно сделать по-другому? 
Код

void CCalculatorDlg::OnBnClickedRadio1()
{
    CEdit *ed1;
    ed1 = (CEdit*) GetDlgItem (IDC_EDIT1);
    ed1->EnableWindow(TRUE);
    CEdit *ed2;
    ed2 = (CEdit*) GetDlgItem (IDC_EDIT2);
    ed2->EnableWindow(FALSE);
}

void CCalculatorDlg::OnBnClickedRadio2()
{
    CEdit *ed2;
    ed2 = (CEdit*) GetDlgItem (IDC_EDIT2);
    ed2->EnableWindow(TRUE);
    CEdit *ed1;
    ed1 = (CEdit*) GetDlgItem (IDC_EDIT1);
    ed1->EnableWindow(FALSE);
}

void CCalculatorDlg::OnBnClickedRadio3()
{
    CEdit *ed1;
    ed1 = (CEdit*) GetDlgItem (IDC_EDIT1);
    ed1->EnableWindow(FALSE);
    CEdit *ed2;
    ed2 = (CEdit*) GetDlgItem (IDC_EDIT2);
    ed2->EnableWindow(FALSE);
}

void CCalculatorDlg::OnBnClickedRadio4()
{
    CEdit *ed1;
    ed1 = (CEdit*) GetDlgItem (IDC_EDIT1);
    ed1->EnableWindow(FALSE);
    CEdit *ed2;
    ed2 = (CEdit*) GetDlgItem (IDC_EDIT2);
    ed2->EnableWindow(FALSE);
}


PM MAIL   Вверх
Dart
Дата 2.8.2006, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 26.6.2006
Где: Саратов, РФ

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



Вообще-то сделано нормально, только я бы в отдельную функцию это засунул.
А вообще-то для изменения стилей окна существует метод ModifyStyle для основных и ModifyStyleEx для дополнительных свойств.
Почитай в MSDN о свойствах окна, и тебе станет все ясно.
Удачи!
--------------------
ЦитатаЛюблю смотреть, как другие работают
 Дж. К. ДжеромСайт: www.ecosigma.ruПочта: [email protected] 
PM MAIL WWW ICQ   Вверх
Earnest
Дата 2.8.2006, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



1) Лучше написать функцию, которая будет делать enable обоим полям в зависимости от текущего состояния радио-опции и вызывать ее из обоих обработчиков. Если все 4 радио-кнопки образуют группу (т.е. только одна из них может быть включена), то узнать, какая, можно одним вызовом GetCheckedRadioButon. 
Написанная функция тебе также пригодится и при инициализации диалога (для предустановки параметров). Вообще, состояние полей лучше привязывать к состоянию переменных или других полей, а не к действиям пользователя.

2) Продвинутый вариант: заставить работать обработчики ON_UPDATE_COMMAND_UI для каждого поля, чье состояние нужно менять, как это делается для немодальной диалоговой панели.


--------------------
...
PM   Вверх
Dart
Дата 2.8.2006, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 26.6.2006
Где: Саратов, РФ

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



Цитата(Earnest @  2.8.2006,  08:26 Найти цитируемый пост)
2) Продвинутый вариант: заставить работать обработчики ON_UPDATE_COMMAND_UI для каждого поля, чье состояние нужно менять, как это делается для немодальной диалоговой панели.

Только без поллитра в этом новичку не разобраться.
Так что лучше 1 вариант, как и советует Earnest. Просто когда у тебя будет реальный проект, большое количество функций неизбежно приведет к каше в твоей голове.
--------------------
ЦитатаЛюблю смотреть, как другие работают
 Дж. К. ДжеромСайт: www.ecosigma.ruПочта: [email protected] 
PM MAIL WWW ICQ   Вверх
OPQ
Дата 2.8.2006, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Earnest, а можно пример?
PM MAIL   Вверх
Dart
Дата 2.8.2006, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 26.6.2006
Где: Саратов, РФ

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



Что-то типа
Код

void CCalculatorDlg::EnablingEditControls(BOOL value1, BOOL value2, ...)
{
    CEdit* ed1 = (CEdit*)GetDlgItem(IDC_EDIT1);
    CEdit* ed2 = (CEdit*)GetDlgItem(IDC_EDIT2);
    ed1->EnableWindow(value1);
    ed2->EnableWindow(value2);
//// и так далее
}
А дальше спокойно описываешь логику своей работы, как тебе надо

Это сообщение отредактировал(а) Dart - 2.8.2006, 08:58
--------------------
ЦитатаЛюблю смотреть, как другие работают
 Дж. К. ДжеромСайт: www.ecosigma.ruПочта: [email protected] 
PM MAIL WWW ICQ   Вверх
Earnest
Дата 2.8.2006, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Насчет единой функции, я имела в виду немного другое:

Код

void CCalculatorDlg::UpdateEdits()
{
   // допустим, радиокнопки имеют ид-ры IDC_ONE, IDC_TWO, IDC_THREE, IDC_FOUR
   // кнопки следуют в порядке z-order!
   int btnChecked = GetCheckedRadioButton (IDC_ONE, IDC_FOUR);
   
   GetDlgItem (IDC_EDIT1)->EnableWindow (btnChecked == IDC_ONE);
   GetDlgItem (IDC_EDIT2)->EnableWindow (btnChecked == IDC_TWO);
}

И вызывать этот метод из всех OnBtnClicked. Больше там ничего делать не надо, так что можно поставить один обработчик на диапазон.

Насчет асинхронного обновления:
Цитата(Dart @  2.8.2006,  09:33 Найти цитируемый пост)
Только без поллитра в этом новичку не разобраться.

Ну, сам, может и не найдет, но если показать, то все просто. Чтобы работали обработчики ON_UPDATE, нужно добавить обработчик сообщения WM_KICKIDLE, а в нем вызывать UpdateDialogControls(). Сообщение определено в "afxpriv.h". Я уже писала об этом в форуме.

В этом случае достаточно будет написать свой OnUpdate для каждого поля, а обработчики OnBtnClicked вообще не нужны.




--------------------
...
PM   Вверх
OPQ
Дата 3.8.2006, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо! У меня ещё один вопрос  smile  как сделать так, чтобы после ввода в Edit при нажатии Enter выполнялась определённая функция или происходило нажатие определённой кнопки, а то я нажимаю  Enter и происходит выход smile 
PM MAIL   Вверх
Earnest
Дата 3.8.2006, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



1) Можно переопределить PreTranslateMessage для диалога, в котором ловить нажатие ENTER и проверять, не в едите ли фокус, и тогда делать что тебе надо (и возвращать TRUE).

2) При нажатии ENTER генерируется команда от кнопки по-умолчанию. Выход происходит, т.к. по умолчанию DefaultButton = OK. Переставь с помощью SetDefID. Или в дизайнере диалогов поставь свойство Default у нужной кнопки, а не у OK.


--------------------
...
PM   Вверх
OPQ
Дата 8.8.2006, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как отловить нажатие ENTER я разобрался, а как отловить нажатие других клавиш, например '*' , '/' , '+' , '-' smile 

И если можно еще пара вопросов. 

1. Как на Radio Button поставить картинку из ресурсов типа BITMAP, в свойствах Appearance Bitmap ставлю true, а чта дальше делать не знаю smile 

2. Как програмно изменить рисунок в  Picture Control ?

еще раз спасибо!
PM MAIL   Вверх
Earnest
Дата 8.8.2006, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



1) RadioButton - это просто CButton, у последнего есть функция SetBitmap.
2) PictureControl - это, кажется, CStatic. Есть аналогичная ф-я.


--------------------
...
PM   Вверх
Gremlin
Дата 7.9.2006, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А вот мне помогите с этим Едитом! Хочу чтобы текст был выровнен по вертикали по центру!
Тоесть я изменил размеры всего поля и оно стало в два раза больше текста и нужно выравнивание!
гы увеличения кегля не предлагать smile
PM MAIL   Вверх
zkv
Дата 7.9.2006, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

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



Код

m_EditField.LineScroll(numLines, numChars );

так текст в едите можно крутить, а выравнивание вроде в свойствах можно указать
PM MAIL   Вверх
Earnest
Дата 8.9.2006, 06:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



По-моему, в эдите вертикальное выравнивание не предусмотрено... 


--------------------
...
PM   Вверх
Gremlin
Дата 8.9.2006, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



блин я бы не спрашивал еслибы если бы было предусмотрено штатно но сделать надо smile возможно есть какая нибуть возможность отступить определенное колво пикселей от границы?
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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