«

»

Visual C++. MFC. Увеличиваем функциональность

В прошлом уроке нами была написана программа, которая переводит градусы в радианы. Количество элементов, используемых в ней было заметно не велико. В этом же уроке создадим более универсальное приложение.

Постановка задачи:

Написать программу решения квадратного или биквадратного уравнения.

Решение задачи:

Аналогично прошлому уроку расположим на диалоговом окне следующие элементы, а также сразу изменим у них названия (см. рис. ниже):

  • три метки (Static Text) для вывода заголовков полей;
  • три поля редактирования (Edit Control);
  • один элемент Group Box;
  • две радиокнопки (Radio Button) для выбора типа уравнения;
  • флажок (Check Box), определяющий как будет происходить вывод;
  • метку для вывода результатов;
  • кнопки для решения уравнения и выхода из программы;

Class MFC - Kvodo.ru

 

Определим переменные для полей редактирования, радиокнопок и флажка. Щелкаем правой кнопкой мыши по первому полю ввода, выбираем «Добавить переменную…». Заполняем окно так, как это сделано на скриншоте.

Мастер MFC

Щелкни для увеличения

 

Аналогично добавляем переменные для двух оставшихся полей (m_EditB, m_EditC).

Следующий шаг — определение переменных для радиокнопок. Заходим в свойства элемента Group Box и устанавливаем значение «Группа»->True. То же самое делаем и для обоих радиокнопок, после чего определяем имя и тип переменных для них (рис. ниже).

Добавление переменной члена

Щелкни для увеличения

Добавление переменной члена

Щелкни для увеличения

 

Установка свойства Group в True была необходима для того, чтобы можно было создать переменные как экземпляры класса RadioButton. Но если мы сейчас запустим программу, то переключения между кнопками не будет. Поэтому установим у второй радиокнопки свойство Group в True.

[important]При работе с группой радиокнопок нужно установить у них свойство Group в True, после чего назначить переменные для всех кнопок, а затем установить у всех кроме первой значение False[/important]

Определим переменную, которая будет отвечать за значок, ее тип BOOL.

Добавление переменной члена Visual C++

Щелкни для увеличения

 

Изменим значение ID четвертой метки (расположена над кнопкой «Решить») на IDC_STATIC1. Определим переменную, отвечающую за работу с этой меткой (рис. ниже).

Добавление переменной члена Visual Studio

Щелкни для увеличения

 

Переопределяем ID кнопки «Решить», впишем например ID_Solve.

Щелкаем два раза левой кнопкой мыши по кнопке «Решить», и попадаем в окно с кодом. Тут подключаем библиотеку math.h, после чего вводим в функцию OnBnClickedSolve() следующий текст.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
void CKvodoDlg::OnBnClickedSolve()
{
char S[80];
FILE *f;
double a, b, c, d, x1, x2, y1, y2, y3, y4;
UpdateData(TRUE);
//считываем значения a,b,c из полей редактирования
a=m_EditA;
b=m_EditB;
c=m_EditC;
//вычисляем дискриминант
d=b*b-4*a*c;
//Функция (метод) GetCheck() проверяет, выбрана ли радиокнопка,
//в данном случае выбрана m_Kvadrat
if (m_Kvadrat.GetCheck())
if (d<0)
sprintf(S, "Корней нет");
else
{
x1=(-b+sqrt(d))/2/a;
x2=(-b-sqrt(d))/(2*a);
sprintf(S, "x1=%g\tx2=%g", x1, x2);
}
else
{
if (d<0)
sprintf(S, "Корней нет");
else
{
x1=(-b+sqrt(d))/2/a;
x2=(-b-sqrt(d))/(2*a);
if ((x1<0) && (x2<0))
sprintf(S, "Корней нет");
else if ((x1>=0) && (x2>=0))
{
y1=sqrt(x1);
y2=-y1;
y3=sqrt(x2);
y4=-y3;
sprintf(S, "четыре корня: y1=%f\ty2=%f\ty3=%f\ty4=%f",y1,y2,y3,y4);
}
else if (x1>=0)
{
y1=sqrt(x1);
y2=-y1;
sprintf(S, "два корня: y1=%f\ty2=%f", y1,y2);
}
else
{
y1=sqrt(x2);
y2=-y1;
sprintf(S, "два корня: y1=%f\ty2=%f", y1,y2);
}
}
}
//в зависимости от флажка message
if (m_message)
{
f=fopen("Result.txt", "w");
fprintf(f, S);
fclose(f);
}
else
{
m_Result=S;
UpdateData(FALSE);
}}

 

Ну вот, у нас готова рабочая программа! И хотелось бы заметить, что последняя метка, через которую выводиться результат должна быть достаточного размера для того, чтобы показать всю строку ответа.

Часто бывает, что необходимо добавить начальные значения в поля ввода, для этого в том файле, в который мы только что вписали код, есть функция OnInitDialog(). Добавьте этот код перед значением return TRUE:

 

1
2
3
4
m_EditA=2;
m_EditB=3;
m_EditC=-1;
UpdateData(FALSE);

 

Файлы исходного кода созданной нами программы доступны для скачивания по этой ссылке.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Вы можете использовать эти теги HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Проверка на человечность *