Presentation is loading. Please wait.

Presentation is loading. Please wait.

제1장 윈도우 프로그래밍 1.1 윈도우 프로그래밍의 개념 1.2 윈도우 프로그램의 기본 구조

Similar presentations


Presentation on theme: "제1장 윈도우 프로그래밍 1.1 윈도우 프로그래밍의 개념 1.2 윈도우 프로그램의 기본 구조"— Presentation transcript:

1 제1장 윈도우 프로그래밍 1.1 윈도우 프로그래밍의 개념 1.2 윈도우 프로그램의 기본 구조
실습 1-1 간단한 Win32 SDK 윈도우 프로그램 만들기 1.3 간단한 윈도우 애플리케이션의 분석 1.4 윈도우 프로그램의 기본 형식

2 윈도우 프로그래밍의 개념 윈도우 프로그래밍이란? 윈도우 프로그래밍하는 방법
사용자가 발생시키는 이벤트에 대한 메시지를 처리하는 것 메시지 기반 (Message Driven) 프로그래밍 이벤트 기반 (Event Driven) 프로그래밍 윈도우 프로그래밍하는 방법 Win32 SDK (Software Development Kit) MFC (Microsoft Foundation Class)

3

4 윈도우 프로그래밍의 개념 윈도우 프로그래밍의 기본 구조 초기화 부분 메시지를 처리하는 부분

5

6

7 윈도우 응용프로그램 개발방식 (Software Development Kit)

8 윈도우 응용프로그램 개발방식 (Rapid Application Development) Visual Basic, Delphi

9 윈도우 응용프로그램 개발방식 MFC(Microsoft Foundation Class Library)

10 SDK 이용한 개발

11 #define WINAPI __stdcall
윈도우 프로그래밍의 개념 실제 프로그램에서의 형태 초기화 부분 int WINAPI WinMain(… ) { } 메시지 처리 부분 LRESULT CALLBACK WndProc(…) 메시지 처리 루틴 #define WINAPI __stdcall

12 윈도우 프로그래밍의 개념 WinMain 함수 함수 원형과 초기화 내용
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpszCmdLine, int nCmdShow) { 윈도우 클래스 생성 윈도우 클래스 등록 프레임 윈도우 생성 프레임 윈도우 화면에 표시 메시지 큐로부터 메시지를 받아 해당 프로시저로 보냄 }

13 WinMain함수 윈도우애플리케이션 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpszCmdLine, int nCmdShow) HINSTANCE hInstance : 애플리케이션 프로그램의 ID HINSTANCE hPrevInstance : 이전 구동시 설정된 인스턴스의 핸들(항상 NULL, 중복시행 방지용, Windows95이후 사용X) LPTSTR lpszCmdLine : 프로그램 구동 시 매개변수(실행파일의 경로 등, 문자열 포인터) int nCmdShow : 처음 화면에 표시될 때 최대화, 최소화, 정상상태

14 윈도우 프로그래밍의 개념 Procedure 윈도우는 Message Driven 방식
프로시저는 여러 개가 될 수 있다. 윈도우 클래스마다 수행되는 프로시저가 다르다.

15 윈도우 프로그래밍의 개념 WinProc 함수 윈도우에서 들어온 메시지를 switch문을 이용하여 처리하는 루틴이다.
함수 원형과 메시지 처리 형태 LRESULT CALLBACK WinProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { Switch(iMsg) 해당 메시지에 대한 처리 }

16 WinProc 함수 결과값을 저장하는 32bit 자료형 LRESULT CALLBACK WinProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) HWND hwnd : 윈도우의 핸들 UINT iMsg : WinMain 함수에서 전달하는 메시지 WPARAM wParam, LPARAM lParam : 메시지와 함께 필요한 정보가 들어오는 매개변수(마우스 클릭시 좌표 등)

17 실습 1-1 간단한 Win32 SDK 프로그램 만들기 이 실습은 화면에 윈도우를 만들고 윈도우에 “I love Window Programming!”이라는 텍스트를 출력하는 SDK 기반의 프로그램을 작성하는 것이다.

18 실습 1-1 간단한 Win32 SDK 프로그램 만들기 키보드에서 아무 키를 눌렀다가 떼어보면 다음과 같이 중앙에 메시지가 나올 것이다. [키보드가 눌린 경우] [키보드가 떼어진 경우]

19

20

21

22

23 Practice1_1.cpp

