win32 api programming

94
이 이 이 1

Upload: hercules-pasha

Post on 04-Jan-2016

274 views

Category:

Documents


7 download

DESCRIPTION

Win32 API Programming. 이 계 임. Windows Programming. GUI 기반 Multitasking 환경 장치 독립성 (Device Independent) 일관된 사용자 인터페이스 이벤트 처리 방식 ( 메시지 구동 방식 ) 리소스 사용 메뉴 , 비트맵 , 아이콘. What is API?. API(Application Programming Interface) 운영체제가 응용 프로그램을 위해 제공하는 함수의 집합 .  C Library - PowerPoint PPT Presentation

TRANSCRIPT

이 계 임

1

GUI 기반Multitasking 환경장치 독립성 (Device Independent)일관된 사용자 인터페이스이벤트 처리 방식 ( 메시지 구동 방식 )리소스 사용

메뉴 , 비트맵 , 아이콘

2

API(Application Programming Interface)운영체제가 응용 프로그램을 위해 제공하는 함수의

집합 . C Library응용 프로그램 개발자들이 운영체제가 제공하는

기능들을 사용할 수 있도록 운영체제가 제공하는 함수의 집합 .

SDK(S/W Development Kit)API 를 이용하여 프로그램을 개발하는 개발툴 킷API 와 유사한 의미로 사용됨 .

3

4H/W SystemH/W System

Device DriverDevice Driver

GDIGDIKernelKernel UserUser

User ApplicationUser Application

APIAPI

MFCMFC

Windows

SDKAPI 를 사용하여 개발

Class LibraryMFC, OWL 등 클래스 중심의 프로그래밍

Visual ToolsVB, Delphi 등

5

운영체제를 이해하기 위해서 반드시 필요함 .다른 개발 방법을 사용하더라고 API 를 결국 알아야

하기 때문 .프로그램 개발 시 프로그래머의 융통성 (flexibility)

를 극대화 하기 위해 필요함 .

윈도우즈 프로그래밍의 기본

6

Hungarian Notation접두어를 사용하여 변수의 자료형 알려줌 .

7

접두어 원래말 의미

cb Count of Bytes 바이트 수

dw Double Word 부호없는 long 형 정수

h Handle 윈도우 , 비트맵 , 파일 등의 핸들

sz Null Terminated NULL 종료 문자열

ch Character 문자형

a Array 배열

w Word 부호없는 정수형

i 또는 n Integer 정수형

b Bool 논리형

lp 또는 p Long Pointer 포인터형

windows.h 에 정의

8

자료형 의미BYTE unsigned char

WORD unsigned short

DWORD unsigned long

UINT unsigned int

LONG long

LPSTR char*

LPCSTR const char*

BOOL int (TRUE, FALSE)

대상에 붙여진 번호로 32bit 정수값윈도우 핸들 , DC 핸들 , 펜 핸들 , 브러쉬 핸들 ,

메모리 핸들 등운영체제가 발급하며 사용자는 이 핸들을

사용하기만 한다 .같은 종류의 핸들은 중복될 수 없다 .핸들값 저장에 사용되는 자료형

HWND, HDC, HPEN, HBRUSH 등

9

프로그램의 시작점 (Entry Point) : 프로그램 초기화 및 시작 .

메인 윈도우를 화면에 만들고 출력 .int APIENTRY WinMain(HINSTANCE int APIENTRY WinMain(HINSTANCE

hInstance, HINSTANCE hPrevInstance, hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow);LPSTR lpszCmdParam, int nCmdShow);hInstance : 프로그램의 인스턴스 핸들hPrevInstance : Win32 에서는 항상 NULLlpszCmdParam : 명령행 인수nCmdShow : 프로그램 실행 형태 ( 보통 , 최소화 ,

최대화 등 )

10

11

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow){

① 윈도우 클래스 정의② 윈도우 클래스 등록③ 윈도우 객체 생성④ 화면에 윈도우 보이기⑤ Message Loop

}

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow){

① 윈도우 클래스 정의② 윈도우 클래스 등록③ 윈도우 객체 생성④ 화면에 윈도우 보이기⑤ Message Loop

}

만들어질 윈도우의 특성을 정의하는 구조체style : 윈도우스타일 (CS_HREDRAW|CS_VREDRAW)lpfnWndProc : 윈도우의 메시지 처리 함수 이름

WndProc 가 일반적인 이름cbClsExtra, cbWndExtra : 예약영역hInstance : 프로그램의 인스턴스 핸들hIcon, hCursor : 마우스 커서와 아이콘 지정

LoadCursor(), LoadIcon() 함수로 지정hbrBackground : 윈도우의 배경색을 칠한 브러시 지정 .

GetStockObject() 함수로 윈도우 기본 브러시 지정lpszMenuName : 프로그램이 사용할 메뉴 지정lpszClassName : 윈도우 클래스 이름 ( 문자열 )

12

운영체제에 윈도우 클래스 등록

13

WNDCLASS WndClass;WndClass.cbClsExtra=0;WndClass.cbWndExtra=0;WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_B

RUSH);WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);WndClass.hInstance=hInstance;WndClass.lpfnWndProc=(WNDPROC)WndProc;WndClass.lpszClassName=lpszClass;WndClass.lpszMenuName=NULL;WndClass.style=CS_HREDRAW | CS_VREDRAW;

RegisterClass(&WndClass);

