[MFC] 계산기 만들기 (사칙연산, 0으로나눌경우 ERROR표시)
1. 가장 먼저 아래와 같이 Dialog를 도구상자를 이용해 꾸며줍니다.(edit control, button)
(0~9까지 순서대로 버튼을 생성해주어 ID값이 IDC_BUTTON1~IDC_BUTTON10이 되도록 만들어주었음)
2. 버튼을 클릭했을때 EDIT창에 표시가 되도록 버튼을 더블클릭하여 함수생성을 해주었습니다.
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 68 69 | void COTLDlg::OnBnClickedButton1() { CString str; GetDlgItemText(IDC_EDIT1,str); SetDlgItemText(IDC_EDIT1,str+L"0");// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. } void COTLDlg::OnBnClickedButton2() { CString str; GetDlgItemText(IDC_EDIT1,str); SetDlgItemText(IDC_EDIT1,str+L"1");// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. } void COTLDlg::OnBnClickedButton3() { CString str; GetDlgItemText(IDC_EDIT1,str); SetDlgItemText(IDC_EDIT1,str+L"2");// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. } void COTLDlg::OnBnClickedButton4() { CString str; GetDlgItemText(IDC_EDIT1,str); SetDlgItemText(IDC_EDIT1,str+L"3");// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. } void COTLDlg::OnBnClickedButton5() { CString str; GetDlgItemText(IDC_EDIT1,str); SetDlgItemText(IDC_EDIT1,str+L"4");// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. } void COTLDlg::OnBnClickedButton6() { CString str; GetDlgItemText(IDC_EDIT1,str); SetDlgItemText(IDC_EDIT1,str+L"5");// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. } void COTLDlg::OnBnClickedButton7() { CString str; GetDlgItemText(IDC_EDIT1,str); SetDlgItemText(IDC_EDIT1,str+L"6");// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. } void COTLDlg::OnBnClickedButton8() { CString str; GetDlgItemText(IDC_EDIT1,str); SetDlgItemText(IDC_EDIT1,str+L"7");// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. } void COTLDlg::OnBnClickedButton9() { CString str; GetDlgItemText(IDC_EDIT1,str); SetDlgItemText(IDC_EDIT1,str+L"8");// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. } void COTLDlg::OnBnClickedButton10() { CString str; GetDlgItemText(IDC_EDIT1,str); SetDlgItemText(IDC_EDIT1,str+L"9");// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. } | cs |
-GetDlgItemText(ID,변수) : EDIT(ID)창에 있는 문자열을 STR변수에 저장
-SetDlgItemText: EDIT(ID)에 (STR + 글자 "0~9")을 표시해줌
고로 계속 숫자를 클릭하면 뒤에 숫자(문자열로)가 붙음
3. 이후 사측연산버튼의 함수를 생성후, 숫자를 변수에 받아놓고, edit화면을 비우는 과정을 코딩함.
1 2 3 4 5 6 7 8 9 10 | void COTLDlg::OnBnClickedPlus() //더하기 { start=0; first = GetDlgItemInt(IDC_EDIT1); SetDlgItemText(IDC_EDIT1,L" "); // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. } | cs |
start = 0; 의 경우 switch문을 주어 plus라는 함수라는 것을 알려주기위하여 변수로 주었다. start또한 Dlg.h에 변수선언 해야함.
first = GetDlgItemInt(IDC_EDIT1); = first변수(Dlg.h에 변수선언)에 현재 edit박스에 있는 숫자를 받아온다.(첫번째 숫자 = first변수에 입력)
GetDlgItemInt : 숫자로 값을 입력받는다.
SetDlgItemText(IDC_EDIT1,L" "); = EDIT창을 " " 비어있는 창으로 표시해준다.
*변수선언시
아래와 같이 설정해준다.
이후 + - * /등 같은 방법으로 해준다.(first 변수와 start변수는 한번씩만 선언해주면 된다)
+의 경우 start 0
-의 경우 start 1
*의 경우 start 2
/의 경우 start 3
으로 flag변수 줌.
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 | void COTLDlg::OnBnClickedminus() //빼기 { start=1; first = GetDlgItemInt(IDC_EDIT1); SetDlgItemText(IDC_EDIT1,L" "); // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. } void COTLDlg::OnBnClickedx() //곱하기 { start=2; first = GetDlgItemInt(IDC_EDIT1); SetDlgItemText(IDC_EDIT1,L" "); // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. } void COTLDlg::OnBnClickedButton11() //나누기 { start=3; first = GetDlgItemInt(IDC_EDIT1); SetDlgItemText(IDC_EDIT1,L" "); } | cs |
4. = 버튼에 switch 문을 주어 사측연산 별로 계산하며, 다음에 입력한 값(문자열로 받은 값) 을 숫자로 바꾸어 준뒤, 앞에서 받은 first값과 계산하고 표시해준다.
double num1 = _wtof(str); 의 경우 str변수에 있는 글자를 num1이라는 숫자변수로 변경 해준다.(왜? 계산해주려고)
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 | void COTLDlg::OnBnClickedOk() //는 계산결과 { switch(start) { case 0: //더하기 { CString str; GetDlgItemText(IDC_EDIT1,str); double num1 = _wtof(str); SetDlgItemInt(IDC_EDIT1,num1+first); break; } case 1: //빼기 { CString str; GetDlgItemText(IDC_EDIT1,str); double num1 = _wtof(str); SetDlgItemInt(IDC_EDIT1,first-num1); break; } case 2: //곱하기 { CString str; GetDlgItemText(IDC_EDIT1,str); double num1 = _wtof(str); SetDlgItemInt(IDC_EDIT1,first*num1); break; } case 3: //나누기 { CString str; GetDlgItemText(IDC_EDIT1,str); double num1 = _wtof(str); if(num1 !=0) SetDlgItemInt(IDC_EDIT1,first/num1); else SetDlgItemText(IDC_EDIT1,L"ERROR"); break; } } } | cs |
5.클리어 버튼의 경우 아래와 같다.
비어있는 text표시해줌.
1 2 3 4 5 | void COTLDlg::OnBnClickedButton12() //클리어 { SetDlgItemText(IDC_EDIT1,L" ");// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. } | cs |