24 Practice1_1.cpp #include <windows.h>
LRESULT CALLBACK WndProc1(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); // WndProc --> WndProc1 수정함 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpszCmdLine, int nCmdShow) { static TCHAR szAppName[] = "EasyText"; // 윈도우 클래스 이름 static TCHAR szTitleName[] = "Practice1_1"; // 타이틀 바에 출력될 문자열 HWND hwnd; // 윈도우 핸들 MSG msg; // 메시지 구조체 WNDCLASSEX WndClass; // 윈도우 클래스 구조체 // ① 윈도우 클래스 구조체 WndClass에 값을 채워 윈도우 클래스를 등록한다. WndClass.cbSize = sizeof(WNDCLASSEX); // 구조체 크기 WndClass.style = CS_HREDRAW | CS_VREDRAW; // 클래스 스타일 WndClass.lpfnWndProc = WndProc1; // 윈도우 프로시저 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; // 기본적인 작은 아이콘 // 윈도우 클래스를 등록한다. RegisterClassEx(&WndClass); // ② 프레임 윈도우를 생성한다. hwnd = CreateWindow( // 윈도우 생성 API 함수 szAppName, // 등록된 윈도우 클래스 이름 szTitleName, // 타이틀 바에 출력될 문자열 WS_OVERLAPPEDWINDOW, // 윈도우 스타일 CW_USEDEFAULT, // 윈도우 좌측 상단의 x좌표 CW_USEDEFAULT, // 윈도우 좌측 상단의 y좌표 CW_USEDEFAULT, // 윈도우의 너비 CW_USEDEFAULT, // 윈도우의 높이 NULL, // 부모 윈도우의 핸들 NULL, // 메뉴 또는 자식 윈도우의 핸들 hInstance, // 애플리케이션 인스턴스 핸들 NULL // 윈도우 생성 데이터의 주소 ); // 프레임 윈도우를 화면에 표시하고 화면에 표시한다. ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); // ③ 메시지 큐로부터 메시지를 받아와 메시지를 해당 윈도우 프로시저로 보낸다. while(GetMessage(&msg, NULL, 0, 0)) TranslateMessage(&msg); // 메시지를 번역한다. DispatchMessage(&msg); // 메시지를 해당 윈도우 프로시저로 보낸다. } return msg.wParam; Practice1_1.cpp