WNDCLASS WndClass;WndClass.cbClsExtra=0;WndClass.cbWndExtra=0;WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_B

RUSH);WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);WndClass.hInstance=hInstance;WndClass.lpfnWndProc=(WNDPROC)WndProc;WndClass.lpszClassName=lpszClass;WndClass.lpszMenuName=NULL;WndClass.style=CS_HREDRAW | CS_VREDRAW;

RegisterClass(&WndClass);

HWND CreateWindow(lpszClassName, HWND CreateWindow(lpszClassName, lpszWindowName, dwStyle, x, y, nWidth, hHeight, lpszWindowName, dwStyle, x, y, nWidth, hHeight, hWndParent, hMenu, hInst, lpvParam);hWndParent, hMenu, hInst, lpvParam); lpszClassName : 윈도우 클래스 이름 lpszWindowName : 윈도우 타이틀 바 문자열 dwStyle : 윈도우의 형태 지정

WS_OVERLAPEDWINDOW 사용 x, y, nWidth, nHeight : 윈도우의 위치와 크기 지정

CW_USERDEFAULT 사용 hWndParent : 부모 윈도우의 핸들 hMenu : 메뉴 핸들 hInst : 프로그램의 인스턴스 핸들 hpvParam : CREATESTRUCT 구조체 (NULL)

만들어진 윈도우는 메모리 상에만 존재할 뿐 화면 출력되지 않음 .

14

BOOL ShowWindow(hWnd, nCmdShow)BOOL ShowWindow(hWnd, nCmdShow)hWnd : 화면에 출력할 윈도우 핸들nCmdShow : 윈도우의 화면 출력 방법

SW_HIDE, SW_MINIMIZE, SW_MAXIMIZE, SW_RESTORE, SW_SHOW, SW_SHOWNORMAL

15

hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT, NULL, (HMENU)NULL, hInstance, NULL);

ShowWindow(hWnd, nCmdShow);

hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT, NULL, (HMENU)NULL, hInstance, NULL);

ShowWindow(hWnd, nCmdShow);

이벤트 발생을 정보화 한 것 메시지

16

Event 발생마우스 누름Event 발생마우스 누름 정보화

메시지

이벤트가 발생한윈도우 핸들

이벤트의 종류

이벤트 발생 시각

이벤트 발생 위치

17

시스템큐

이벤트 발생이벤트 발생

메시지메시지어플리케이션 큐

WinMain(){

}

메시지루프

메시지루프

WndProc(){

}

윈도우프로시저윈도우

프로시저

PostMessagePostMessage

SendMessageSendMessage

디폴트 윈도우 프로시저

디폴트 윈도우 프로시저

운영체제

BOOL GetMessage(lpMsg, hWnd, wFilterMin, BOOL GetMessage(lpMsg, hWnd, wFilterMin, wFilterMax);wFilterMax); 메시지 큐에서 메시지를 읽어들임 읽은 메시지가 WM_QUIT 인 경우에만 FALSE 리턴

메시지 루프 종료BOOL TranslateMessage(lpMsg);BOOL TranslateMessage(lpMsg);

키보드 입력 메시지를 WM_CHAR 메시지로 변환BOOL DispatchMessage(lpMsg);BOOL DispatchMessage(lpMsg);

메시지를 운영체제로 전달하여 운영체제가 윈도우 프로시저를 호출하도록 함

18

