제1장 윈도우 프로그래밍 1.1 윈도우 프로그래밍의 개념 1.2 윈도우 프로그램의 기본 구조 실습 1-1 간단한 Win32 SDK 윈도우 프로그램 만들기 1.3 간단한 윈도우 애플리케이션의 분석 1.4 윈도우 프로그램의 기본 형식
윈도우 프로그래밍의 개념 윈도우 프로그래밍이란? 윈도우 프로그래밍하는 방법 사용자가 발생시키는 이벤트에 대한 메시지를 처리 하는 것 메시지 기반 (Message Driven) 프로그래밍 이벤트 기반 (Event Driven) 프로그래밍 윈도우 프로그래밍하는 방법 Win32 SDK (Software Development Kit) MFC (Microsoft Foundation Class)
윈도우 프로그래밍의 개념 윈도우 프로그래밍의 기본 구조 초기화 부분 메시지를 처리하는 부분
윈도우 프로그래밍의 개념 실제 프로그램에서의 형태 초기화 부분 메시지 처리 부분 Int WINAPI WinMain(… ) { } 메시지 처리 부분 LRESULT CALLBACK WndProc(…) 메시지 처리 루틴
윈도우 프로그래밍의 개념 WinMain 함수 함수 원형과 초기화 내용 윈도우 클래스 생성 윈도우 클래스 등록 Int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpszCmdLine, int nCmdShow) { 윈도우 클래스 생성 윈도우 클래스 등록 프레임 윈도우 생성 프레임 윈도우 화면에 표시 메시지 큐로부터 메시지를 받아 해당 프로시저로 보냄 }
윈도우 프로그래밍의 개념 Procedure 윈도우는 Message Driven 방식 프로시저는 여러 개가 될 수 있다. 윈도우 클래스마다 수행되는 프로시저가 다르다.
윈도우 프로그래밍의 개념 WinProc 함수 윈도우에서 들어온 메시지를 switch문을 이용하 여 처리하는 루틴이다. 함수 원형과 메시지 처리 형태 LRESULT CALLBACK WinProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { Switch(iMsg) 해당 메시지에 대한 처리 }
실습 1-1 간단한 Win32 SDK 프로그램 만들기 이 실습은 화면에 윈도우를 만들고 윈도우에 “I love Window Programming!”이라는 텍스트를 출력하는 SDK 기반의 프로그램을 작성하는 것이다.
실습 1-1 간단한 Win32 SDK 프로그램 만들기 키보드에서 아무 키를 눌렀다가 떼어보면 다음과 같 이 중앙에 메시지가 나올 것이다. [키보드가 눌린 경우] [키보드가 떼어진 경우]
실습 프로그램의 분석 windows.h 파일 WinMain() 함수 이 파일은 윈도우 애플리케이션을 작성하는데 필요한 매크로, 각종 API 함수, 메시지 등이 선언된 헤더 파일 이다. WinMain() 함수 운영체제에 윈도우를 생성하고 등록한다. 메모리에 프레임 윈도우를 생성하고 속성을 초기화하 여 화면에 표시될 수 있도록 한다. 메시지 루프를 생성하여 해당 윈도우에 대한 메시지 를 메시지 큐로부터 받아와 메시지를 해당 윈도우 프 로시저로 보낸다.
실습 프로그램의 분석 WinMain() 함수 윈도우 클래스를 생성한다. WNDCLASSEX WndClass; WndClass.cbSize = sizeof(WNDCLASSEX); WndClass.style = CS_HREDRAW | CS_VREDRAW; WndClass.lpfnWndProc = WndProc; WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.hInstance = hInstance; WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); WndClass.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH); WndClass.lpszMenuName= NULL; WndClass.lpszClassName = szAppName; WndClass.hIconSm = 0;
실습 프로그램의 분석 WinMain() 함수 윈도우 클래스를 등록한다. 프레임 윈도우를 생성한다. RegisterClassEx(&WndClass); 프레임 윈도우를 생성한다. hwnd = CreateWindow( // 윈도우 생성 함수 szAppName, szTitleName, // 타이틀 바에 출력될 문자열 WS_OVERLAPPEDWINDOW,// 윈도우 스타일 CW_USEDEFAULT, // 윈도우 좌측 상단의 x좌표 CW_USEDEFAULT, // 윈도우 좌측 상단의 y좌표 CW_USEDEFAULT, // 윈도우의 너비 CW_USEDEFAULT, // 윈도우의 높이 NULL, // 부모 윈도우의 핸들 NULL, // 메뉴 또는 자식 윈도우의 핸들 hInstance, // 애플리케이션 인스턴스 핸들 NULL // 윈도우 생성 데이터의 주소 );
실습 프로그램의 분석 WInMain() 함수 프레임 윈도우를 화면에 표시한다. 메시지를 처리한다. ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); 메시지를 처리한다. while(GetMessage(&msg, NULL, 0, 0)) { // 가상 키 메시지를 문자 메시지로 변환한다. TranslateMessage(&msg); // 메시지를 해당 윈도우 프로시저로 보낸다. DispatchMessage(&msg); }
실습 프로그램의 분석 WndProc()함수 메시지를 switch문을 이용하여 처리 switch(message) { … case WM_PAINT : hdc = BeginPaint(hwnd, &ps); TextOut(hdc,10,10,szMsg1,strlen(szMsg1)); EndPaint(hwnd, &ps); break; }
윈도우에 텍스트를 출력하는 방법 TextOut() 함수 기본적인 텍스트 출력 함수의 원형 BOOL TextOut( HDC hdc, // 디바이스 컨텍스 핸들 int nXStart, // 문자 출력 시작점 X 좌표 int nYStart, // 문자 출력 시작점 Y 좌표 LPCTSTR lpString, // 출력할 문자열 int cbString // 문자열의 길이 );
윈도우에 텍스트를 출력하는 방법 DrawText() 함수 문자를 출력할 때 어느 영역을 정하고 이 영역에 출력하는 함수 문자를 출력할 때 어느 영역을 정하고 이 영역에 출력하는 함수 함수의 원형 Int DrawText( HDC hdc, // 디바이스 컨텍스 핸들 LPCSTR lpString, // 출력할 문자 int nLength, // 출력할 문자의 수 LPRECT lpRect, // 출력할 영역 UINT Flags // 출력 형식 플러그 );
윈도우에 텍스트를 출력하는 방법 출력 형식 플러그 플러그 값 내 용 DT_TOP 설정된 영역의 상단으로 DT_BOTTOM 내 용 DT_TOP 설정된 영역의 상단으로 DT_BOTTOM 설정된 영역의 하단으로 DT_LEFT 설정된 영역의 좌측으로 DT_RIGHT 설정된 영역의 우측으로 (DT_SINGLELINE과 함께 지정되어야 한다) DT_CENTER 설정된 영역의 가로 중앙에 정렬 DT_VCENTER 설정된 영역의 세로 중앙에 정렬 DT_CALCRECT 텍스트가 출력할 사각형의 영역을 계산 DT_SINGLELINE 행 바꿈과 라인 피드를 무시하고 한 줄로 출력
윈도우 프로그래밍의 개념 윈도우 프로그램의 기본 형식 핸들을 받아서 그 핸들을 사용하거나 핸들을 만들 어서 설정하여 사용한다. 예 : 라인을 그린다. 그릴 화면 핸들을 받고, 라인을 그릴 펜이라는 핸들을 만들고, 펜이라는 핸들을 이용하여 그릴 화면 핸들에 라인을 그린다. 객체를 컨트롤하기 위해 핸들이 필요하다 구조체로 시작하여 구조체로 끝난다 H가 붙지 않는 이상한 것은 모두 구조체이다.
새로운 데이터 형식 MSG 구조체 메시지 큐에 저장되는 정보를 담고 있는 구조체 typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG;
새로운 데이터 형식 WINDOWCLASSEX 구조체 윈도우 속성에 대한 정보를 포함하는 구조체 typedef struct _WNDCLASS { UINT cbSize; // 구조체의 크기를 나타낸다. UINT style; // 윈도우의 스타일을 지정한다. WNDPROC lpfnWndProc; // 윈도우 프로시저에 대한 포인터를 지정한다. int cbClsExtra; int cbWndExtra; HANDLE hInstance; // 프로그램 자체에 대한 핸들을 지정한다. HICON hIcon; // 윈도우에서 사용될 아이콘에 대한 핸들을 지정 HCURSOR hCursor; // 윈도우에서 사용할 커서에 대한 핸들을 지정 HBRUSH hbrBackground; // 윈도우의 백그라운드 브러시에 대한 핸들 지정 LPCTSTR lpszMenuName; // 윈도우에서 메뉴의 이름을 지정하며, // 리소스에서 사용된다. LPCTSTR lpszClassName; // 윈도우 클래스의 이름을 명시한다 HICON hIconSm; // 작은 아이콘에 대한 핸들을 지정한다. } WNDCLASSEX;
새로운 데이터 형식 PAINTSTRUCT 구조체 이 구조체는 텍스트나 이미지를 윈도우의 클라이언 트 영역에 그리고자 할 때, 사용자 정보를 포함 typedef struct tagPAINTSTRUCT { HDC hdc; // 디스플레이 컨텍스트에 대한 핸들을 지정한다. BOOL fErase; // 윈도우의 백그라운드를 다시 그릴지 지정한다. RECT rcPaint; // 그리고자 하는 영역을 사각형 구조체를 이용해 지정한다. BOOL fRestore; // 시스템에 예약되어 있으며, 내부적으로 이용된다. BOOL fIncUpdate; // 시스템에 예약되어 있으며, 내부적으로 이용된다. BYTE rgbReserved[16]; // 시스템에 예약되어 있으며, 내부적으로 이용한다. } PAINTSTRUCT;
새로운 데이터 형식 RECT 구조체 사각형 형태의 좌표를 지정하는 구조체 typedef struct tagRECT { LONG left; // 맨 왼쪽의 좌표를 명시한다. LONG top; // 맨 위쪽의 좌표를 명시한다. LONG right; // 맨 오른쪽의 좌표를 명시한다. LONG bottom; // 맨 아래쪽의 좌표를 명시한다. } RECT;
헝가리언 표기법 변수 이름은 데이터 형식을 의미하는 하나이상 의 소문자로 시작한다. Microsoft의 프로그래머인 Charles Simonyi를 기리는 뜻으로 붙여진 이름 작성한 프로그램에서 오류나 버그가 발생하기 전에 에러를 방지할 수 있게 해준다. 변수의 사용과 더불어 데이터 형식을 기술해 줌으 로써, 데이터 형식 불일치 같은 코딩 오류를 방지 한다.
윈도우 시스템의 이해 윈도우는 GUI 이다. 윈도우는 멀티태스킹을 지원한다. 윈도우는 메시지 기반 구조이다. 윈도우는 윈도우 프로시저를 호출한다.
연습문제 1-1 <실습 1-1>에서 작성한 <간단한 윈도우 프로그 램>을 수정하여 다음과 같은 기능을 취하도록 구현해 보자. 생성된 윈도우에서 마우스 버튼을 눌렀을 경우와 마우 스가 이동 중일 때 윈도우의 중앙에 텍스트를 출력해보 자. 마우스 왼쪽 버튼을 눌렀을 경우에는 “마우스가 눌 러졌습니다.” 라는 텍스트를, 마우스가 이동 중일 경우 는 "마우스가 이동 중 입니다." 라는 텍스트를 출력한다. 왼쪽 마우스 버튼을 떼었을 경우는 출력된 텍스트를 지 운다.
연습문제 1-1 실행 결과 [마우스가 눌린 경우] [마우스가 이동하는 경우]
연습문제 1-2 위에서 작성한 <연습 1-1>에 이어서 마우스 왼쪽 버튼에 대해 다음과 같은 기능이 추가되도록 구현 해보자. 생성된 윈도우에서 마우스가 눌러졌을 경우 “마우스가 눌러졌습니다.” 라는 텍스트와 함께 마우스가 눌린 점의 좌표 값을 마우스를 눌러진 위치에 출력해 보도록 하자.
연습문제 1-2 실행 결과 [마우스가 눌린 경우]