25 Practice1_1.cpp LRESULT CALLBACK WndProc1(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; // 디바이스 콘텍스트 RECT rect; // RECT 구조체 PAINTSTRUCT ps; // 페인트 구조체 TCHAR szMsg1[] = "I love Window Programming!"; // 윈도우에 출력될 문자열 TCHAR szMsg2[] = "키보드가 눌러졌습니다."; // 키보드를 눌렀을 때 출력될 문자열 TCHAR szMsg3[] = "키보드가 떼어졌습니다."; // 키보드를 떼었을 때 출력될 문자열 // ① 커널에서 들어온 메시지를 switch문을 이용하여 처리 switch(message) case WM_CREATE : // 윈도우가 처음 생성 메시지가 온 경우 break; case WM_PAINT : // 화면에 출력 메시지가 온 경우 hdc = BeginPaint(hwnd, &ps); TextOut(hdc, 10, 10, szMsg1, strlen(szMsg1)); // 윈도우에 문자열을 출력 EndPaint(hwnd, &ps); case WM_KEYDOWN : //키보드 버튼이 눌린 경우 hdc=GetDC(hwnd); GetClientRect(hwnd, &rect); DrawText(hdc, szMsg2, strlen(szMsg2), &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); ReleaseDC(hwnd, hdc); case WM_KEYUP : //키보드 버튼이 떼어진 경우 DrawText(hdc, szMsg3, strlen(szMsg3), &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); case WM_DESTROY : // 프로그램 종료 메시지가 온 경우 PostQuitMessage(0); default : // 그 외의 메시지가 온 경우 return DefWindowProc(hwnd, message, wParam, lParam); } return 0;

26 F7 [빌드]-[솔루션 빌드]

27

28 멀티바이트 문자집합 사용

29 CTRL+F5

30 실습 프로그램의 분석 windows.h 파일 WinMain() 함수
이 파일은 윈도우 애플리케이션을 작성하는데 필요한 매크로, 각종 API 함수, 메시지 등이 선언된 헤더 파일이다. WinMain() 함수 운영체제에 윈도우를 생성하고 등록한다. 메모리에 프레임 윈도우를 생성하고 속성을 초기화하여 화면에 표시될 수 있도록 한다. 메시지 루프를 생성하여 해당 윈도우에 대한 메시지를 메시지 큐로부터 받아와 메시지를 해당 윈도우 프로시저로 보낸다.

31 실습 프로그램의 분석 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;

32 실습 프로그램의 분석 WinMain() 함수 윈도우 클래스를 등록한다. 프레임 윈도우를 생성한다. // hwnd 윈도우 핸들
RegisterClassEx(&WndClass); 프레임 윈도우를 생성한다. // hwnd 윈도우 핸들 hwnd = CreateWindow( // 윈도우 생성 함수 szAppName, szTitleName, // 타이틀 바에 출력될 문자열 WS_OVERLAPPEDWINDOW,// 윈도우 스타일 CW_USEDEFAULT, // 윈도우 좌측 상단의 x좌표 CW_USEDEFAULT, // 윈도우 좌측 상단의 y좌표 CW_USEDEFAULT, // 윈도우의 너비 CW_USEDEFAULT, // 윈도우의 높이 NULL, // 부모 윈도우의 핸들 NULL, // 메뉴 또는 자식 윈도우의 핸들 hInstance, // 애플리케이션 인스턴스 핸들 NULL // 윈도우 생성 데이터의 주소 );

33 실습 프로그램의 분석 WInMain() 함수 프레임 윈도우를 화면에 표시한다. 메시지를 처리한다.
ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); 메시지를 처리한다. while(GetMessage(&msg, NULL, 0, 0)) { // 가상 키 메시지를 문자 메시지로 변환한다. TranslateMessage(&msg); // 메시지를 해당 윈도우 프로시저로 보낸다. DispatchMessage(&msg); }

34 실습 프로그램의 분석 WndProc()함수 메시지를 switch문을 이용하여 처리 switch(message) { …
case WM_PAINT : hdc = BeginPaint(hwnd, &ps); TextOut(hdc,10,10,szMsg1,strlen(szMsg1)); EndPaint(hwnd, &ps); break; }

35 윈도우에 텍스트를 출력하는 방법 TextOut() 함수 기본적인 텍스트 출력 함수의 원형 BOOL TextOut(
HDC hdc, // 디바이스 컨텍스 핸들 int nXStart, // 문자 출력 시작점 X 좌표 int nYStart, // 문자 출력 시작점 Y 좌표 LPCTSTR lpString, // 출력할 문자열 int cbString // 문자열의 길이 );

36 윈도우에 텍스트를 출력하는 방법 DrawText() 함수 문자를 출력할 때 어느 영역을 정하고 이 영역에 출력하는 함수
함수의 원형 Int DrawText( HDC hdc, // 디바이스 컨텍스 핸들 LPCSTR lpString, // 출력할 문자 int nLength, // 출력할 문자의 수 LPRECT lpRect, // 출력할 영역 UINT Flags // 출력 형식 플러그 );

37 윈도우에 텍스트를 출력하는 방법 출력 형식 플러그 플러그 값 내 용 DT_TOP 설정된 영역의 상단으로 DT_BOTTOM
내 용 DT_TOP 설정된 영역의 상단으로 DT_BOTTOM 설정된 영역의 하단으로 DT_LEFT 설정된 영역의 좌측으로 DT_RIGHT 설정된 영역의 우측으로 (DT_SINGLELINE과 함께 지정되어야 한다) DT_CENTER 설정된 영역의 가로 중앙에 정렬 DT_VCENTER 설정된 영역의 세로 중앙에 정렬 DT_CALCRECT 텍스트가 출력할 사각형의 영역을 계산 DT_SINGLELINE 행 바꿈과 라인 피드를 무시하고 한 줄로 출력

38 윈도우 프로그래밍의 개념 윈도우 프로그램의 기본 형식 핸들을 받아서 그 핸들을 사용하거나 핸들을 만들어서 설정하여 사용한다.
예 : 라인을 그린다. 그릴 화면 핸들을 받고, 라인을 그릴 펜이라는 핸들을 만들고, 펜이라는 핸들을 이용하여 그릴 화면 핸들에 라인을 그린다. 객체를 컨트롤하기 위해 핸들이 필요하다 구조체로 시작하여 구조체로 끝난다 H가 붙지 않는 이상한 것은 모두 구조체이다.

39 새로운 데이터 형식 MSG 구조체 메시지 큐에 저장되는 정보를 담고 있는 구조체 typedef struct tagMSG {
HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG;

40 새로운 데이터 형식 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;

41 새로운 데이터 형식 PAINTSTRUCT 구조체
이 구조체는 텍스트나 이미지를 윈도우의 클라이언트 영역에 그리고자 할 때, 사용자 정보를 포함 typedef struct tagPAINTSTRUCT { HDC hdc; // 디스플레이 컨텍스트에 대한 핸들을 지정한다. BOOL fErase; // 윈도우의 백그라운드를 다시 그릴지 지정한다. RECT rcPaint; // 그리고자 하는 영역을 사각형 구조체를 이용해 지정한다. BOOL fRestore; // 시스템에 예약되어 있으며, 내부적으로 이용된다. BOOL fIncUpdate; // 시스템에 예약되어 있으며, 내부적으로 이용된다. BYTE rgbReserved[16]; // 시스템에 예약되어 있으며, 내부적으로 이용한다. } PAINTSTRUCT;

42 새로운 데이터 형식 RECT 구조체 사각형 형태의 좌표를 지정하는 구조체 typedef struct tagRECT {
LONG left; // 맨 왼쪽의 좌표를 명시한다. LONG top; // 맨 위쪽의 좌표를 명시한다. LONG right; // 맨 오른쪽의 좌표를 명시한다. LONG bottom; // 맨 아래쪽의 좌표를 명시한다. } RECT;

43 #include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpszCmdLine, int nCmdShow) { static TCHAR szAppName[] = "EasyText"; // 윈도우 클래스 이름 static TCHAR szTitleName[] = "Practice1_1";// 타이틀 바에 출력될 문자열 HWND hwnd;// 윈도우 핸들 MSG msg;// 메시지 구조체 WNDCLASSEXWndClass; // 윈도우 클래스 구조체 // ① 윈도우 클래스 구조체 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; // 기본적인 작은 아이콘

44 // 윈도우 클래스를 등록한다. RegisterClassEx(&WndClass); // ② 프레임 윈도우를 생성한다. hwnd = CreateWindow(// 윈도우 생성 API 함수 szAppName,// 등록된 윈도우 클래스 이름 szTitleName,// 타이틀 바에 출력될 문자열 WS_OVERLAPPEDWINDOW,// 윈도우 스타일 CW_USEDEFAULT,// 윈도우 좌측 상단의 x좌표 CW_USEDEFAULT,// 윈도우 좌측 상단의 y좌표 CW_USEDEFAULT,// 윈도우의 너비 CW_USEDEFAULT,// 윈도우의 높이 NULL,// 부모 윈도우의 핸들 NULL,// 메뉴 또는 자식 윈도우의 핸들 hInstance,// 애플리케이션 인스턴스 핸들 NULL// 윈도우 생성 데이터의 주소 ); // 프레임 윈도우를 화면에 표시하고 화면에 표시한다. ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); // ③ 메시지 큐로부터 메시지를 받아와 메시지를 해당 윈도우 프로시저로 보낸다. while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg);// 메시지를 번역한다. DispatchMessage(&msg);// 메시지를 해당 윈도우 프로시저로 보낸다. } return msg.wParam;

45 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{ HDC hdc;// 디바이스 콘텍스트 RECT rect;// RECT 구조체 PAINTSTRUCT ps;// 페인트 구조체 TCHAR szMsg1[] = "I love Window Programming!"; // 윈도우에 출력될 문자열 TCHAR szMsg2[] = "키보드가 눌러졌습니다."; // 키보드를 눌렀을 때 출력될 문자열 TCHAR szMsg3[] = "키보드가 떼어졌습니다."; // 키보드를 떼었을 때 출력될 문자열

46 // ① 커널에서 들어온 메시지를 switch문을 이용하여 처리
switch(message) { case WM_CREATE :// 윈도우가 처음 생성 메시지가 온 경우 break; case WM_PAINT :// 화면에 출력 메시지가 온 경우 hdc = BeginPaint(hwnd, &ps); TextOut(hdc, 10, 10, szMsg1, strlen(szMsg1)); // 윈도우에 문자열을 출력 EndPaint(hwnd, &ps); case WM_KEYDOWN ://키보드 버튼이 눌린 경우 hdc=GetDC(hwnd); GetClientRect(hwnd, &rect); DrawText(hdc, szMsg2, strlen(szMsg2), &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); ReleaseDC(hwnd, hdc); case WM_KEYUP ://키보드 버튼이 떼어진 경우 DrawText(hdc, szMsg3, strlen(szMsg3), &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); case WM_DESTROY :// 프로그램 종료 메시지가 온 경우 PostQuitMessage(0); default :// 그 외의 메시지가 온 경우 return DefWindowProc(hwnd, message, wParam, lParam); } return 0;

47 헝가리언 표기법 변수 이름은 데이터 형식을 의미하는 하나이상의 소문자로 시작한다.
Microsoft의 프로그래머인 Charles Simonyi를 기리는 뜻으로 붙여진 이름 작성한 프로그램에서 오류나 버그가 발생하기 전에 에러를 방지할 수 있게 해준다. 변수의 사용과 더불어 데이터 형식을 기술해 줌으로써, 데이터 형식 불일치 같은 코딩 오류를 방지한다.

48 윈도우 시스템의 이해 윈도우는 GUI 이다. 윈도우는 멀티태스킹을 지원한다. 윈도우는 메시지 기반 구조이다.
윈도우는 윈도우 프로시저를 호출한다.

49 연습문제 1-1 <실습 1-1>에서 작성한 <간단한 윈도우 프로그램>을 수정하여 다음과 같은 기능을 취하도록 구현해 보자. 생성된 윈도우에서 마우스 버튼을 눌렀을 경우와 마우스가 이동 중일 때 윈도우의 중앙에 텍스트를 출력해보자. 마우스 왼쪽 버튼을 눌렀을 경우에는 “마우스가 눌러졌습니다.” 라는 텍스트를, 마우스가 이동 중일 경우는 "마우스가 이동 중 입니다." 라는 텍스트를 출력한다. 왼쪽 마우스 버튼을 떼었을 경우는 출력된 텍스트를 지운다.

50 연습문제 1-1 실행 결과 [마우스가 눌린 경우] [마우스가 이동하는 경우]

51 연습문제 1-2 위에서 작성한 <연습 1-1>에 이어서 마우스 왼쪽 버튼에 대해 다음과 같은 기능이 추가되도록 구현해보자. 생성된 윈도우에서 마우스가 눌러졌을 경우 “마우스가 눌러졌습니다.” 라는 텍스트와 함께 마우스가 눌린 점의 좌표 값을 마우스를 눌러진 위치에 출력해 보도록 하자.

52 연습문제 1-2 실행 결과 [마우스가 눌린 경우]

53 LPTSTR szMsg1 = "I love Window Programming!";
// 윈도우에 출력될 문자열 LPTSTR szMsg2 = "키보드가 눌러졌습니다."; // 키보드를 눌렀을 때 출력될 문자열 LPTSTR szMsg3 = "키보드가 떼어졌습니다."; // 키보드를 떼었을 때 출력될 문자열 LPTSTR szMsg4 = "마우스가 눌러졌습니다."; // 마우스를 눌렀을 때 출력될 문자열 LPTSTR szMsg5 = "마우스가 이동 중입니다."; // 마우스가 이동 중일 때 출력될 문자열 LPTSTR szMsg6 = new char[10];

54 마우스 버턴이 눌린 위치에 출력 원래 그려진 것을 지우고 새로 그린다 전체 클라이언트 영역
case WM_LBUTTONDOWN: hdc = GetDC(hwnd); GetClientRect(hwnd, &rect); // "마우스가 눌러졌습니다." DrawText(hdc,szMsg4, strlen(szMsg4), &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); MousePoint.x = LOWORD(lParam); // WndProc에 전달된 lParam 좌표 MousePoint.y = HIWORD(lParam); wsprintf(szMsg6, "X:%ld, Y:%ld", MousePoint.x, MousePoint.y); TextOut(hdc, MousePoint.x, MousePoint.y, szMsg6, strlen(szMsg6)); // X:??, Y:?? ReleaseDC(hwnd, hdc); break; case WM_MOUSEMOVE : GetClientRect(hwnd, &rect); // “마우스가 이동 중입니다” DrawText(hdc,szMsg5, strlen(szMsg5), &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); case WM_LBUTTONUP : InvalidateRect(hwnd, NULL, TRUE); // 윈도우 클라이언트 영역을 다시 그린다. 마우스 버턴이 눌린 위치에 출력 원래 그려진 것을 지우고 새로 그린다 전체 클라이언트 영역

55


Download ppt "제1장 윈도우 프로그래밍 1.1 윈도우 프로그래밍의 개념 1.2 윈도우 프로그램의 기본 구조"

Similar presentations


Ads by Google