전체 소스 (VC6.0): 723498_WATMakeDlg.zip
실행 파일 : 723502_WATMakeDlg_exe.zip
MFC 형태
MFC 로 만들수 있는 프로그램은 윈도우 모양에 따라 크게 3가지로 나뉜다.
1. Dialog Base
2. Single Document
3. Multi Documents
이 3가지중 Dialog Base 형태의 프로그램을 만들 것이고, 최종 목표는
버튼을 눌렀을때, [안녕하세요]라는 메세지를 띄우는 프로그램을 만드는 것이다.
Dialog Base 기본 프로그램 만들기
[File] => 를 실행
아래와 같은 [New]창이 생성된다.
Projects 형태 : [MFC AppWizard (exe)]
( Projects 에 여러가지가 있는데 여기서는 설명생략. )
Projects name : WATMakeDlg
다른 것들은 디폴트로 둔다.
OK 로 다음으로 진행
What type of application would you like to create? [어떤 형태의 프로그램을 작성할것인가?]
3가지 형태가 있는데 [Dialog based]를 사용하겠다.
그외 것들을 간단히 설명하면,
Single document : 한 프로그램 내에 1개의 문서만 열수 있음.
Multiple documents : 한 프로그램 내에 여러 개의 문서를 열수 있음 (예:MS-Word..)
Dialog based : 특별히 문서를 필요로 하지 않는 간단한 프로그램에 사용 (예 : 계산기)
일단은 step 2부터 마지막 까지는 모두 default 로 하고 진행한다.
[OK]로 진행을 하면 마법사가 끝나고 하나의 프로젝트가 완성될 것이다.
마지막으로 컴파일을 하고 실행을 해보자.[Ctrl + F5]
파일이 없으니, 만들거냐고 물어볼 것이다.(당연히 Yes)
아래처럼 컴파일이 진행된 후에 결과물이 나올것이다.
[결과물]
버튼 추가
버튼을 누르면 메세지 보이기
버튼을 어떻게 넣어야 할까?
아래 그림에서 Controls 도구바에서 선택하면 된다. (윗줄 6번째)
버튼을 (클릭으로) 선택한 후 화면에 그리는 방법과 버튼을 끌어 당겨서 그리는 방법이 있다.
버튼을 추가하고, 속성에서 아래그림처럼 마우스 오른쪽 클릭후 Propeties 를 선택하면 컨트롤의 자세한 설정을 할수 있는 속성창이 뜬다.
ID : 컨트롤 번호
Caption : 화면에 표시할 내용
Visible : 화면에 보여줄 것인가?
Group : 그룹으로 사용할것인가? (조금 복잡함)
Help ID : 도움말에 관련된 사항
Diabled : 수정이 안되게 할것인가?
Tab Step : TAB 키로 포커스를 이동할것인가?
ID 를 IDC_TEST_BUTTON 으로 Caption 을 TEST버튼으로 하겠다.
버튼 이벤트
버튼을 눌렀을 때 실행될 함수는?
버튼을 눌렀을 때 메세지를 보여져야 하는데 어디서 해야 할까?
버튼을 눌렀을 때 실행되는 함수를 만들면 된다.(간단하다)
버튼에서 마우스 오른쪽을 클릭하면 메뉴 중에 [ClassWizard] 라고 있다.
( Classwizard란 프로그램을 쉽게 할수 있게 도와주는 툴이라고 생각하면 된다.)
Object IDs : 해당 컨트롤 ID 를 선택 Messages : 어떤일을 할것인지를 나타냄 BN_CLICKED : 마우스를 클릭했을 경우 BN_DOUBLECLICKED : 마우스를 더블 클릭했을 경우 여기서는 BN_CLICKED (마우스 클릭)를 선택하면 된다.Member functions 현재 클래스에서 만들어진 함수를 보여준다.
Add Class : 새로운 클래스는 만드는 작업 Delete Function: 생성된 함수를 지우는 버튼인데, 지금은 사용을 하지 말것!!. |
필요한 것을 체크 했으니 Add Function 으로 함수를 생성하자.
함수명을 물어보는데, 기본값으로 두자.
OK 후 EDIT code 누르면,
WATTetrisView.cpp 파일의 마지막 줄에
아래와 같은 코드가 생길 것이다.
즉, TEST_BUTTON을 누르면 OnTestButton()함수가 실행이 되는 것이다.
이제 함수안에 메세지를 보이는 내용만 추가하면 된다.
메세지 보이게 하는 것은 한줄이면 된다.
MessageBox(“안녕하세요”);
http://whiteat.com/study/student_wizard.php?file_name=default.c&student_count=10&use_menu=on&INPUT_TYPE=READ_FILE#
////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct _STUDENT_ {
int iNumber;
char name[30];
int kor;
int math;
int eng;
float avg; /* 평균 */
int iRank; /* 석차 */
};
#define MAX_STUDENT_COUNT 10 /* 학생수 */
struct _STUDENT_ infoStudent[MAX_STUDENT_COUNT];
int iRealStudentCount = 0; // 파일에서 읽은 실제 학생수
struct _STUDENT_ structMAXData; // 최고 점수만 기록할 변수
char *GetGrade(int iScore){
if(iScore >=90) return "A";
else if(iScore >=80) return "B";
else if(iScore >=70) return "C";
else if(iScore >=60) return "D";
else return "F";
}
void ViewAllList(){
FILE *fpOutput;
int i;
fpOutput=fopen("output_data.txt", "w");
if(fpOutput){
fprintf(fpOutput,"\n학생수 : %d명",iRealStudentCount);
fprintf(fpOutput,"%s","\n================================================");
fprintf(fpOutput,"\n%s"," 번호 이름 국어 수학 영어 평균 순위 학점\n");
fprintf(fpOutput,"%s","================================================");
printf("\n학생수 : %d명",iRealStudentCount);
printf("%s","\n================================================");
printf("\n%s"," 번호 이름 국어 수학 영어 평균 순위 학점\n");
printf("%s","================================================");
for( i=0;i<MAX_STUDENT_COUNT;i++){
if(0 ==strlen(infoStudent[i].name)) break;
fprintf(fpOutput,"%s","\n");
fprintf(fpOutput,"%4d %6s %4d %4d %4d %5.2lf %4d %4s",infoStudent[i].iNumber,infoStudent[i].name,infoStudent[i].kor,infoStudent[i].math,infoStudent[i].eng,infoStudent[i].avg,infoStudent[i].iRank+1,GetGrade((int)infoStudent[i].avg));
printf("%s","\n");
printf("%4d %6s %4d %4d %4d %5.2lf %4d %4s",infoStudent[i].iNumber,infoStudent[i].name,infoStudent[i].kor,infoStudent[i].math,infoStudent[i].eng,infoStudent[i].avg,infoStudent[i].iRank+1,GetGrade((int)infoStudent[i].avg));
}
fprintf(fpOutput,"%s","\n==============================================");
fprintf(fpOutput,"\n최고점 %4d %4d %4d %5.2lf\n",structMAXData.kor,structMAXData.math,structMAXData.eng,structMAXData.avg);
fprintf(fpOutput,"%s","==============================================");
printf("%s","\n==============================================");
printf("\n최고점 %4d %4d %4d %5.2lf\n",structMAXData.kor,structMAXData.math,structMAXData.eng,structMAXData.avg);
printf("%s","==============================================");
fclose(fpOutput);
}
}
void SortNumber(){
struct _STUDENT_ structTempData;
int i;
int j;
// 번호순으로 정렬
for( i=0;i<iRealStudentCount;i++){
for( j=0;j<iRealStudentCount;j++){
if(infoStudent[i].iNumber < infoStudent[j].iNumber ){
// 데이터 교환
memcpy(&structTempData,&infoStudent[i],sizeof(struct _STUDENT_));
memcpy(&infoStudent[i],&infoStudent[j],sizeof(struct _STUDENT_));
memcpy(&infoStudent[j],&structTempData,sizeof(struct _STUDENT_));
}
}
}
}
void SortName(){
struct _STUDENT_ structTempData;
int i;
int j;
// 번호순으로 정렬
for( i=0;i<iRealStudentCount;i++){
for( j=0;j<iRealStudentCount;j++){
if(strcmp(infoStudent[i].name ,infoStudent[j].name)< 0){
// 데이터 교환
memcpy(&structTempData,&infoStudent[i],sizeof(struct _STUDENT_));
memcpy(&infoStudent[i],&infoStudent[j],sizeof(struct _STUDENT_));
memcpy(&infoStudent[j],&structTempData,sizeof(struct _STUDENT_));
}
}
}
}
void SortRank(){
struct _STUDENT_ structTempData;
int i;
int j;
// 석차순으로 정렬
for( i=0;i<iRealStudentCount;i++){
for( j=i;j<iRealStudentCount;j++){
if(infoStudent[i].iRank > infoStudent[j].iRank ){
// 데이터 교환
memcpy(&structTempData,&infoStudent[i],sizeof(struct _STUDENT_));
memcpy(&infoStudent[i],&infoStudent[j],sizeof(struct _STUDENT_));
memcpy(&infoStudent[j],&structTempData,sizeof(struct _STUDENT_));
}
}
}
}
void InputData(){
int i;
int j;
FILE *fpInput;
char chKor[10]; // 임시로 문자열로 받을 국어 점수
char chmath[10];// 임시로 문자열로 받을 수학 점수
char chEng[10]; // 임시로 문자열로 받을 영어 점수
iRealStudentCount = 0;
fpInput=fopen("input_data.txt", "rt");
if(fpInput)// 꼭 파일이 열렸는지 확인해야 합니다.
{
i = 0;
while(!feof(fpInput) && i<MAX_STUDENT_COUNT) {
fscanf(fpInput, "%s %s %s %s",infoStudent[i].name,chKor,chmath,chEng);
if(0 == strlen(infoStudent[i].name)) break;
infoStudent[i].iNumber = i+1;
infoStudent[i].kor = atoi(chKor);
infoStudent[i].math = atol(chmath);
infoStudent[i].eng = atol(chEng);
infoStudent[i].avg = (float)((infoStudent[i].kor +infoStudent[i].math+infoStudent[i].eng )/3.0);
// 최고점수 갱신
if (structMAXData.kor < infoStudent[i].kor) structMAXData.kor = infoStudent[i].kor;
if (structMAXData.math < infoStudent[i].math) structMAXData.math = infoStudent[i].math;
if (structMAXData.eng < infoStudent[i].eng) structMAXData.eng = infoStudent[i].eng;
if (structMAXData.avg < infoStudent[i].avg) structMAXData.avg = infoStudent[i].avg;
i++;
iRealStudentCount++;
}
fclose(fpInput); // 파일이 열렸을 때만 close 가능
}
// 석차 결정
for( i=0;i<iRealStudentCount;i++){
infoStudent[i].iRank = 0;
for( j=0;j<iRealStudentCount;j++){
if(infoStudent[i].avg < infoStudent[j].avg ){
infoStudent[i].iRank++;
}
}
}
}
int main(){
int i=0;
int j=0;
int iMenu; // 선택된 메뉴
// 최고점수 초기화
structMAXData.kor = 0;
structMAXData.math = 0;
structMAXData.eng = 0;
iMenu = 0;
while((-1 != iMenu)|| (0 == iMenu)){
printf("\n1. 데이터 입력");
printf("\n2. 리스트 보기");
printf("\n3. 번호순으로 정렬");
printf("\n4. 석차순으로 정렬");
printf("\n5. 이름순으로 정렬");
printf("\n메뉴를 선택해 주세요.");
scanf("%d",&iMenu);
switch(iMenu){
case 1:
printf("\n1 번 메뉴.");
InputData();
break;
case 2:
printf("\n2 번 메뉴.");
ViewAllList();
break;
case 3:
printf("\n3 번 메뉴.");
SortNumber();
ViewAllList();
break;
case 4:
printf("\n4 번 메뉴.");
SortRank();
ViewAllList();
break;
case 5:
printf("\n5 번 메뉴.");
SortName();
ViewAllList();
break;
default:
printf("\ndefault메뉴.");
iMenu = (-1);
break;
}
}
ViewAllList();
printf("\n작업 완료!!!!!\n");
return 0;
}