while(GetMessage(&Message,0,0,0) {TranslateMessage(&Message);DispatchMessage(&Message);

}

while(GetMessage(&Message,0,0,0) {TranslateMessage(&Message);DispatchMessage(&Message);

}

메시지 전달 시 사용hWnd : 메시지 받을 윈도우 핸들message : 메시지의 종류

windows.h 에 매크로로 정의되어 있음wParam : 메시지에 대한 부가 정보lParam : 메시지에 대한 부가 정보time : 메시지 발생 시간pt : 메시지 발생시 마우스 위치

메시지의 종류에 따라 wParam, lParam 의 의미가 달라짐

19

사용자 /시스템이 전달하는 메시지 처리 .프로그램의 실질직이고 고유한 처리 .운영체제에 의해 호출 콜백함수LRESULT CALLBACK WndProc(HWND LRESULT CALLBACK WndProc(HWND

hWnd, UINT iMessage, WPARAM hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam);wParam, LPARAM lParam);hWnd : 메시지가 전달될 윈도우 핸들iMessage : 메시지의 종류wParam : 메시지의 부가 정보lParam : 메지시의 부가 정보

20

메시지의 종류에 따른 처리방법을 switch case 문을 이용하여 기술

디폴트 윈도우 프로시저 : 윈도우 프로시저에서 처리하지 않은 메시지 처리

21

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage, WPARAM wParam, LPARAM lParam)

{switch(iMessage) {case WM_DESTROY:

PostQuitMessage(0);return 0;

}

return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage, WPARAM wParam, LPARAM lParam)

{switch(iMessage) {case WM_DESTROY:

PostQuitMessage(0);return 0;

}

return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}

출력에 필요한 정보를 담고 있는 구조체폰트 , 선의 색상과 굵기 , 채움 무늬와 색상 , 출력

방법 등모든 GDI 출력 함수는 DC 에 대한 핸들을 이용하여

그리기를 수행출력을 위해서는 우선 DC 를 얻어야 함

DC 생성 방법GetDC(), ReleaseDC() 함수 이용BeginPaint(), EndPaint() 함수 이용 :

WM_PAINT 메시지 처리 루틴에서만 사용

22

화면에 무효화 영역 (Invalid Region) 이 있을 때 발생

윈도우의 작업 영역이 지워졌음을 운영체제가 프로그램에 알려줌

화면을 보관 /복구하는 메커니즘 필요모든 그래픽 출력은 WM_PAINT 메시지 시 처리모든 프로그램은 화면 복원을 위해 출력 내용을

보관하거나 복구할 준비를 해야 함

23

BOOL TextOut(HDC hdc, int x, int y, BOOL TextOut(HDC hdc, int x, int y, LPCTSTR lpStr, int cbStr);LPCTSTR lpStr, int cbStr);

UINT SetTextAlign(HDC hdc, UINT fMode);UINT SetTextAlign(HDC hdc, UINT fMode);int DrawText(HDC hdc, LPCTSTR lpStr, int int DrawText(HDC hdc, LPCTSTR lpStr, int

nCount, LPRECT lpRect, UINT uFormat);nCount, LPRECT lpRect, UINT uFormat);

24

Rect rt={200,200,400,400};

SetTextAlign(hdc, TA_CENTER);TextOut(hdc, 100, 100, “Hello World”, 11);

DrawText(hdc, “Good-Bye”, -1, &rt, DT_CENTER|DT_VCENTER| DT_SINGLELINE);

Rect rt={200,200,400,400};

SetTextAlign(hdc, TA_CENTER);TextOut(hdc, 100, 100, “Hello World”, 11);

DrawText(hdc, “Good-Bye”, -1, &rt, DT_CENTER|DT_VCENTER| DT_SINGLELINE);

COLORREF SetPixel(HDC hdc, int x, int y, COLORREF SetPixel(HDC hdc, int x, int y, COLORREF crColor);COLORREF crColor);

DWORD MoveToEx(HDC hdc, int x, int y, DWORD MoveToEx(HDC hdc, int x, int y, LPPOINT lpPoint);LPPOINT lpPoint);

BOOL LineTo(HDC hdc, int x, int y);BOOL LineTo(HDC hdc, int x, int y);BOOL Rectangle(HDC hdc, int left, int top, int BOOL Rectangle(HDC hdc, int left, int top, int

right, int bottom);right, int bottom);BOOL Ellipse(HDC hdc, int left, int top, int BOOL Ellipse(HDC hdc, int left, int top, int

right, int bottom);right, int bottom);

25

int MessageBox(HWND hWnd, LPCTSTR int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);lpText, LPCTSTR lpCaption, UINT uType);hWnd : 메시지 박스의 오너 윈도우lpText : 메시지 박스에 출력할 문자열lpCaption : 메시지 박스의 제목 문자열uType : 버튼 종류 및 아이콘 종류

MB_OK, MB_OKCANCEL, MB_RETRYCANCEL, MB_YESNO, MB_YESNOCANCEL, MB_ABORTRETRYCANCEL 등

MB_ICONWARNING, MB_ICONINFORMATION, MB_ICONQUESTION, MB_ICONSTOP 등

리턴 값으로 눌린 버튼의 ID 전달26

27

종료 버튼 클릭또는 Alt+F4

WM_CLOSE 메시지 발생

WM_CLOSE 메시지 발생

디폴트 윈도우프로시저 전달디폴트 윈도우프로시저 전달

DestroyWindow호출

DestroyWindow호출

WM_DESTROY메시지 발생

WM_DESTROY메시지 발생

윈도우 프로시저전달

윈도우 프로시저전달

PostQuitMessage호출

PostQuitMessage호출

WM_QUIT메시지 발생WM_QUIT메시지 발생

WinMain 의메시지 루프 탈출

WinMain 의메시지 루프 탈출

프로그램 종료프로그램 종료

WM_KEYDOWN 메시지키보드 입력은 활성 윈도우에만 전달키보드 입력 시 발생wParam : 가상키코드lParam : 입력된 문자의 반복카운트 , 스캔 코드 등의 추가 정보

WM_CHAR 메시지문자 입력 시 발생wParam : 입력된 문자의 ASCII 코드lParam : 입력된 문자의 반복카운트 , 스캔 코드 등의 추가 정보

28

윈도우를 다시 그릴 필요가 있는 경우 WM_PAINT 메시지 발생무효화 영역 (Invalid Region) 이 있음WM_PAINT 메시지 처리하면 유효화됨

BOOL InvalidateRect(HWND hWnd, CONST BOOL InvalidateRect(HWND hWnd, CONST RECT* lpRect, BOOL bErase);RECT* lpRect, BOOL bErase);hWnd 의 lpRect 영역을 무효화 영역으로 설정

lpRect 를 최소화하여 프로그램 효율을 향상bErase : TRUE 면 배경을 지우고 다시 그림

29

메시지 루프의 TranslateMessage 함수는 GetMessage 로 꺼낸 메시지가 WM_KEYDOWN 메시지인 경우에 문자키인지를 검사해서 문자키인 경우 WM_CHAR 메시지 추가문자키가 아닌 경우 아무 일도 하지 않음

30

while( GetMessage(&Message,0,0,0) ){TranslateMessage(&Message);DispatchMessage(&Message);

}

while( GetMessage(&Message,0,0,0) ){TranslateMessage(&Message);DispatchMessage(&Message);

}

