윈도우 API로 윈도우 창(2D 좌표계) 띄우기 변수, 명령문 해석(메시지 개념)


* WinMain 의 인수 해설
- hInstance: 프로그램의 인스턴스 핸들
- hPrevInstancce: 바로 앞에 실행된 현재 프로그램의 인스턴스 핸들. 없을 경우 NULL이 되고 WIN32에서는 항상 NULL이다. 호환성을 위해 존재하는 인수이므로 신경 쓸 필요 없다.
- lpCmdLine: 명령행으로 입력된 프로그램 인수. 도스의 argv인수에 해당함
- nCmdShow: 프로그램이 실행될 형태이며 최소화, 보통모양 등 전달
* 인스턴스(Instance): 클래스가 메모리에 구현된 실체
* 프로그램 인스턴스: 각 독립적으로 실행되는 프로그램

참고)
- CreateWindow 함수: 윈도우에 관한 모든 정보를 메모리에 만든 후 윈도우 핸들을 리턴값으로 넘겨 준다. 이 윈도우 핸들은 hWnd라는 지역 변수에 저장되어 있다가 윈도우를 참조하는 모든 함수의 인수로 사용된다.
- 인수 x, y, nWidth, nHeight에 CW_USERDEFAULT를 쓰면 자동으로 적당히 지정 해줌
- WS_OVERLAPPEDWINDOW: 가장 보편적인 윈도우 스타일을 모아놓은 값. 이를 or 연산자로 바꿔 넣을 수 있다.
#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED | \
WS_CAPTION | \
WS_SYSMENU | \
WS_THICKFRAME | \
WS_MINIMIZEBOX | \
WS_MAXIMIZEBOX)
* 사용 가능한 윈도우 스타일 속성
- WS_CAPTION: 타이틀 바
- WS_HSCROLL: 수평 스크롤 바
- WS_VSCROLL: 수직 스크롤 바
- WS_MAXIMIZEBOX: 최대화 버튼
- WS_MINIMIZEBOX: 최소화 버튼
- WS_SYSMENU: 시스템 메뉴
- WS_THICKFRAME: 크기 조절하는 경계선

* GetMessage
- 시스템이 유지하는 메시지 큐에서 메시지를 읽어들이는 함수
- 함수 원형: BOOL GetMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);
- 읽은 메시지를 MSG구조체에 대입
- 종료 메시지(WM_QUIT)인 경우 False를 리턴, 그외에 True 리턴. 즉, 종료 전까지 while 반복
- 0이 들어간 세 인수는 잘 안쓰이므로 무시할 것
* 메시지는 시스템 변화에 대한 정보이며 MSG라는 구조체에 보관 된다.
typedef struct tagMSG
{
HWND hwnd; //메시지를 받을 윈도우 핸들
UINT message; //메시지 종류(가장 중요한 값)
WPARAM wParam; // 메시지의 부가 정보(32bit)
LPARAM lParam; //메시지의 부가 정보(32bit)
DWORD time; //메시지 발생 시간
POINT pt; //메시지 발생 시 마우스 위치
} MSG;
* BOOL TranslateMessage( CONST MSG *lpMsg);
- 윈도우즈는 키보드의 키가 눌렀(WM_KEYDOWN)다 떨어질때(WM_KEYUP) 문자 입력 키보드 메시지(WM_CHAR)를 발생.
* LONG DispatchMessage( CONST MSG *lpmsg);
- 시스템 메시지 큐에서 꺼낸 메시지(MSG구조체)를 WndProc(메시지 처리 함수)로 전달
- 이 함수에 의해 메시지가 프로그램으로 전달되고, 해당 메시지에 따른 동작을 한다
* 메시지는 실제로 하나의 정수값으로 표현되는데 이를 사용하기 편하도록 매크로 상수를 정의, WM_ 로 시작된다.
* 자주 사용하는 메시지 종류
- WM_QUIT: 프로그램 종료 시 발생 메시지
- WM_LBUTTONDOWN: 마우스 좌측버튼을 누를 때 발생
- WM_CHAR: 키보드 문자 입력 시 발생
- WM_PAINT: 화면을 다시 그릴 때 발생
- WM_DESTROY: 윈도우가 메모리에서 파괴될 때 발생
- WM_CREATE: 윈도우 처음 만들때 발생
* return message.wParm: WM_QUIT 메시지로부터 전달받은 탈출 코드(exit code)

* 메시지 처리 함수 WndProc(Window Procedure - 윈도우 절차)
- 동작 명령에 대한 대부분의 실질적인 처리를 담당하는 함수
- WinMain에서 호출 되는게 아닌 윈도우즈(OS)에 의해 호출
- 함수원형: LRESULT CALLBACK WndProc(HWND hWnd, UINT imessage, WPRAM, LPARAM);
- 인수는 MSG 구조체 맴버 인수 4개와 동일
- hWnd: 메시지를 받을 윈도우 핸들
- iMessage: 받은 메시지의 종류(가장중요)
- wParam, lParam: iMessage의 부가 정보
- 메시지 처리 후 반드시 0을 리턴 해야 한다.(return 0; = break;)
* 콜백(CallBack) 함수: 운영체제의 의해 호출되는 응용 프로그램 내의 함수
* DefWindowProc: WndProc에서 처리 하지 않은 나머지 메시지를 커널에서 처리하도록 전달한다.(예를들어 윈도우 이동, 크기 변경 같은 윈도우가 가진 공통 처리)
* PostQuitMessage: WM_QUIT 메시지 생성 함수(이를 GetMessage가 받아 False를 리턴하여 프로그램 종료)

댓글
댓글 쓰기