밑에서 알아본 컨트롤로 계산기를 만들어봅시다.
이 모양대로 리소스를 추가한 뒤 아이디와 캡션명을 변경해줍니다. 저는 IDC_BUTTON1 부터 0~9로 했습니다.
실제 계산기처럼 입력란의 정렬을 바꿔줍니다.
[클래스마법사]-[가상함수]-OnCommand 를 추가해줍니다.
올바른 버튼이 눌렀을 때 동작하도록 함수 내부에 범위를 설정해줍니다.
BOOL CTestCarlDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
if (IDC_BUTTON1 <= wParam && wParam <= IDC_BUTTON10){//숫자 버튼 0~9가 눌렸을때만 작동
CString num_str,str;
num_str.Format(L"%d", wParam - IDC_BUTTON1);//입력한 값이 문자열로 num_str에 저장됨
GetDlgItemText(IDC_EDIT1, str);//사용자가 입력한 값을 가져옴
SetDlgItemText(IDC_EDIT1, str + num_str);
}
return CDialogEx::OnCommand(wParam, lParam);
}
4칙연산 버튼을 추가하고 각각 더블클릭해 함수를 생성합니다.
헤더파일로 가서 변수를 추가해줍니다.
헤더파일에 선언
private :
char m_op_flag = 0;//0:덧셈,1:뺄셈,2:곱셈,3:나눗셈
char m_step_flag = 0;//연산자가 눌러졌는지 기억, 1로 되있으면 기존 숫자를 지울려고
void CTestCarlDlg::OnBnClickedAddBtn()
{
m_op_flag = 0;//덧셈일 때
m_step_flag = 1;//연산자가 한번 눌러졌다는 뜻
}
void CTestCarlDlg::OnBnClickedSubBtn()
{
m_op_flag = 1;
m_step_flag = 1;
}
void CTestCarlDlg::OnBnClickedNulBtn()
{
m_op_flag = 2;
m_step_flag = 1;
}
void CTestCarlDlg::OnBnClickedDivBtn()
{
m_op_flag = 3;
m_step_flag = 1;
}
BOOL CTestCarlDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
if (IDC_BUTTON1 <= wParam && wParam <= IDC_BUTTON10){
CString num_str,str;
num_str.Format(L"%d", wParam - IDC_BUTTON1);
if (m_step_flag == 0) GetDlgItemText(IDC_EDIT1, str);//값이 입력되지 않았을 때 사용자가 입력한 값을 가져옴
else {
m_step_flag = 0;
}
SetDlgItemText(IDC_EDIT1, str + num_str);
}
return CDialogEx::OnCommand(wParam, lParam);
}
이때 입력된 값들을 저장하기 위해 헤더파일에서 하나 더 선언해준다
int m_first_value = 0;
BOOL CTestCarlDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
if (IDC_BUTTON1 <= wParam && wParam <= IDC_BUTTON10){
CString num_str,str;
num_str.Format(L"%d", wParam - IDC_BUTTON1);
if (m_step_flag == 0) GetDlgItemText(IDC_EDIT1, str);//사용자가 입력한 값을 가져옴
else {
m_first_value = GetDlgItemInt(IDC_EDIT1);//값을 백업
m_step_flag = 0;
}
SetDlgItemText(IDC_EDIT1, str + num_str);
}
return CDialogEx::OnCommand(wParam, lParam);
}
=버튼을 추가한 뒤 함수를 만들어줍니다.
void CTestCarlDlg::OnBnClickedEqBtn()
{
int second_value = GetDlgItemInt(IDC_EDIT1);
switch (m_op_flag){
case 0:
m_first_value += second_value;
break;
case 1:
m_first_value -= second_value;
break;
case 2:
m_first_value *= second_value;
break;
case 3:
if (second_value != 0) m_first_value /= second_value; //나눗셈의 경우 0으로 나누면 프로그램이 죽을 수 있다.
else m_first_value = 0;
break;
}
SetDlgItemInt(IDC_EDIT1, m_first_value);
m_step_flag = 1;
}
우선 사칙연산이 구현되었습니다.
'Programming > Win32 API & MFC' 카테고리의 다른 글
MFC 10 : 대화상자 컨트롤 2 (0) | 2015.08.19 |
---|---|
MFC 09 : 계산기 만들기 2 (1) | 2015.08.16 |
MFC 07 : 대화상자 컨트롤 (0) | 2015.08.15 |
MFC 06 : 짝맞추기 게임 2 (2) | 2015.08.13 |
MFC 05 : 짝맞추기 게임 1 (1) | 2015.08.12 |