WM_SYSKEYDOWN, WM_SYSKEYUP, WM_SYSCHAR 등

Alt 키와 함께 입력Alt+F4 등

보통 운영체제에서 처리윈도우 프로시저에서 처리하는 경우에도 처리 후

반드시 DefWindowProc 에 전달하여 운영체제에서 처리하도록 함

31

마우스 관련 메시지WM_LBUTTONDOWN, WM_LBUTTONUP,

WM_LBUTTONDBCLK, WM_RBUTTONDOWN, WM_RBUTTONUP, WM_RBUTTONDBCLK, WM_MOUSEMOVE, WM_MOUSEWHEEL 등

lParam : 마우스가 눌린 x, y 좌표x 좌표 : LOWORD(lParam)y 좌표 : HIWORD(lParam)

wParam : 마우스 버튼 상태 및 키보드 조합 키의 상태MK_CONTROL, MK_SHIFT, MK_LBUTTON,

MK_RBUTTON, MK_MBUTTON 등

32

프로그램에서 더블 클릭을 사용하려면 윈도우 스타일에 설정해야 함

33

WndClass.lpfnWndProc = (WNDPROC)WndProc;WndClass.lpszClassName = lpszClassName;WndClass.lpszMenuName = NULL;WndClass.style = CS_HREDRAW | CS_VREDRAW

| CS_DBLCLKS;RegisterClass(&WndClass);

WndClass.lpfnWndProc = (WNDPROC)WndProc;WndClass.lpszClassName = lpszClassName;WndClass.lpszMenuName = NULL;WndClass.style = CS_HREDRAW | CS_VREDRAW

| CS_DBLCLKS;RegisterClass(&WndClass);

34

작업영역Client Area프로그램내에서 실제

출력이 이루어지는 영역

프로그래밍의 대상비작업영역

Non Client Area타이틀 바 , 경계선 ,

메뉴 , 스크롤 바 등의 영역

작업영역Client Area

비작업영역Non Client Area

비작업영역에서의 마우스 메시지는 일반 마우스 메시지에 NC 사용WM_NCMOUSEMOVE, WM_NCLBUTTONUP,

WM_NCLBUTTONDOWN 등비작업영역 메시지는 운영체제가 사용

프로그램 내에서 처리하는 경우에도 반드시 DefWindowProc 에 전달해야 함

35

WM_TIMER 메시지일정한 시간 간격으로 반복 발생하는 메시지wParam : 타이머 IDlParam : 타이머에 설정된 TimerProc 주소

VOID CALLBACK TimerProc(HWND hWnd, VOID CALLBACK TimerProc(HWND hWnd, UINT uMsg, UINT idEvent, DWORD dwTime);UINT uMsg, UINT idEvent, DWORD dwTime);WM_TIMER 메시지 발생시 운영체제가 호출

36

응용 프로그램이 제공하며 운영체제가 호출하는 함수

콜백함수가 호출되는 조건이 이미 정해져 있음콜백함수의 원형을 반드시 지켜야 함

37

UINT SetTimer(HWND hWnd, UINT UINT SetTimer(HWND hWnd, UINT nIDEvent, UINT uElapse, TIMERPROC nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc);lpTimerFunc);hWnd : 타이머 메시지를 받을 윈도우 핸들nIDEvent : 타이머 번호uElapse : 타이머의 주기 (ms 단위 )lpTimerProc : 타이머 메시지 발생시 호출되는 콜백

함수BOOL KillTimer(HWND hWnd, UINT BOOL KillTimer(HWND hWnd, UINT

nIDEvent);nIDEvent);타이머 사용 후 운영체제에 반납

38

LRESULT SendMessage(HWND hWnd, UINT LRESULT SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);Msg, WPARAM wParam, LPARAM lParam);강제로 메시지를 발생시킴SendMessage 함수는 윈도우 프로시저를 호출하며

윈도우 프로시저가 메시지 처리가 끝낸 다음에야 리턴됨

PostMessage 함수는 메시지 큐에 메시지를 넣고 바로 리턴됨

39

WM_CREATE : 윈도우 생성 시 발생초기화에 적합 (Timer 설정 등 )

WM_DESTROY : 윈도우 파괴 시 발생종료 처리에 적합 (Timer 해제 등 )

WM_SIZE : 윈도우 크기 변경 시 발생WM_MOVE : 윈도우 좌표 변경 시 발생

40

BOOL GetClientRect(HWND hWnd, LPRECT BOOL GetClientRect(HWND hWnd, LPRECT lpRect);lpRect);작업 영역을 차지하는 RECT 구조체를 구하는 함수작업 영역 (Client Area) 의 RECT 구조체의

LeftTop 은 항상 (0,0) 이고 RightBottom 은 (width, height) 로 설정

41

프로그램은 코드와 데이터로 구성됨비트맵 , 아이콘 , 메뉴 , 문자열 등도 데이터에 포함프로그램 코드의 논리와 무관한 데이터를 리소스라고

함리소스 생성과 코딩의 분리

작업이 편리별도의 리소스 컴파일 개발 속도 향상리소스 재사용리소스의 교체만으로 프로그램 기능 변경

42

메뉴아이콘커서비트맵액셀러레이터문자열 테이블

43

윈도우 클래스에 등록WndClass.lpszMenuName =

