MFC 프로그래밍을 활용한 시간/날짜 프로그램

  • 최초 작성일: 2022년 2월 7일 (월)

목차

[TOC]

실습

프로젝트 생성

image

image

image

image


다이얼로그 편집/디자인

image

image


코드 작성

‘MClock.Dlg.h’ 헤더 파일에 변수 선언을 위해 [Solution Explorer]-[MClock]-[Header Files]에서 ‘MClockDlg.h’ 을 더블클릭하고 다음과 같이 코드를 추가한다.

image

// CMClockDlg dialog
class CMClockDlg : public CDialogEx
{
// Construction
public:
	CMClockDlg(CWnd* pParent = nullptr);	// standard constructor

	CRect screen;		// 화면 크기 저장 변수
	int vsize, hsize;	// 폭과 높이 변수

	UINT htimer;  // 타이머를 위한 변수

// Dialog Data


다음으로 OnInitDialog() 함수의 변수를 초기화 시켜준다.

[Class View]-[MClock]-[CMClockDlg]-[OnInitDialog()]를 더블클릭한 후 다음과 같이 코드를 추가한다.

image


이제는 날짜와 시간을 출력하기 위해 ‘WM_TIMER’ 메시지를 추가한다.

[Ctrl + Shift + X] 키 혹은 [Menu]-[Project]-[Class Wizard] 를 클릭해서 클래스 마법사를 실행시켜 다음과 같이 WM_TIMER 메시지를 더블클릭해 ‘OnTimer’ 함수를 추가하고, OnTimer()에 코드를 추가한다.

image

void CMClockDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: Add your message handler code here and/or call default
	CTime gct = CTime::GetCurrentTime();

	CString strDate;
	CString strTime;

	strDate.Format(_T("%d 년 %d 월 %d 일 "), gct.GetYear(), gct.GetMonth(), gct.GetDay());
	GetDlgItem(IDC_STATIC_DATE)->SetWindowText((LPCTSTR)strDate);

	strTime.Format(_T("%d 시 %d 분 %d 초 "), gct.GetHour(), gct.GetMinute(), gct.GetSecond());
	GetDlgItem(IDC_STATIC_TIME)->SetWindowText((LPCTSTR)strTime);

	Invalidate();

	CDialogEx::OnTimer(nIDEvent);
}


실행 결과 1

image


위의 실행된 결과는 윈도우가 고정되어 있으나, 마우스 이동 시 움직이는 마우스를 피해서 창이 이동하기 위한 ‘WM_SETCURSOR’ 메시지를 추가한다.

[Ctrl+Shift+X] 키 혹은 [Menu]-[Project]-[Class Wizard] 를 클릭해서 클래스 마법사를 실행시켜 다음과 같이 WM_SETCURSOR 메시지를 더블클릭해 ‘OnSetCurosor’ 함수를 추가하고, OnSetCursor()에 코드를 추가한다.

image

BOOL CMClockDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
	// TODO: Add your message handler code here and/or call default
	RECT winpos;
	int x = rand() % (screen.right - vsize);	// rand() : 0~32767 사이의 임의의 숫자 발생
	int y = rand() % (screen.bottom - hsize);	// 화면내 이동
	winpos.top = y;
	winpos.bottom = y + hsize;
	winpos.left = x;
	winpos.right = x + vsize;
	MoveWindow(&winpos, TRUE);	// 윈도우 이동

	return CDialogEx::OnSetCursor(pWnd, nHitTest, message);
}


실행 결과 2


마지막으로, 프로그램 종료 시 타이머를 삭제하기 위해 ‘WM_CLOSE’ 메시지를 추가한다.

[Ctrl+Shift+X] 키 혹은 [Menu]-[Project]-[Class Wizard] 를 클릭해서 클래스 마법사를 실행시켜 다음과 같이 WM_CLOSE 메시지를 더블클릭해 ‘OnClose’ 함수를 추가하고, OnClose()에 코드를 추가한다.

image

void CMClockDlg::OnClose()
{
	// TODO: Add your message handler code here and/or call default
	KillTimer(htimer);

	CDialogEx::OnClose();
}