티스토리 뷰


이번에는 대화상자 컨트롤에 대해 알아보고, 컨트롤을 이용해 계산기 프로그램을 만들어 보려고 한다.


프로젝트를 처음 생성하게 되면 아래와 같은 화면이 나오게 된다.



대화상자가 보이며, [확인] [취소]는 버튼 컨트롤에 해당하며 CButton 클래스를 사용한다.

여기에 우리는 도구 상자 탭에서 Edit Control을 대화상자에 삽입해보도록 하겠다.



도구상자에서 드래그앤 드롭이나 더블 클릭으로 넣을 수 있다.

대화상자에 원하는 컨트롤을 넣으면 아래와 같은 그림이 된다.



컨트롤의 속성창에 가면 Control ID와 Caption을 설정할 수 있다. 흔히 타이틀이라고 알고 있는 부분이 Caption 부분이다. 



계산 기능을 만들기 위해 컨트롤들을 더 삽입해 보자. 덧셈 기능을 만들어 보려 한다. 먼저 값들을 넣을 Edit Control 2개와 값들의 합을 출력해주는 Edit Control 1개, 그리고 두 개의 값을 더하는 방법은 버튼을 눌러 실행되도록 하려 한다. Edit Control의 ID값은 IDC_EDIT1,2,3 로 표현된다. 



우선 Button1의 속성창에 가서 Caption의 값을 +로 바꾸어 준다.

합산 기능을 만들기 위해 합산 버튼을 더블 클릭하여 함수를 생성해준다. 



그러면 위와 같은 방식으로 함수가 삽입되고 이 함수에


void CExamControlDlg :: OnBnClickedButton1(){

int num1 = GetDlgItemInt(IDC_EDIT1);

int num2 = GetDlgItemInt(IDC_EDIT2);


SetDlgItemInt(IDC_EDIT3, num1 + num2);

}


추가 해주면 된다.

여기서 쓰여진 함수에 대해서 알아보자. GetDlgItemInt 는 다이얼로그 대화상자에서 대화상자, 컨트롤등의 통칭하여 아이템을 정수값으로 얻겠다는 의미이다. 그리고 SetDlgItemInt 는 위의 함수와 반대로 정수값으로 셋팅하겠다는 것이다. 


즉 두 개의 아이템에 입력된 값들을 정수 num1, num2에 저장 후, 덧셈한 값을 IDC_EDIT3에 저장하겠다는 것이다.

이제 코드를 실행하여 값들을 입력하고, [ + ] 버튼을 눌러보자. 그러면 아래와 같은 화면이 출력될 것이다.



정수 합산 계산이 아닌 이번에는 실수 합산 계산 기능을 만들어 보려 한다. 우리가 위에서 만든 계산 기능으로 실수 합산을 시도 했을때, 문제가 발생한다. 



실수 계산시 정수 연산만 된다는 점이다. 즉 소수점 이하는 버려지게 된다.

대화상자에서 값을 가져오는 것은 정수형과 문자열 두가지 밖에 없다. 그래서 실수의 경우는 문자열로 가져와 실수로 변환해주면 된다. 이때 우리가 C언어에서 사용하던 함수인 atoi 함수의 사촌 격인 wtof를 사용해주면 된다.

atoi 함수는 아스키 코드를 정수로 바꿔주는 역할을 해주었는데, 현재 유니코드 체계로 바뀌었기 때문에 wtof 유니코드에서 실수로 바꿔주는 함수를 사용해주면 된다. (MS에서는 _wtof을 사용한다.)


정수 합산 기능을 만든 곳에 가서 실수 합산 기능으로 바꿔주도록 하겠다.


void CExamControlDlg :: OnBnClickedButton1(){


CString str1, str2,str3;


GetDlgItemText(IDC_EDIT1, str1);

GetDlgItemText(IDC_EDIT2, str2);


double num1 = _wtof(str1);

double num2 = _wtof(str2);


str3.Format(L"%f", num1 + num2);

str3.TrimRight('0');

str3.TrimRight('.');

SetDlgItemText(IDC_EDIT3, str3);

} 


각 박스에 입력된 숫자를 문자열로 가져와 실수형으로 변환 후, 연산을 한 다음에 다시 문자열로 보낸다.

위에서 보면 TrimRight이라는 함수가 있는데, 이 함수의 역할에 대해 알아보자.

먼저 이 함수를 사용하지 않고 실행하여 값들을 계산해보면 소수점 6자리까지 출력된다.





필요 없는 숫자 0들이 출력하게 된다. 이 0을 지우기 위해서 TrimRight 함수를 사용하게 되면 우리가 지정한 문자열까지 없애주는 역할을 하게 된다. 위의 코드대로 실행해보면 아래와 같은 화면이 출력된다.




훨씬 보기 좋게 출력이 되는것을 알게 될것이다. 그리고 str3.TrimRight('.'); 값을 사용한 이유는 아래의 화면처럼 출력되기 때문이다.



결과 값 마지막에 . 이 출력된다. 그래서 str3.TrimRight('.');을 사용하게되면 결과 값이 12만 출력되게 된다.


이번에는 숫자 버튼을 눌렀을 때 숫자가 나오도록 해보자. 먼저 숫자 버튼을 추가하고 캡션명을 수정하자.

그리고 각 버튼들을 더블 클릭하여 함수를 추가 하자.





void CExamControlDlg :: OnBnClickedButton2(){

int num = GetDlgItemInt(IDC_EDIT1);

SetDlgItemInt(IDC_EDIT1, num*10 + 1);

}


void CExamControlDlg :: OnBnClickedButton3(){

int num = GetDlgItemInt(IDC_EDIT1);

SetDlgItemInt(IDC_EDIT1, num*10 + 2);

}


void CExamControlDlg :: OnBnClickedButton4(){

int num = GetDlgItemInt(IDC_EDIT1);

SetDlgItemInt(IDC_EDIT1, num*10 + 3);

}


void CExamControlDlg :: OnBnClickedButton5(){

int num = GetDlgItemInt(IDC_EDIT1);

SetDlgItemInt(IDC_EDIT1, num*10 + 4);

}


댓글