달력 컨트롤] 새로 만든 달력!!!
다시 만들었다.
디자인은 동일하게 가져가고 내부 로직은 좀더 간결하게 바꾸었다.
주차에 대한것은 아래처럼 몇주차를 어렵게 구하지 않고 현재로부터 -1, + 1 형태로 변수 세개로 처리했다.
기존 달력은 문제점이... 조금씩 틀어지는 부분이 있어서 위처럼 1픽셀까지 맞추었다.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
이 달력은 새로 만든 스케쥴러에 사용한 달력임.
휴일과 관련된 내용과 몇 주차 인지에 대해 계산에 사용한 방법등을 기록해본다.
# 해당년도의 1월 1일의 요일에 대한 코드값을 구한다.
int {올해 1월1일 요일} = (int)new DateTime(DateTimeInfo.Year, 1, 1).DayOfWeek;
요일은
일요일 = 0,
월요일 = 1,
...
토요일 = 6
몇주차 구하기 :
한해는 365일로 7로 나누면 52.1... 총 53주가 나옴.
DateTimeInfo.DayOfYear 는 올해 365일중 몇일인지가 나옴.
int 몇주차 = (DateTimeInfo.DayOfYear + {올해 1월1일 요일}) / 7;
if ((DateTimeInfo.DayOfYear + {올해 1월1일 요일}) % 7 > 0) thisWeekCnt++;
전주, 금주, 차주를 구하면서...
년도가 바뀌는 부분인 12월 31일 ~ 1월1일로 지나가는 주차 묶어주는 계산
ex) ((2014 - 2013 )*53) - ((2014-2013)*계산주) + ( 이번주차 - 1)
계산주 같은 경우 전년도 계산주기때문에 12월 마지막주와 새해 1월 1일은 같은 주차가 되는데
12월 마지막주차는 53주차로 위 계산에서 0이 되므로!
12월 마지막주의 전주는 52이므로 1을 더하게 된다.. 이렇게 계산되면 계속 전주차는 계속 줄어듬...
if (StartDateTime.Year == DateTime.Today.Year)
{
int weekGap = thisWeekCnt - calcWeekCnt;
if (weekGap == 0)
{
weekCountButton.Text = "금주";
}
else if (weekGap == 1)
{
weekCountButton.Text = "전주";
}
else if (weekGap == -1)
{
weekCountButton.Text = "차주";
}
else
{
weekCountButton.Text = - (weekGap) + " 주";
}
}
else
{
weekCountButton.Width -= 3;
weekCountButton.Text = -((((DateTime.Today.Year - StartDateTime.Year) * 53) - ((DateTime.Today.Year - StartDateTime.Year) * calcWeekCnt)) + (thisWeekCnt - 1)) + " 주";
}
전주차 ( 년도 변환되는 곳 )
# 국경일 기념일 처리..
private SortedList<DateTime, string> GetDayHolidays(int year)
{
//휴일
SortedList<DateTime, string> holidays = new SortedList<DateTime, string>();
//( 양력 )
holidays.Add(new DateTime(year, 1, 1), "신정"); // 신정
holidays.Add(new DateTime(year, 3, 1), "3.1절"); // 3.1절(5대 국경일)
holidays.Add(new DateTime(year, 5, 5), "어린이날"); // 어린이날
holidays.Add(new DateTime(year, 6, 6), "현충일"); // 현충일
//holidays.Add(new DateTime(year, 7, 17), "제헌절"); // 제헌절 (5대 국경일, 휴일에서 제외됨)
holidays.Add(new DateTime(year, 8, 15), "광복절"); // 광복절 (5대 국경일)
holidays.Add(new DateTime(year, 10, 3), "개천절"); // 개천절(5대 국경일)
holidays.Add(new DateTime(year, 10, 9), "한글날"); // 한글날(5대 국경일)
holidays.Add(new DateTime(year, 12, 25), "크리스마스"); // 크리스마스
//음력
KoreanLunisolarCalendar kc = new KoreanLunisolarCalendar();
//설
holidays.Add(kc.ToDateTime(year, 1, 1, 0, 0, 0, 0), "설");
holidays.Add(kc.ToDateTime(year, 1, 1, 0, 0, 0, 0).AddDays(-1), "설(전)");
holidays.Add(kc.ToDateTime(year, 1, 1, 0, 0, 0, 0).AddDays(+1), "설(후)");
//석가탄신일
holidays.Add(kc.ToDateTime(year, 4, 8, 0, 0, 0, 0), "석가탄신일");
//추석
holidays.Add(kc.ToDateTime(year, 8, 15, 0, 0, 0, 0), "추석");
holidays.Add(kc.ToDateTime(year, 8, 15, 0, 0, 0, 0).AddDays(-1), "추석(전)");
holidays.Add(kc.ToDateTime(year, 8, 15, 0, 0, 0, 0).AddDays(+1), "추석(후)");
return holidays;
}
적용 )
var holidays = DayHolidays.Where(d => (d.Key.Year == _info.DateTimeInfo.Year && d.Key.Month == _info.DateTimeInfo.Month))
.Select(d => new { DAY = d.Key.Day, DESC = d.Value });
if (holidays.Where(d => d.DAY == _info.DateTimeInfo.Day).Count() > 0)
{
_btn.ForeColor = HolidayForeColor;
string tooltip = holidays.Where(d => d.DAY == _info.DateTimeInfo.Day).Select(t => t.DESC).First();
_btn.MouseHover += (s, e) => { toolTip1.SetToolTip(_btn, tooltip); };
}
- 설 같은것 툴팁으로 표시 ( 음력계산기를 이용 함 )
'# 1) 프로그래밍' 카테고리의 다른 글
가장 가까운 점 구하기 (0) | 2014.02.08 |
---|---|
한글분해_결합, 오토마타... (0) | 2014.01.30 |
알고리즘] 2 (0) | 2013.11.15 |
알고리즘] 1 (0) | 2013.11.14 |
C#] 문자열 정렬처리... (0) | 2013.11.10 |