관리 메뉴

History

[MFC] 달력 만들기-Step 1 본문

MFC/개인 실습

[MFC] 달력 만들기-Step 1

luckybee 2023. 1. 30. 19:05
728x90
반응형

mfc는 기본적으로 제공되는 달력 컨트롤이 있지만 기능이 한정적이고 달력의 출력 형태를 개발자가 원하는 대로 변경하는 작업도 쉽지 않기 때문에 좀 더 자신의 성향에 맞게 달력을 만들고 싶으면 직접 만들어서 사용하는 것을 권장한다.

 

이번 step1 단계에서는 기본적으로 현재 달을 출력하는 프로그램을 만들어본다.

 

우선 해더에서는 if를 최소한으로 사용하기 위해 배열 변수를 아래처럼 추가해준다.

private:
	wchar_t* mp_week[7] = { L"일",L"월" ,L"화" , L"수" , L"목" , L"금" , L"토" };
	int m_date[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	COLORREF m_date_color[7] = { RGB(255,0,0),RGB(0,0,0), RGB(0,0,0),
                                 RGB(0,0,0), RGB(0,0,0), RGB(0,0,0), RGB(0,0,255) };

 

달력 프로그램을 만들 때 고려해야 할 것 중 하나가 윤년을 계산해야 한다. 윤년은 2월이 29일이 되는 해이다. 

 

윤년은 이번 연도가 4의 배수이면 윤년이지만 100의 배수일 때는 윤년이 아니다. 그러나 400년마다 윤년이 되기 때문에 코드로 작성하기에 되게 어려워 보일 수 있다. 그러나 생각보다 간단하다. 아래 코드를 보자.

 

if (!(a_year%4)&& a_year%100|| !(a_year%400)) { //윤년은 4년에 한번 있고 100년 배수는 윤달이 아니고 400년 단위는 윤달이다.
		m_date[1] = 29;
	}else{  //윤년이 아니면 2월은 28일이다.
		m_date[1] = 28;
	}

위 코드처럼 a_year 변수에는 이번 연도가 저장되어 있다. 이번 년도가 4로 나누었을 때 0이면 1로 바꿔준다. 그리고 100년으로 나눴을 때는 나머지가 0이되면 이번 해는 윤년이 아니기 때문에 조건이 0이 된다. 그러나 400년을 나눌 때는 또 윤년이기 때문에 조건을 ||(or)으로 줘서 400년일 때는 윤년으로 처리했다. 그래서 m_data[1]은 2월이 있는 정수 데이터에 29를 대입한다. 그렇지 않으면 28을 대입한다.

 

이제 이번 년도가 윤년인지 아닌지 알아보았다. 그리고 올해 이번달이 무슨 요일인지 알기 위해 계속해서 코드를 작성하겠다.

 

int days변수를 하나 추가해서 a_year이 올해였으면 -1을 해서 작년 12월 31일까지 모두 방금 선언한 days에 더할 것이다.

코드는 아래와 같다.

int days = 0;
a_year--;
//올해 (2023)이면 작년(2022) 12월 31일까지 계산한다. 
days = a_year * 365 + a_year / 4 - a_year / 100 + a_year / 400;  
//윤달 계산해서 4로 나눴을 때는 1씩 더해줘야하고 100년일 때는 윤달이 아니니까 1씩 빼주고
// 400년일 때는 윤달이니까 1씩 더해준다.

 그 후 이번달-1 즉 저번달까지 지나온 달의 일 수 를 전부 days 변수에 더해준다.

 

for (int i = 0; i < a_month-1; i++){  //ex 4월이면 3월까지의 값을 더해주어서 3월 31일까지 day를 옮긴다.
		days += m_date[i];
}

이제 여기서 days에 +1을 하면 이번달 1일이다.

days++; //3월 31일까지 day를 옮기고 +1을 하면 이번달 1일이다.

그 후 7로 나눈 나머지를 아까 선언한 mp_week 배열의 인덱스로 넣으면 해당 달의 요일이 나온다.

return days % 7;  //전체 일 수를 7로 나누면 이번달 시작 요일이 나온다.

아래는 실행화면이다.

달력 프로그램 실행화면

728x90
반응형
Comments