Contribution to International Economy

  • Программирование научного калькулятора
При программировании арифметического калькулятора использованы классы для вывода в диалоговое окно массива однотипных элементов – командных кнопок.
Калькулятор выполняет простые арифметические действия. Определено местоположение каждой кнопки на экране и обработчик привязанного к ней действия в калькуляторе. За прорисовку и обработку нажатий кнопок отвечает класс CButt, который наследуется из библиотечного класса CButton. (Class Wizard->AddClass->New->BaseClass->CButton)
В него добавляем структруру RECT для задания местоположения кнопки.
// Generated message map functions protected:
RECT rect;
Ссылка на родительское окно, для последующей обработки
CCalcDlg * w_Parent;
//{{AFX_MSG(CButt)
afx_msg void OnClicked();
//}}AFX_MSG
Определяем метод OnClicked, ... (ClassWizard->ClassName->CButt->Messages->=BN_CLICKED->AddFunction)
который занимается тем, что передает в специальный обработчик вызывающего окна заголовок кнопки...
void CButt::OnClicked()
{
CString Header;
GetWindowText(Header);
w_Parent->ObrNum(Header);

}
и переопределяем метод OnCreate(), который при создании кнопки принимает заголовок кнопки, ссылку на родительское окно и координату левого верхнего угла. Сами кнопки квадратные, 40 пиксел
BOOL CButt::Create(LPCTSTR lpszWindowName,CWnd * wnd,UINT nID,UINT top,UINT left)
{
rect.left=left;
rect.top=top;
rect.right=left+40;
rect.bottom=top+40;
w_Parent=(CCalcDlg *)wnd;
return CButton::Create(lpszWindowName, WS_CHILD |WS_VISIBLE, rect, wnd, nID);
}
Изменим класс родительского окна CalcDlg
class CCalcDlg : public CDialog
{
// Construction
public:
double Operation(); // обработка действий
void ObrNum(CString Num); // обработка нажатий клавиш
CCalcDlg(CWnd* pParent = NULL); // standard constructor
CButt m_btn[17]; // всего кнопок
В код CCalcDlg::OnInitDialog() добавим инициализацию кнопок
char buff[2];
buff[1]=0;
// создание и прорисовка числовых кнопок
for (int i=0;i<10;i++){
m_btn[i].Create(itoa(i,buff,10),this,10000+i,i>4?90:45,15+(45*(i<5?i:i-5)));
}
// равно
m_btn[10].Create("=",this,10010,45*3,15+45*5);
// точка и другие действия
m_btn[11].Create(".",this,10011,45*3,15+45*0);
m_btn[12].Create("/",this,10012,45*3,15+45*1);
m_btn[13].Create("*",this,10013,45*3,15+45*2);
m_btn[14].Create("+",this,10014,45*3,15+45*3);
m_btn[15].Create("-",this,10015,45*3,15+45*4);
m_btn[16].Create("C",this,10016,45,15+45*5);
Определим обработку нажатия кнопки
void CCalcDlg::ObrNum(CString Num)
{
if (Num=="." && m_Num.Find('.')>=0){ // если точка уже нажата, то не вводить
return;
}
if (Num=="C"){ // сброс
m_Num="";
m_Operation="";
UpdateData(FALSE);
UpdateWindow();
return;
}
CString PossibleOperation("/+-*"); // если действие, то число и действие запоминаем и сбрасываем табло
if (PossibleOperation.Find(Num)>=0){
m_BuffNum=atof(m_Num);
m_Num="";
m_Operation=Num;
UpdateData(FALSE);
UpdateWindow();
return;
}
double Buff=0;
if (Num=="="){ // равно - обрабатываем, что получилось
Buff=Operation();
m_Num.Format("%f",Buff);
m_Operation="";
UpdateData(FALSE);
UpdateWindow();
return;
}
m_Num+=Num; // все остальное выводим на табло
UpdateData(FALSE);
UpdateWindow();
}
Собственно действия
double CCalcDlg::Operation()
{
double Buff=0;
if (m_Operation=="+"){
Buff=m_BuffNum+atof(m_Num);
} else if (m_Operation=="-"){
Buff=m_BuffNum-atof(m_Num);
} else if (m_Operation=="/" && atof(m_Num)!=0){
Buff=m_BuffNum/atof(m_Num);
} else if (m_Operation=="*"){
Buff=m_BuffNum*atof(m_Num);
}
return Buff;
}

Операции и цифры вводятся с помощью мышки, символы, введенные с клавиатуры, не отображаются на табло. Для того чтобы добавить новую кнопку, нужно:
• увеличить массив кнопок m_btn[17]; до 18.
• добавить создание этой кнопки в OnInitDialog()
• добавить действие в CString PossibleOperation("/+-*");
• добавить его обработку в CCalcDlg::Operation()
В научном калькуляторе увеличено количество командных кнопок для дополнительных операций, массив кнопок не создавался – обращение к каждой кнопке производится по ее имени.


Другие работы по теме: