MFC :: Chapter 3 (메시지 처리) - 92번째 이야기
메시지 처리의 기본 개념
1) 메시지의 종류
윈도우 메시지는 메시지를 처리하는 주체에 따라 윈도우 메시지, 컨트롤 통지 메시지, 그리고 명령 메시지로 나눌 수 있다.
윈도우 메시지(Windows Message)
WM_으로 시작하는 메시지로 매개 변수를 가지고 있어 메시지를 어떻게 처리할 것인지를 결정하는데 사용한다. (WM_COMMAND는 제외)
윈도우 관리 메시지 : 윈도우의 상태가 바뀔 때 발생한다.
초기화 메시지 : 응용 프로그램이 메뉴나 대화상자를 구성할 때 발생한다.
입력 메시지 : 마우스, 키보드로 입력할 때 발생한다.
컨트롤 통지 메시지(Control Notification Message)
컨트롤 통지 메시지는 Button, Combo Box와 같은 제어 객체나 자식 윈도우에서 부모 윈도우로 보내는 메시지다.
명령 메시지(Command Message)
명령 메시지는 메뉴, 툴바, 액셀러레이터 키와 같은 상요자 인터페이스 객체로부터 발생되는 WM_COMMAND 메시지이다. 명령 메시지는 윈도우 뿐만 아니라 도큐먼트, 도큐먼트 템플릿 뷰, 다른 애플리케이션 객체에 의해 발생될 수도 있다.
2) 메시지 맵(Message Map)
앞에서 언급했듯이 Win32 SDK 프로그램에서는 윈도우 시스템에서 들어온 메시지를 switch문을 사용하여 처리하였다. 그러나 MFC에서는 메시지 처리를 위해 메시지 맵이라는 매커니즘을 사용하고 있다. 메시지 맵은 메시지 번화와 메시지가 발생하였을 때 호출되는 함수의 포인터 등의 정보를 갖고 있는 테이블로 프로그램에 전달된 메시지와 메시지 핸들러 함수를 연결하는데 사용한다. 메시지 맵에 파생 클래스의 메시지 핸들러 함수를 등록하면 기저 클래스의 함수를 무시하고, 파생 클래스의 함수를 호출해 준다.
MFC에서 메시지를 처리하기 위해서는 다음의 세 가지 단계가 필요하다.
1. 윈도우 클래스의 멤버 함수로 메시지 핸들러 함수를 선언한다.
2. 메시지 맵에 메시지와 메시지 핸들러 함수를 묶는 메시지의 매크로를 추가한다.
3. 메시지 핸들러 함수의 기능을 구현한다.
Class Wizard의 중요 기능의 하나가 메시지 매핑이라고 앞에서 언급하였다. 애플리케이션에서 Class Wizard를 사용하면 위의 세 가지 단계에서 마지막 단계의 메시지 핸들러 함수의 본체만 사용자가 구현하면 되도록 나머지는 자동으로 코딩을 해준다. 그러나 Class Wizard가 모든 메시지를 처리해 주는 것은 아니다. 자식 윈도우에서 발생하는 메시지나 사용자가 만든 메시지에 대한 처리는 직접 코딩으로 작성해주어야 한다.
3) 메시지 핸들러(Message Handler) 함수
메시지 핸들러(Message Handler) 함수는 윈도우로부터 애플리케이션에 메시지가 전달될 때 해당 메시지를 처리하는 맴버 함수이다. 함수 이름은 윈도우 메시지 이름을 따서 윈도우 메시지의 WM_을 떼고, 대신 On을 붙여서 시작하고 함수 선언시에 afx_msg를 붙여 메시지 핸들러 함수라는 것을 나타낸다. 예를 들어 WM_KEYDOWN에 대한 메시지 핸들러 함수는 OnKeyDown() 함수이고 클래스 선언부에 다음과 같이 써준다.
// {AFX_MSG(Practice3_1View)
afx_msg void OnKeyDown()
...
// }}AFX_MSG
사용자가 어떤 동작을 취하면 윈도우 시스템은 프로그램에게 그 동작을 알려주기 위해서 프로그램의 메시지 큐에 메시지를 넣어주고 프로그램은 메시지 큐에서 하나씩 메시지를 꺼내어 그 메시지에 해당하는 함수를 호출해준다. 윈도우 메시지와 함게 추가적으로 들어온 정보는 메시지 핸들러 함수에서 처리될 수 있도록 그 함수의 인자로 넘겨준다.
다음은 윈도우에서 설정되는 중요한 메시지들에 대해 메시지 유형, 메시지 발생상황 그리고 메시지 핸들러 함수의 이름들을 설명하였다. 이 메시지들은 Class Wizard로 만들 수 있는 기본 메시지 들이다.
메시지 유형 발생 상황 메시지 핸들러 함수
-------------------------------------------------------------------------------------
WM_CREATE 윈도우가 생성될 때 OnCreate()
WM_ACTIVE 윈도우가 활성화될 때 OnActive()
WM_PAINT 윈도우가 다시 그려져야 될 때 OnPaint()
WM_SIZE 윈도우가 생성될 때,윈도우 크기가 변경될 때 OnSize()
WM_MOVE 윈도우가 움직일 때 OnMove()
WM_TIMER 설정한 타이머 시간이 됐을 때 OnTimer()
WM_DESTROY 윈도우가 종료될 때 OnDestroy()
-------------------------------------------------------------------------------------
메시지 박스
메시지 박스는 MFC 프로그램을 작성하는데 상당히 많이 사용되는 것이므로 여기서 자세히 설명하고자 한다. 메시지 박스는 사용자에게 간단한 메시지를 출력하는데 사용되는 대화상자이다. 메시지 박스를 출력하려면 AfxMessageBox() 함수를 이용한다. 이 함수의 원형은 다음과 같다.
int AfxMessageBox (LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0);
( lpszText : 출력하고자 하는 문자열
nType : 메시지 박스 출력 스타일(버튼, 아이콘)
nIDHelp : 현재 상태에서 F1 키를 눌러 도움말을 실행하였을 때의 도움말 ID )
디폴트로 메시지 박스 버튼 스타일은 MB_OK이고, 메시지 박스 아이콘 스타일은 MB_ICONEXCLAMATION으로 설정되어 있다. 메시지 박스 버튼 스타일은 OR(|) 연산자로 조합하여 설정할 수 있다. 메시지 박스는 출력되는 아무 버튼이나 누르면 메시지 박스가 종료되는데, 어떤 버튼이 눌렸는지에 따라 AfxMessageBox() 함수의 반환 값이 달라진다. 다음은 메시지 박스 버튼 스타일과 반환 값을 나타내고 있다.
메시지 박스 버튼 스타일 사용가능한 버튼 AfxMessageBox 함수의 반환 값
-------------------------------------------------------------------------------------
MB_OK 확인 IDOK
MB_OKCANCLE 확인, 취소 IDOK, IDCANCLE
MB_YESNO 예, 아니오 IDYES, IDNO
MB_YESNOCANCLE 예, 아니오, 취소 IDYES, IDNO, IDCANCLE
MB_RETRYCANCLE 재시도, 취소 IDRETRY, IDCANCLE
MB_ABORTRETRYIGNORE 취소, 재시도, 무시 IDABORT, IDRETRY, IDIGNORE
-------------------------------------------------------------------------------------
또한 메시지 박스에는 아이콘을 배치하고자 할 경우 다음과 같은 기호상수를 OR(|) 연산자로 조합하여 설정할 수 있다. 다음은 출력되는 아이콘(생략)과 메시지 박스 아이콘 스타일을 나타내고 있다.
메시지 박스 아이콘 스타일
-------------------------
[위험] MB_ICONHAND, MB_ICONSTOP, MB_ICONERROR
[물음] MB_ICONQUESTION
[경고] MB_ICONEXCLAMATION, MB_ICONWARNING
[정보] MB_ICONASTERISK, MB_ICONINFORMATION
마우스 메시지
마우스를 통한 입력은 메시지 형태로 프로그램에 전달된다. 따라서 마우스 입력을 처리한다는 것은 마우스 메시지를 어떻게 처리하느냐에 따라 달려있다. 자주 사용하는 마우스 메시지와 메시지 핸들러 함수는 다음과 같다.
마우스의 메시지 핸들러 함수들을 살펴보면 nFlags와 point라는 파라미터를 제공한다. nFlags는 버튼이 눌리면서 키ㅗ드에서 특정한 키가 눌려졌을 때의 값이나 마우스 눌림 값이고, point는 클라이언트 영역의 현재 무으스 좌표 값을 CPoint 클래스를 이용하여 제공한다. 윈도우의 클라이언트 영역은 좌측 상단 좌표가 (0,0)으로 하는 상대좌표이다. 다음은 nFlags가 가질 수 있는 값이다.
MK_CONTROL : 컨트롤 키가 눌림
MK_LBUTTON : 왼쪽 마우스 버튼 눌림
MK_MBUTTON : 가운데 마우스 버튼 눌림
MK_RBUTTON : 오른쪽 마우스 버튼 눌림
MK_SHIFT : 쉬프트 키가 눌림
예를 들어 nFlags & MK_LBUTTON의 값이 0이 아니면 마우스 메시지와 함께 왼쪽 마우스 버튼이 눌려졌다는 의미이다.
SetTimer() 함수
SetTimer() 함수는 지정된 시간 간격마다 WM_TIMER 메시지를 발생시켜 타이머를 설정하는 함수이다. 함수의 원형은 다음과 같다.
UINT SetTimer (UINT nIDEvent, UINT nElapse, TIMERPROC lpTimerFunc);
( nIDEvent : 타이머 ID이다. 이 타이머 ID는 OnTimer() 함수의 인자로 전달되며 이를 이용하여 여러 개의 타이머를 설정할 수 있다.
nElapse : WM_TIMER 메시지를 발생시킬 시간 간격이다. 사용되는 단위는 1000분의 1초로 1000을 적어주면 1초에 한 번씩 WM_TIMER 메시지를 발생시킨다.
lpTimerFunc : WM_TIMER 메시지가 발생되었을 때 실행되는 함수이다. NULL이 설정되면 OnTimer() 함수가 호출된다. )
CTime 클래스
CTime 클래스는 시관과 날짜를 표현하고, 저장하기 위한 클래스이다. 다음은 주요 CTime 클래스의 멤버 함수를 설명하고 있다.
GetTime : time_t 값을 리턴한다 (1970/1/1 0시 ~ 현재까지 초 값)
GetYear : 연도를 리턴한다 (1970 ~ 2038)
GetMonth : 월을 리턴한다 (1~12)
GetDay : 일을 리턴한다 (1~31)
GetHour : 시간을 리턴한다 (0~24)
GetMinute : 분을 리턴한다 (0~59)
GetSecond : 초를 리턴한다 (0~59)
GetDayOfWeek : 요일을 리턴한다 (1-일요일, 2- 월요일, ...)
위의 멤버 함수 대신 간단하개 Format() 함수를 이용하여 시간을 출력할 수 있다. Format 함수는 현재 시간을 CTime의 형식에 맞추어 CString 형태로 반환한다. 함수의 원형은 다음과 같다.
CString Format (LPCTSTR pFormat) const;
다음은 pFormat에서 사용할 수 있는 형식 지정자이다.
%D : CTime으로의 전체 일수
%H : 현재 시간
%M : 현재 분
%S : 현재 초
CTime::GetCurrentTime() 함수
GetCurrentTime() 멤버 함수는 윈도우 시스템으로부터 윈도우 시스템의 현재 날짜와 시간을 얻어 CTime 객체를 생성해 준다. 여기서 GetCurrentTIme() 멤버 함수는 CTime 클래스의 정적 멤버 함수(static member function)이므로 클래스 이름과 참조 영역 지정자(::)를 붙여 호출한다. 함수의 원형은 다음과 같다.
static CTime PASCAL GetCurrentTime();
KillTimer() 함수
KillTimer() 함수는 타이머를 해제하는 함수로 함수의 원형은 다음과 같다.
BOOL KillTImer(int nIDEvent);
( nIDEvent : SetTimer() 함수에서 설정한 Timer ID )
키보드 메시지
키보드 입력도 마우스 입력고 같이 메시지 형태로 프로그램에 전달된다. 따라서 키보드 입력을 처리한다는 것은 키보드 메시지를 어덯게 처리하느냐에 따라 달려있다. 자주 사용하는 키보드 메시지와 메시지 핸들러 함수는 다음과 같다.
WM_CHAR 메시지는 키보드가 눌려짐에 따라 문자가 입력되는 것이고 문자가 입력된 사건에 의해 WM_CHAR 메시지가 발생한다. WM_CHAR 메시지는 WM_KEYDOWN 메시지가 발생한 후 추가로 발생하는 메시지 이며, WM_CHAR 메시지 다음에 WM_KEYUP 메시지가 발생한다. 키보드 메시지 핸들러 함수들을 살펴보면 다음 세 가지의 인수를 전달 받는다.
nChar : 눌려진 키의 가상키 코드이다. WM_CHAR 메시지의 경우에는 눌려진 키의 문자코드 값이다.
nRepCount : 키를 계속 누르고 있는 경우 반복된 키의 입력횟수가 전달된다.
nFlags : 스캔코드, 이전 키 상태, 키가 눌려질 때의 알트 키의 상태에 관한 정보가 전달 된다.
자주 사용되는 가상키 코드는 다음과 같다.
VK_CANCLE : 컨트롤 + Break VK_LEFT : 왼쪽 커서 키
VK_BACK : 백스페이스 키 VK_RIGHT : 오른쪽 커서 키
VK_TAB : 탭 키 VK_UP : 위쪽 커서 키
VK_RETURN : 엔터 키 VK_DOWN : 아래쪽 커서 키
VK_SHIFT : 쉬프트 키 VK_INSERT : Insert 키
VK_CONTROL : 컨트롤 키 VK_DELETE : Delete 키
VK_MENU : 알트 키 VK_HOME : Home 키
VK_CAPITAL : Caps Lock 키 VK_END : End 키
VK_ESCAPE : ESC 키 VK_PRIOR : Page Up 키
VK_SPACE : 스페이스 키 VK_NEXT : Page Down 키
VK_SCROLL : Scroll Lock 키 VK_F1~VK_F10 : Function 키
CString::GetLength() 함수
GetLength() 함수는 CString 객체에서 바이트의 수를 얻기 위해 호출되는 함수로 원형은 다음과 같다.
int GetLength() const;
CString::Delete() 함수
Delete() 함수는 CString 객체에서 입력받은 데이터를 삭제할 때 이용하는 함수로 원형은 다음과 같다.
int Delete(int nIndex, int nCount = 1)
( nIndex : 지우고자 하는 첫 번째 문자를 가리킨다.
nCount : 문자를 nCount 개수 만큼 지운다.
1) 메시지의 종류
윈도우 메시지는 메시지를 처리하는 주체에 따라 윈도우 메시지, 컨트롤 통지 메시지, 그리고 명령 메시지로 나눌 수 있다.
윈도우 메시지(Windows Message)
WM_으로 시작하는 메시지로 매개 변수를 가지고 있어 메시지를 어떻게 처리할 것인지를 결정하는데 사용한다. (WM_COMMAND는 제외)
윈도우 관리 메시지 : 윈도우의 상태가 바뀔 때 발생한다.
초기화 메시지 : 응용 프로그램이 메뉴나 대화상자를 구성할 때 발생한다.
입력 메시지 : 마우스, 키보드로 입력할 때 발생한다.
컨트롤 통지 메시지(Control Notification Message)
컨트롤 통지 메시지는 Button, Combo Box와 같은 제어 객체나 자식 윈도우에서 부모 윈도우로 보내는 메시지다.
명령 메시지(Command Message)
명령 메시지는 메뉴, 툴바, 액셀러레이터 키와 같은 상요자 인터페이스 객체로부터 발생되는 WM_COMMAND 메시지이다. 명령 메시지는 윈도우 뿐만 아니라 도큐먼트, 도큐먼트 템플릿 뷰, 다른 애플리케이션 객체에 의해 발생될 수도 있다.
2) 메시지 맵(Message Map)
앞에서 언급했듯이 Win32 SDK 프로그램에서는 윈도우 시스템에서 들어온 메시지를 switch문을 사용하여 처리하였다. 그러나 MFC에서는 메시지 처리를 위해 메시지 맵이라는 매커니즘을 사용하고 있다. 메시지 맵은 메시지 번화와 메시지가 발생하였을 때 호출되는 함수의 포인터 등의 정보를 갖고 있는 테이블로 프로그램에 전달된 메시지와 메시지 핸들러 함수를 연결하는데 사용한다. 메시지 맵에 파생 클래스의 메시지 핸들러 함수를 등록하면 기저 클래스의 함수를 무시하고, 파생 클래스의 함수를 호출해 준다.
MFC에서 메시지를 처리하기 위해서는 다음의 세 가지 단계가 필요하다.
1. 윈도우 클래스의 멤버 함수로 메시지 핸들러 함수를 선언한다.
2. 메시지 맵에 메시지와 메시지 핸들러 함수를 묶는 메시지의 매크로를 추가한다.
3. 메시지 핸들러 함수의 기능을 구현한다.
Class Wizard의 중요 기능의 하나가 메시지 매핑이라고 앞에서 언급하였다. 애플리케이션에서 Class Wizard를 사용하면 위의 세 가지 단계에서 마지막 단계의 메시지 핸들러 함수의 본체만 사용자가 구현하면 되도록 나머지는 자동으로 코딩을 해준다. 그러나 Class Wizard가 모든 메시지를 처리해 주는 것은 아니다. 자식 윈도우에서 발생하는 메시지나 사용자가 만든 메시지에 대한 처리는 직접 코딩으로 작성해주어야 한다.
3) 메시지 핸들러(Message Handler) 함수
메시지 핸들러(Message Handler) 함수는 윈도우로부터 애플리케이션에 메시지가 전달될 때 해당 메시지를 처리하는 맴버 함수이다. 함수 이름은 윈도우 메시지 이름을 따서 윈도우 메시지의 WM_을 떼고, 대신 On을 붙여서 시작하고 함수 선언시에 afx_msg를 붙여 메시지 핸들러 함수라는 것을 나타낸다. 예를 들어 WM_KEYDOWN에 대한 메시지 핸들러 함수는 OnKeyDown() 함수이고 클래스 선언부에 다음과 같이 써준다.
// {AFX_MSG(Practice3_1View)
afx_msg void OnKeyDown()
...
// }}AFX_MSG
사용자가 어떤 동작을 취하면 윈도우 시스템은 프로그램에게 그 동작을 알려주기 위해서 프로그램의 메시지 큐에 메시지를 넣어주고 프로그램은 메시지 큐에서 하나씩 메시지를 꺼내어 그 메시지에 해당하는 함수를 호출해준다. 윈도우 메시지와 함게 추가적으로 들어온 정보는 메시지 핸들러 함수에서 처리될 수 있도록 그 함수의 인자로 넘겨준다.
다음은 윈도우에서 설정되는 중요한 메시지들에 대해 메시지 유형, 메시지 발생상황 그리고 메시지 핸들러 함수의 이름들을 설명하였다. 이 메시지들은 Class Wizard로 만들 수 있는 기본 메시지 들이다.
메시지 유형 발생 상황 메시지 핸들러 함수
-------------------------------------------------------------------------------------
WM_CREATE 윈도우가 생성될 때 OnCreate()
WM_ACTIVE 윈도우가 활성화될 때 OnActive()
WM_PAINT 윈도우가 다시 그려져야 될 때 OnPaint()
WM_SIZE 윈도우가 생성될 때,윈도우 크기가 변경될 때 OnSize()
WM_MOVE 윈도우가 움직일 때 OnMove()
WM_TIMER 설정한 타이머 시간이 됐을 때 OnTimer()
WM_DESTROY 윈도우가 종료될 때 OnDestroy()
-------------------------------------------------------------------------------------
메시지 박스
메시지 박스는 MFC 프로그램을 작성하는데 상당히 많이 사용되는 것이므로 여기서 자세히 설명하고자 한다. 메시지 박스는 사용자에게 간단한 메시지를 출력하는데 사용되는 대화상자이다. 메시지 박스를 출력하려면 AfxMessageBox() 함수를 이용한다. 이 함수의 원형은 다음과 같다.
int AfxMessageBox (LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0);
( lpszText : 출력하고자 하는 문자열
nType : 메시지 박스 출력 스타일(버튼, 아이콘)
nIDHelp : 현재 상태에서 F1 키를 눌러 도움말을 실행하였을 때의 도움말 ID )
디폴트로 메시지 박스 버튼 스타일은 MB_OK이고, 메시지 박스 아이콘 스타일은 MB_ICONEXCLAMATION으로 설정되어 있다. 메시지 박스 버튼 스타일은 OR(|) 연산자로 조합하여 설정할 수 있다. 메시지 박스는 출력되는 아무 버튼이나 누르면 메시지 박스가 종료되는데, 어떤 버튼이 눌렸는지에 따라 AfxMessageBox() 함수의 반환 값이 달라진다. 다음은 메시지 박스 버튼 스타일과 반환 값을 나타내고 있다.
메시지 박스 버튼 스타일 사용가능한 버튼 AfxMessageBox 함수의 반환 값
-------------------------------------------------------------------------------------
MB_OK 확인 IDOK
MB_OKCANCLE 확인, 취소 IDOK, IDCANCLE
MB_YESNO 예, 아니오 IDYES, IDNO
MB_YESNOCANCLE 예, 아니오, 취소 IDYES, IDNO, IDCANCLE
MB_RETRYCANCLE 재시도, 취소 IDRETRY, IDCANCLE
MB_ABORTRETRYIGNORE 취소, 재시도, 무시 IDABORT, IDRETRY, IDIGNORE
-------------------------------------------------------------------------------------
또한 메시지 박스에는 아이콘을 배치하고자 할 경우 다음과 같은 기호상수를 OR(|) 연산자로 조합하여 설정할 수 있다. 다음은 출력되는 아이콘(생략)과 메시지 박스 아이콘 스타일을 나타내고 있다.
메시지 박스 아이콘 스타일
-------------------------
[위험] MB_ICONHAND, MB_ICONSTOP, MB_ICONERROR
[물음] MB_ICONQUESTION
[경고] MB_ICONEXCLAMATION, MB_ICONWARNING
[정보] MB_ICONASTERISK, MB_ICONINFORMATION
마우스 메시지
마우스를 통한 입력은 메시지 형태로 프로그램에 전달된다. 따라서 마우스 입력을 처리한다는 것은 마우스 메시지를 어떻게 처리하느냐에 따라 달려있다. 자주 사용하는 마우스 메시지와 메시지 핸들러 함수는 다음과 같다.
|
메시지 유형 |
발생 상황 |
메시지 핸들러 함수 |
| WM_MOUSEMOVE | 마우스를 이동 | OnMouseMove() |
| WM_LBUTTONDBCLK | 왼쪽 마우스 버튼을 더블 클릭 | OnLButtonDblClk() |
| WM_LBUTTONDOWN | 왼쪽 마우스 버튼을 누름 | OnLButtonDown() |
| WM_RBUTTONUP | 왼쪽 마우스 버튼을 놓음 | OnLButtonUp() |
| WM_RBUTTONDBCLK | 오른쪽 마우스 버튼을 더블 클릭 | OnRButtonDblClk() |
| WM_RBUTTONDOWN | 오른쪽 마우스 버튼을 누름 | OnRButtonDown() |
| WM_RBUTTONUP | 오른쪽 마우스 버튼을 놓음 | OnRButtonUp() |
마우스의 메시지 핸들러 함수들을 살펴보면 nFlags와 point라는 파라미터를 제공한다. nFlags는 버튼이 눌리면서 키ㅗ드에서 특정한 키가 눌려졌을 때의 값이나 마우스 눌림 값이고, point는 클라이언트 영역의 현재 무으스 좌표 값을 CPoint 클래스를 이용하여 제공한다. 윈도우의 클라이언트 영역은 좌측 상단 좌표가 (0,0)으로 하는 상대좌표이다. 다음은 nFlags가 가질 수 있는 값이다.
MK_CONTROL : 컨트롤 키가 눌림
MK_LBUTTON : 왼쪽 마우스 버튼 눌림
MK_MBUTTON : 가운데 마우스 버튼 눌림
MK_RBUTTON : 오른쪽 마우스 버튼 눌림
MK_SHIFT : 쉬프트 키가 눌림
예를 들어 nFlags & MK_LBUTTON의 값이 0이 아니면 마우스 메시지와 함께 왼쪽 마우스 버튼이 눌려졌다는 의미이다.
SetTimer() 함수
SetTimer() 함수는 지정된 시간 간격마다 WM_TIMER 메시지를 발생시켜 타이머를 설정하는 함수이다. 함수의 원형은 다음과 같다.
UINT SetTimer (UINT nIDEvent, UINT nElapse, TIMERPROC lpTimerFunc);
( nIDEvent : 타이머 ID이다. 이 타이머 ID는 OnTimer() 함수의 인자로 전달되며 이를 이용하여 여러 개의 타이머를 설정할 수 있다.
nElapse : WM_TIMER 메시지를 발생시킬 시간 간격이다. 사용되는 단위는 1000분의 1초로 1000을 적어주면 1초에 한 번씩 WM_TIMER 메시지를 발생시킨다.
lpTimerFunc : WM_TIMER 메시지가 발생되었을 때 실행되는 함수이다. NULL이 설정되면 OnTimer() 함수가 호출된다. )
CTime 클래스
CTime 클래스는 시관과 날짜를 표현하고, 저장하기 위한 클래스이다. 다음은 주요 CTime 클래스의 멤버 함수를 설명하고 있다.
GetTime : time_t 값을 리턴한다 (1970/1/1 0시 ~ 현재까지 초 값)
GetYear : 연도를 리턴한다 (1970 ~ 2038)
GetMonth : 월을 리턴한다 (1~12)
GetDay : 일을 리턴한다 (1~31)
GetHour : 시간을 리턴한다 (0~24)
GetMinute : 분을 리턴한다 (0~59)
GetSecond : 초를 리턴한다 (0~59)
GetDayOfWeek : 요일을 리턴한다 (1-일요일, 2- 월요일, ...)
위의 멤버 함수 대신 간단하개 Format() 함수를 이용하여 시간을 출력할 수 있다. Format 함수는 현재 시간을 CTime의 형식에 맞추어 CString 형태로 반환한다. 함수의 원형은 다음과 같다.
CString Format (LPCTSTR pFormat) const;
다음은 pFormat에서 사용할 수 있는 형식 지정자이다.
%D : CTime으로의 전체 일수
%H : 현재 시간
%M : 현재 분
%S : 현재 초
CTime::GetCurrentTime() 함수
GetCurrentTime() 멤버 함수는 윈도우 시스템으로부터 윈도우 시스템의 현재 날짜와 시간을 얻어 CTime 객체를 생성해 준다. 여기서 GetCurrentTIme() 멤버 함수는 CTime 클래스의 정적 멤버 함수(static member function)이므로 클래스 이름과 참조 영역 지정자(::)를 붙여 호출한다. 함수의 원형은 다음과 같다.
static CTime PASCAL GetCurrentTime();
KillTimer() 함수
KillTimer() 함수는 타이머를 해제하는 함수로 함수의 원형은 다음과 같다.
BOOL KillTImer(int nIDEvent);
( nIDEvent : SetTimer() 함수에서 설정한 Timer ID )
키보드 메시지
키보드 입력도 마우스 입력고 같이 메시지 형태로 프로그램에 전달된다. 따라서 키보드 입력을 처리한다는 것은 키보드 메시지를 어덯게 처리하느냐에 따라 달려있다. 자주 사용하는 키보드 메시지와 메시지 핸들러 함수는 다음과 같다.
|
메시지 유형 |
발생 상황 |
메시지 핸들러 함수 |
| WM_KEYDOWN | 키를 누름 | OnKeyDown() |
| WM_KEYUP | 키에서 손을 땜 | OnKeyUp() |
| WM_CHAR | 화면에 문자가 표시되는 키를 누름 | OnKeyChar() |
WM_CHAR 메시지는 키보드가 눌려짐에 따라 문자가 입력되는 것이고 문자가 입력된 사건에 의해 WM_CHAR 메시지가 발생한다. WM_CHAR 메시지는 WM_KEYDOWN 메시지가 발생한 후 추가로 발생하는 메시지 이며, WM_CHAR 메시지 다음에 WM_KEYUP 메시지가 발생한다. 키보드 메시지 핸들러 함수들을 살펴보면 다음 세 가지의 인수를 전달 받는다.
nChar : 눌려진 키의 가상키 코드이다. WM_CHAR 메시지의 경우에는 눌려진 키의 문자코드 값이다.
nRepCount : 키를 계속 누르고 있는 경우 반복된 키의 입력횟수가 전달된다.
nFlags : 스캔코드, 이전 키 상태, 키가 눌려질 때의 알트 키의 상태에 관한 정보가 전달 된다.
자주 사용되는 가상키 코드는 다음과 같다.
VK_CANCLE : 컨트롤 + Break VK_LEFT : 왼쪽 커서 키
VK_BACK : 백스페이스 키 VK_RIGHT : 오른쪽 커서 키
VK_TAB : 탭 키 VK_UP : 위쪽 커서 키
VK_RETURN : 엔터 키 VK_DOWN : 아래쪽 커서 키
VK_SHIFT : 쉬프트 키 VK_INSERT : Insert 키
VK_CONTROL : 컨트롤 키 VK_DELETE : Delete 키
VK_MENU : 알트 키 VK_HOME : Home 키
VK_CAPITAL : Caps Lock 키 VK_END : End 키
VK_ESCAPE : ESC 키 VK_PRIOR : Page Up 키
VK_SPACE : 스페이스 키 VK_NEXT : Page Down 키
VK_SCROLL : Scroll Lock 키 VK_F1~VK_F10 : Function 키
CString::GetLength() 함수
GetLength() 함수는 CString 객체에서 바이트의 수를 얻기 위해 호출되는 함수로 원형은 다음과 같다.
int GetLength() const;
CString::Delete() 함수
Delete() 함수는 CString 객체에서 입력받은 데이터를 삭제할 때 이용하는 함수로 원형은 다음과 같다.
int Delete(int nIndex, int nCount = 1)
( nIndex : 지우고자 하는 첫 번째 문자를 가리킨다.
nCount : 문자를 nCount 개수 만큼 지운다.


Practice3_1.rar
댓글을 달아 주세요.
MFC공부에 도움이 마니 될거같아요!!!Chapter1~13까지 담아가요!!
출처는 글의 맨아래에 적어두었습니다. 감사합니다.!! // 202.30.128.***