MAKEINTRESOURCE(IDR_MENU1);메뉴 선택시 WM_COMMAND 메시지 전달

wParam : LOWORD(wParam) 에 메뉴 ID 전달액셀러레이터 입력시도 WM_COMMAND 메시지

전달

44

MAKEINTRESOURCE 매크로정수값 리소스 ID 를 문자열로 변환

직접 만든 커서 /아이콘 사용 가능

45

WndClass.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR1));

WndClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));

WndClass.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR1));

WndClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));

단축키 입력에 사용되는 키 등록Shortcut 과는 다른 의미 Shortcut 은 메뉴에서 Alt 와 함께 문자 입력

HACCEL LoadAccelerators(HINSTANCE HACCEL LoadAccelerators(HINSTANCE hInstance, LPCTSTR lpTableName);리소스에서 액셀러레이터를 읽어옴

int TranslateAccelerators(HWND hWnd, int TranslateAccelerators(HWND hWnd, HACCEL hAccTable, LPMSG lpMsg);HACCEL hAccTable, LPMSG lpMsg);키보드 메시지를 WM_COMMAND 로 변경

46

문자열도 리소스의 일종프로그램에서 자주 사용하는 문자열을 등록프로그램내의 문자열의 관리가 쉬워짐

int LoadString(HINSTANCE hInstance, UINT int LoadString(HINSTANCE hInstance, UINT uID, LPTSTR lpBuffer, int nBufferMax);uID, LPTSTR lpBuffer, int nBufferMax);uID : 문자열의 리소스 IDlpBuffer : 문자열을 읽을 버퍼nBufferMax : 버퍼의 최대크기

47

그래픽 출력에 사용되는 도구펜 , 브러쉬 , 비트맵 , 폰트 등핸들로 관리따로 도구를 선택하지 않으면 디폴트 도구가 사용됨

Stock Object윈도우즈가 기본적으로 제공하는 GDI Object따로 만들거나 파괴 시킬 필요가 없이 사용

48

HPEN : 선을 그릴 때 사용HBRUSH : 면을 채울 때 사용HFONT : 문자열 출력에 사용HBITMAP : 비트맵 이미지HPALETTE : 팔레트HRGN : 영역

49

HGDIOBJ GetStockObject(int nObject);HGDIOBJ GetStockObject(int nObject);윈도우즈에 등록된 Stock object 에 대한 핸들을 얻는

함수HGDIOBJ SelectObject(HDC hdc, HGDIOBJ HGDIOBJ SelectObject(HDC hdc, HGDIOBJ

hObject);hObject);DC 내의 GDI 도구 선택시 사용이전에 선택되어 있던 도구의 핸들을 리턴리턴값을 저장했다가 GDI 도구를 복원하는데 사용

50

51

핸들 선언핸들 선언

GDI 도구 생성GDI 도구 생성

GDI 도구 선택GDI 도구 선택

GDI 출력GDI 출력

GDI 도구 복원GDI 도구 복원

GDI 도구 삭제GDI 도구 삭제

HPEN pen, OldPen;

pen=CreatePen(PS_SOLID,1,0);

OldPen=(HPEN)SelectObject(hdc,pen);

Rectangle(hdc,100,100,400,300);

SelectObject(hdc, OldPen);

DeleteObject(pen);

윈도우즈내의 색상 표현을 위한 자료형32 bit 정수형 : 각 8bit 로 R,G,B 값 표현

각 RGB 값은 0~255 사이의 값

RGB 매크로RGB(255, 0, 0) 의 형태로 사용

GetRValue,GetGValue,GetBValue 매크로COLORREF 값에서 R,G,B 값을 각각 분리

52

RedGreenBlueNot Used31 0

선 ( 외곽선 ) 을 그릴 때 사용되는 GDI objectHPEN CreatePen(int nPenStyle, int nWidth, HPEN CreatePen(int nPenStyle, int nWidth,

COLORREF crColor);COLORREF crColor);nPenStyle : 펜의 모양 (PS_SOLID, PS_DOT)nWidth : 펜 두께 (PS_SOLID 인 경우만 변경 )crColor : 펜 색

53

BOOL DeleteObject(HGDIOBJ hObject);BOOL DeleteObject(HGDIOBJ hObject);GDI Object 는 사용 후 반드시 삭제선택되어 있는 GDI Object 는 삭제 불가능삭제 전에 반드시 DC 내의 GDI 도구를 이전 도구로

복원OldPen 에 이전에 사용하던 펜 핸들을 저장SelectObject 함수의 리턴값 저장

Stock Object 는 따로 삭제할 필요 없음

54

도형의 내부를 칠하는데 사용하는 GDI ObjectHBRUSH CreateSolidBrush(COLORREF HBRUSH CreateSolidBrush(COLORREF

crColor);crColor);단색 브러시 생성

HBRUSH CreateHatchBrush(int nStyle, HBRUSH CreateHatchBrush(int nStyle, COLORREF crColor);COLORREF crColor);무늬와 색상이 있는 브러시 생성HS_BDIAGONAL, HS_CROSS, HS_DIACROSS,

HS_FDIAGONAL 등

55

원래 그려져 있던 그림과 새로 그리는 그림의 관계 설정COPY, AND, OR, XOR 등

int SetROP2(HDC hdc, int nDrawMode);int SetROP2(HDC hdc, int nDrawMode);R2_NOT, R2_COPYPEN( 디폴트 모드 ),

R2_NOTCOPYPEN, R2_MERGEPEN, R2_MASKPEN, R2_XORPEN 등

56

논리 좌표윈도우즈 내부에서 사용하는 좌표논리 좌표의 실제 위치는 경우에 따라 다름DC 에 대한 핸들을 사용하는 함수에서 사용

물리 좌표실제 화면에 출력되는 좌표픽셀 단위 사용윈도우 관리 함수 /메시지에서 사용

57

58

물리좌표(0,0)

논리좌표(0,0)

= 물리좌표 (200,250)

논리좌표를 물리좌표로 변환하는 방법int SetMapMode(HDC hdc, int mode);int SetMapMode(HDC hdc, int mode);

mode : 매핑 방법 설정MM_TEXT : 논리좌표 단위 = 1 픽셀 ( 디폴트 )MM_LOMETRIC : 논리좌표 단위 = 0.1mmMM_HIMETRIC : 논리좌표 단위 = 0.01mmMM_LOENGLISH : 논리좌표 단위 = 0.01inchMM_HIENGLISH : 논리좌표 단위 = 0.001inchMM_ISOTROPIC : 가변 (x, y 비율 유지 )MM_ANISOTROPIC : 가변 (x, y 비율 변화 가능 )

59

60

y 증가

x 증가MM_TEXT 모드

그 이외의 모드

y 증가

x 증가

윈도우논리 좌표가 사용되는 영역

뷰포트물리 좌표가 사용되는 영역사용자의 눈에 보이는 영역

BOOL SetViewportOrgEx(HDC hdc, int x, int BOOL SetViewportOrgEx(HDC hdc, int x, int y, LPPOINT lpPoint);y, LPPOINT lpPoint);

BOOL SetWindowOrgEx(HDC hdc, int x, int y, BOOL SetWindowOrgEx(HDC hdc, int x, int y, LPPOINT lpPoint);LPPOINT lpPoint);

61

62

SetViewportOrgEx(hdc, 50, 50, NULL);

Rectangle(hdc, 0, 0, 200, 200);

SetViewportOrgEx(hdc, 50, 50, NULL);

Rectangle(hdc, 0, 0, 200, 200);

Viewport 원점(50, 50)

논리좌표의 (0,0)이 여기에 매핑

사각형 물리 좌표(250, 250)

논리좌표의 (200,200)이 여기에 매핑

200

200

63

SetWindowOrgEx(hdc, 50, 50, NULL);

Rectangle(hdc, 0, 0, 200, 200);

SetWindowOrgEx(hdc, 50, 50, NULL);

Rectangle(hdc, 0, 0, 200, 200);

Window 원점(50, 50)

물리좌표의 (0,0)이 여기에 매핑

사각형 물리 좌표(150, 150)

논리좌표의 (200,200)이 여기에 매핑

200

150

BOOL SetWindowExtEx(HDC hdc, int x, int y, BOOL SetWindowExtEx(HDC hdc, int x, int y, LPSIZE lpSize);LPSIZE lpSize);논리 좌표의 범위 지정논리 좌표는 (x, y) 범위 내의 좌표 가짐

BOOL SetViewportExtEx(HDC hdc, int x, int BOOL SetViewportExtEx(HDC hdc, int x, int y, LPSIZE lpSize);y, LPSIZE lpSize);물리 좌표의 범위 지정

64

비트맵 리소스 사용메모리 DC 사용

윈도우즈는 비트맵을 직접 화면 DC 로 출력하는 함수를 제공하지 않음

대신 메모리 DC 에 비트맵을 설정하고 메모리 DC 를 화면 DC 로 복사함

HDC CreateCompatibleDC(HDC dc);HDC CreateCompatibleDC(HDC dc);HBITMAP LoadBitmap(HINSTANCE HBITMAP LoadBitmap(HINSTANCE

hInstance, LPCTSTR lpBitmapName);hInstance, LPCTSTR lpBitmapName);

65

BOOL BitBlt(HDC hdcDest, int x, int y, int w, BOOL BitBlt(HDC hdcDest, int x, int y, int w, int h, HDC hdcSrc, int xsrc, int ysrc, DWORD int h, HDC hdcSrc, int xsrc, int ysrc, DWORD dwROP);dwROP);dwROP : 래스터 연산 방법 (SRCCOPY,

DSTINVERT, MERGECOPY, MERGEPAINT)BOOL StretchBlt(HDC hdcDest, int x, int y, BOOL StretchBlt(HDC hdcDest, int x, int y,

int w, int h, HDC hdcSrc, int xsrc, int ysrc, int int w, int h, HDC hdcSrc, int xsrc, int ysrc, int wSrc, int hSrc, DWORD dwROP);wSrc, int hSrc, DWORD dwROP);확대 /축소 복사 가능

66

HFONT CreateFont(...);인자의 갯수가 많음lpszFaceName : 글꼴 이름

LOGFONT 구조체를 이용하여 폰트 생성 가능HFONT CreateFontIndirect(CONST HFONT CreateFontIndirect(CONST

LOGFONT *lplf);LOGFONT *lplf);

67

68

COLORREF SetTextColor(HDC hdc, COLORREF crColor);

COLORREF SetBkColor(HDC hdc, COLORREF crColor);

int SetBkMode(HDC hdc, int mode);불투명 (OPAQUE) or 투명 (TRANSPARENT)

69

HELLO WORLD

글자색 배경색

사용자와의 인터페이스를 위한 도구사용자의 정형화된 입력을 받기 위해 사용차일드 윈도우 : 메시지 처리 가능

운영체제가 사용가능 한 컨트롤 제공버튼 , 에디트 , 리스트박스 , 콤보박스 , 스크롤 등사용자는 컨트롤 윈도우 클래스를 사용하기만 하면 됨

button, edit, listbox, combobox, scrollbar 등이 클래스 이름임

70

71

WM_LBUTTONDOWN 발생WM_LBUTTONDOWN 발생

마우스 왼쪽버튼 클릭

버튼이 메시지 처리 (ex. 눌린 효과 )버튼이 메시지 처리 (ex. 눌린 효과 )

부모 윈도우에 통지 메시지 전송부모 윈도우에 통지 메시지 전송

부모 윈도우에서 통지 메시지 처리부모 윈도우에서 통지 메시지 처리

차일드 윈도우가 부모 윈도우에 통지 메시지를 전송할 때 사용HIWORD(wParam) : 통지 코드LOWORD(wParam) : 컨트롤 IDlParam : 메시지 보낸 차일드 윈도우 핸들

부모 윈도우에서의 메시지 처리어떤 컨트롤에서 온 어떤 통지 메시지인지를 보고 판단해서 처리

72

73

CreateWindow( “button” , “Click Me”, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 20, 20, 100, 25, hWnd, (HMENU) 0, g_hInst, NULL);

CreateWindow( “button” , “Click Me”, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 20, 20, 100, 25, hWnd, (HMENU) 0, g_hInst, NULL);

윈도우 클래스이름

윈도우 타이틀 윈도우 스타일

윈도우좌표

윈도우크기

부모 윈도우핸들

컨트롤 ID

푸쉬 버튼 : 버튼 클릭체크 박스 버튼 : 참 /거짓 선택

각각 토글 가능라디오 버튼 : 여러개 중 하나 선택

74

BS_PUSHBUTTONBS_DEFPUSHBUTTONBS_CHECKBOXBS_3STATEBS_AUTOCHECKBOXBS_AUTO3STATEBS_RADIOBUTTONBS_GROUPBOX

75

통지 메시지BN_CLICKED

부모 윈도우에 버튼이 클릭되었음을 알리는 통지 메시지

WM_COMMAND 메시지를 이용해서 보냄

76

부모윈도우부모

윈도우버튼컨트롤버튼컨트롤

BN_CLICKED

BM_GETCHECK,BM_SETCHECK

부모 윈도우에서 버튼 컨트롤에 보내는 메시지체크박스에 처리하고 하는 내용을 메시지로 전송BM_SETCHECK : 체크박스의 상태 변경

wParam : 변경할 상태 (BST_CHECKED, BST_UNCHECKED, BST_INDETERMINATE)

BM_GETCHECK : 체크박스의 상태 확인

77

문자열을 입력 받을 때 사용최대 32K까지의 문자열 처리 가능여러줄 편집 , 블럭 선택 , 클립 보드 지원 기능 등

제공

78

ES_AUTOHSCROLL : 수평 스크롤 지원ES_AUTOVSCROLL : 수직 스크롤 지원ES_LEFT : 왼쪽 정렬ES_CENTER : 중앙 정렬ES_RIGHT : 오른쪽 정렬ES_LOWERCASE : 소문자 변환ES_UPPERCASE : 대문자 변환ES_MULTILINE : 여러 줄 편집ES_READONLY : 읽기 전용ES_NUMBER : 숫자만 입력

79

EN_CHANGE : 문자열 변경EN_ERRSPACE : 메모리 부족EN_HSCROLL : 수평 스크롤바 클릭EN_VSCROLL : 수직 스크롤바 클릭EN_KILLFOCUS : 포커스 잃음EN_SETFOCUS : 포커스 얻음EN_MAXTEXT : 지정한 길이 초과EN_UPDATE : 문자열 변경 직전

80

선택 가능한 여러 항목 ( 문자열 ) 중 하나 이상을 선택하는 컨트롤

리스트박스 스타일LBS_MULTIPLESEL : 다중 선택 가능LBS_NOTIFY : 목록 선택시 부모에게 통지LBS_SORT : 추가된 항목 자동 정렬LBS_OWNERDRAW : 비트맵 또는 그림 추가LBS_STANDARD

81

부모 윈도우가 리스트박스 컨트롤 조작시 사용하는 메시지LB_ADDSTRING : 새로운 항목 추가LB_DELETESTRING : 항목 삭제LB_GETCURSEL : 선택된 항목의 index 구함LB_GETTEXT : 지정된 항목의 문자열 읽음LB_GETCOUNT : 항목의 갯수 조사LB_SETCURSEL : wParam 에 지정한 항목 선택

82

리스트 박스 컨트롤에 부모 윈도우에 전달하는 통지 메시지LBN_DBLCLK : 더블 클릭했음LBN_ERRSPACE : 메모리가 부족함LBN_KILLFOCUS : 포커스를 잃음LBN_SELCANCELL : 사용자가 선택 취소함LBN_SELCHANGE : 사용자가 선택을 변경함LBN_SETFOCUS : 포커스를 얻음

83

에디트 컨트롤과 리스트박스를 결합해 놓은 컨트롤목록 선택 또는 새로운 목록 추가 가 가능필요한 경우에만 목록을 열기 때문에 공간을 적게 사용

콤보박스 스타일CBS_SIMPLE : 에디트만 가짐CBS_DROPDOWN : 에디트와 리스트박스CBS_DROPDOWNLIST : 리스트박스만 가짐

84

범위와 현재 위치값을 가진 컨트롤반드시 범위 지정 후 사용

BOOL SetScrollRange(HWND hwnd, int nBar, BOOL SetScrollRange(HWND hwnd, int nBar, int min, int max, BOOL bRedraw);int min, int max, BOOL bRedraw);

int SetScrollPos(HWND hwnd, int nBar, int int SetScrollPos(HWND hwnd, int nBar, int nPos, BOOL bRedraw);nPos, BOOL bRedraw);

부모 윈도우에 통지 메시지 대신 WM_HSCROLL, WM_VSCROLL 전송

85

LOWORD(wParam) : 스크롤바 내의 누른 위치SB_LINEUP, SB_LINEDOWN, SB_PAGEUP,

SB_PAGEDOWN, SB_THUMBPOSITION, SB_THUMBTRACK

HIWORD(wParam) : 현재 위치lParam : 스크롤바의 윈도우 핸들

86

입력 처리는 할 수 없고 문자열을 보여주기 위한 컨트롤

87

프로그램과 사용자 간의 대화수단명령 및 정보 전달을 위한 특별한 윈도우컨트롤을 이용하여 입력 처리

다이얼로그의 종류Modal Dialog : dialog 종료 전에 메인 윈도우로

전환 불가Modeless Dialog : dialog 가 떠 있는 상태에서 메인

윈도우로 전환 가능

88

int DialogBox(HINSTANCE hInstance, int DialogBox(HINSTANCE hInstance, LPCTSTR lpTemplate, HWND hWndParent, LPCTSTR lpTemplate, HWND hWndParent, DLGPROC lpDlgFunc);DLGPROC lpDlgFunc);lpTemplate : 다이얼로그 템플릿의 리소스 IDhWndParent : 다이얼로그의 부모 윈도우lpDlgFunc : 다이얼로그 프로시저 ( 메시지 처리 )

BOOL EndDialog(HWND hDlg, int res);BOOL EndDialog(HWND hDlg, int res);res : DialogBox 의 리턴값으로 전달

89

윈도우 프로시저와 비슷한 역할다이얼로그에 전달된 메시지 처리리턴값이 다름

TRUE 인 경우 : 메시지 처리 성공FALSE 인 경우 : 메시지 처리 실패 . 윈도우즈가 처리함

다이얼로그 만들 때 WM_INITDIALOG 메시지 발생BOOL CALLBACK DlgProc(HWND hWnd, BOOL CALLBACK DlgProc(HWND hWnd,

UINT iMsg, WPARAM wParam, LPARAM UINT iMsg, WPARAM wParam, LPARAM lParam);lParam);

90

HWND GetDlgItem(HWND hDlg, int nID);HWND GetDlgItem(HWND hDlg, int nID);int GetDlgCtrlID(HWND hwndCtl);int GetDlgCtrlID(HWND hwndCtl);UINT GetDlgItemText(HWND hDlg, int UINT GetDlgItemText(HWND hDlg, int

nID, LPTSTR lpStr, int nMaxCnt);nID, LPTSTR lpStr, int nMaxCnt);BOOL SetDlgItemText(HWND hDlg, int BOOL SetDlgItemText(HWND hDlg, int

nID, LPCTSTR lpStr);nID, LPCTSTR lpStr);UINT GetDlgItemInt(HWND hDlg, int nID, UINT GetDlgItemInt(HWND hDlg, int nID,

BOOL *lpTranslated, BOOL bSigned);BOOL *lpTranslated, BOOL bSigned);BOOL SetDlgItemInt(HWND hDlg, int nID, BOOL SetDlgItemInt(HWND hDlg, int nID,

UINT uValue, BOOL bSigned);UINT uValue, BOOL bSigned);

91

모달 다이얼로그에 비해 처리가 복잡하고 어려움직접 다이얼로그를 만들고 파괴해야 함HWND CreateDialog(HINSTANCE hInstance, HWND CreateDialog(HINSTANCE hInstance,

LPCTSTR lpTemplate, HWND hWndParent, LPCTSTR lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc);DLGPROC lpDialogFunc);

만들고 나서 ShowWindow 를 호출하여 화면에 보이도록 설정

92

BOOL IsWindow(HWND hWnd);hWnd 가 유효한 핸들인지 검사

다이얼로그를 닫을 때도 EndDialog 대신 DestroyWindow 를 이용

메시지 루프 변경

93

while( GetMessage(&Message,0,0,0) ) { if( !IsWindow(hDlg)||!IsDialogMessage(hDlg,iMessage) ) { TranslateMessage(&Message); DispatchMessage(&Message); }}

while( GetMessage(&Message,0,0,0) ) { if( !IsWindow(hDlg)||!IsDialogMessage(hDlg,iMessage) ) { TranslateMessage(&Message); DispatchMessage(&Message); }}

WM_USER 이후의 메시지 ID 사용다른 프로그램 끼리도 통신 가능HWND FindWindow(LPCTSTR lpClassName, HWND FindWindow(LPCTSTR lpClassName,

LPCTSTR lpWndName);LPCTSTR lpWndName);

94