Presentation is loading. Please wait.

Presentation is loading. Please wait.

Win32 API Programming 이 계 임.

Similar presentations


Presentation on theme: "Win32 API Programming 이 계 임."— Presentation transcript:

1 Win32 API Programming 이 계 임

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

3 What is API? API(Application Programming Interface)
운영체제가 응용 프로그램을 위해 제공하는 함수의 집 합.  C Library 응용 프로그램 개발자들이 운영체제가 제공하는 기능들 을 사용할 수 있도록 운영체제가 제공하는 함수의 집합. SDK(S/W Development Kit) API를 이용하여 프로그램을 개발하는 개발툴 킷 API와 유사한 의미로 사용됨.

4 Application 개발 Windows User Application MFC API Kernel GDI User
Device Driver H/W System

5 윈도우즈 프로그램 개발방법 SDK Class Library Visual Tools API를 사용하여 개발
MFC, OWL 등 클래스 중심의 프로그래밍 Visual Tools VB, Delphi 등

6 Why API? 운영체제를 이해하기 위해서 반드시 필요함. 다른 개발 방법을 사용하더라고 API를 결국 알아야 하 기 때문.
프로그램 개발 시 프로그래머의 융통성(flexibility)를 극대화 하기 위해 필요함.  윈도우즈 프로그래밍의 기본

7 변수 명명 규칙 Hungarian Notation 접두어를 사용하여 변수의 자료형 알려줌. 접두어 원래말 의미 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 포인터형

8 윈도우즈 자료형 windows.h에 정의 자료형 의미 BYTE unsigned char WORD unsigned short
DWORD unsigned long UINT unsigned int LONG long LPSTR char* LPCSTR const char* BOOL int (TRUE, FALSE)

9 핸들(Handle) 대상에 붙여진 번호로 32bit 정수값 운영체제가 발급하며 사용자는 이 핸들을 사용하기만 한다.
윈도우 핸들, DC 핸들, 펜 핸들, 브러쉬 핸들, 메모리 핸 들 등 운영체제가 발급하며 사용자는 이 핸들을 사용하기만 한다. 같은 종류의 핸들은 중복될 수 없다. 핸들값 저장에 사용되는 자료형 HWND, HDC, HPEN, HBRUSH 등

10 WinMain 함수 프로그램의 시작점(Entry Point) : 프로그램 초기 화 및 시작.
메인 윈도우를 화면에 만들고 출력. int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow); hInstance : 프로그램의 인스턴스 핸들 hPrevInstance : Win32에서는 항상 NULL lpszCmdParam : 명령행 인수 nCmdShow : 프로그램 실행 형태(보통, 최소화, 최대화 등)

11 WinMain의 역할 int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow) { 윈도우 클래스 정의 윈도우 클래스 등록 윈도우 객체 생성 화면에 윈도우 보이기 Message Loop }

12 윈도우 클래스 (WNDCLASS) 만들어질 윈도우의 특성을 정의하는 구조체
style : 윈도우스타일(CS_HREDRAW|CS_VREDRAW) lpfnWndProc : 윈도우의 메시지 처리 함수 이름 WndProc가 일반적인 이름 cbClsExtra, cbWndExtra : 예약영역 hInstance : 프로그램의 인스턴스 핸들 hIcon, hCursor : 마우스 커서와 아이콘 지정 LoadCursor(), LoadIcon() 함수로 지정 hbrBackground : 윈도우의 배경색을 칠한 브러시 지정. GetStockObject() 함수로 윈도우 기본 브러시 지정 lpszMenuName : 프로그램이 사용할 메뉴 지정 lpszClassName : 윈도우 클래스 이름 (문자열)

13 윈도우 클래스 등록 운영체제에 윈도우 클래스 등록 WNDCLASS WndClass; WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0; WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); 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);

14 윈도우 객체 생성 HWND CreateWindow(lpszClassName, lpszWindowName, dwStyle, x, y, nWidth, hHeight, hWndParent, hMenu, hInst, lpvParam); lpszClassName : 윈도우 클래스 이름 lpszWindowName : 윈도우 타이틀 바 문자열 dwStyle : 윈도우의 형태 지정 WS_OVERLAPEDWINDOW 사용 x, y, nWidth, nHeight : 윈도우의 위치와 크기 지정 CW_USERDEFAULT 사용 hWndParent : 부모 윈도우의 핸들 hMenu : 메뉴 핸들 hInst : 프로그램의 인스턴스 핸들 hpvParam : CREATESTRUCT 구조체 (NULL) 만들어진 윈도우는 메모리 상에만 존재할 뿐 화면 출력되지 않 음.

15 윈도우 보이기 BOOL ShowWindow(hWnd, nCmdShow) hWnd : 화면에 출력할 윈도우 핸들
SW_HIDE, SW_MINIMIZE, SW_MAXIMIZE, SW_RESTORE, SW_SHOW, SW_SHOWNORMAL 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() {
윈도우 프로시저 시스템 SendMessage 디폴트 윈도 우 프로시저 PostMessage

18 메시지 루프 while(GetMessage(&Message,0,0,0) { TranslateMessage(&Message);
DispatchMessage(&Message); } BOOL GetMessage(lpMsg, hWnd, wFilterMin, wFilterMax); 메시지 큐에서 메시지를 읽어들임 읽은 메시지가 WM_QUIT인 경우에만 FALSE 리턴  메시지 루프 종료 BOOL TranslateMessage(lpMsg); 키보드 입력 메시지를 WM_CHAR 메시지로 변환 BOOL DispatchMessage(lpMsg); 메시지를 운영체제로 전달하여 운영체제가 윈도우 프로시저를 호출하도록 함

19 메시지 구조체 (MSG) 메시지 전달 시 사용 메시지의 종류에 따라 wParam, lParam의 의미가 달라 짐
hWnd : 메시지 받을 윈도우 핸들 message : 메시지의 종류 windows.h에 매크로로 정의되어 있음 wParam : 메시지에 대한 부가 정보 lParam : 메시지에 대한 부가 정보 time : 메시지 발생 시간 pt : 메시지 발생시 마우스 위치 메시지의 종류에 따라 wParam, lParam의 의미가 달라 짐

20 윈도우 프로시저 사용자/시스템이 전달하는 메시지 처리. 프로그램의 실질직이고 고유한 처리. 운영체제에 의해 호출  콜백함수
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam); hWnd : 메시지가 전달될 윈도우 핸들 iMessage : 메시지의 종류 wParam : 메시지의 부가 정보 lParam : 메지시의 부가 정보

21 윈도우 프로시저 (Continued) 메시지의 종류에 따른 처리방법을 switch case 문을 이용하여 기술
디폴트 윈도우 프로시저 : 윈도우 프로시저에서 처리하지 않은 메시지 처리 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));

22 Device Context 출력에 필요한 정보를 담고 있는 구조체 DC 생성 방법
폰트, 선의 색상과 굵기, 채움 무늬와 색상, 출력 방법 등 모든 GDI 출력 함수는 DC에 대한 핸들을 이용하여 그리 기를 수행 출력을 위해서는 우선 DC를 얻어야 함 DC 생성 방법 GetDC(), ReleaseDC() 함수 이용 BeginPaint(), EndPaint() 함수 이용 : WM_PAINT 메시 지 처리 루틴에서만 사용

23 WM_PAINT 메시지 화면에 무효화 영역(Invalid Region)이 있을 때 발생
윈도우의 작업 영역이 지워졌음을 운영체제가 프로그 램에 알려줌 화면을 보관/복구하는 메커니즘 필요 모든 그래픽 출력은 WM_PAINT 메시지 시 처리 모든 프로그램은 화면 복원을 위해 출력 내용을 보관하 거나 복구할 준비를 해야 함

24 문자열 출력 함수 BOOL TextOut(HDC hdc, int x, int y, LPCTSTR lpStr, int cbStr); UINT SetTextAlign(HDC hdc, UINT fMode); int DrawText(HDC hdc, LPCTSTR lpStr, int nCount, LPRECT lpRect, UINT uFormat); 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);

25 그래픽 출력 함수 COLORREF SetPixel(HDC hdc, int x, int y, COLORREF crColor);
DWORD MoveToEx(HDC hdc, int x, int y, LPPOINT lpPoint); BOOL LineTo(HDC hdc, int x, int y); BOOL Rectangle(HDC hdc, int left, int top, int right, int bottom); BOOL Ellipse(HDC hdc, int left, int top, int right, int bottom);

26 메시지 박스 int MessageBox(HWND hWnd, LPCTSTR 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 전달

27 윈도우 프로그램 종료 절차 종료 버튼 클릭 또는 Alt+F4 WM_CLOSE 메시지 발생 PostQuitMessage 호출
WM_QUIT 메시지 발생 디폴트 윈도우 프로시저 전달 윈도우 프로시저 전달 WinMain의 메시지 루프 탈출 DestroyWindow 호출 WM_DESTROY 메시지 발생 프로그램 종료

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

29 무효화 영역 윈도우를 다시 그릴 필요가 있는 경우 WM_PAINT 메 시지 발생
무효화 영역(Invalid Region)이 있음 WM_PAINT 메시지 처리하면 유효화됨 BOOL InvalidateRect(HWND hWnd, CONST RECT* lpRect, BOOL bErase); hWnd의 lpRect 영역을 무효화 영역으로 설정  lpRect 를 최소화하여 프로그램 효율을 향상 bErase : TRUE면 배경을 지우고 다시 그림

30 키보드 입력 변환 메시지 루프의 TranslateMessage 함수는 GetMessage로 꺼낸 메시지가 WM_KEYDOWN 메 시지인 경우에 문자키인지를 검사해서 문자키인 경우 WM_CHAR 메시지 추가 문자키가 아닌 경우 아무 일도 하지 않음 while( GetMessage(&Message,0,0,0) ){ TranslateMessage(&Message); DispatchMessage(&Message); }

31 시스템 키보드 메시지 WM_SYSKEYDOWN, WM_SYSKEYUP, WM_SYSCHAR 등 Alt 키와 함께 입력
Alt+F4 등 보통 운영체제에서 처리 윈도우 프로시저에서 처리하는 경우에도 처리 후 반드 시 DefWindowProc에 전달하여 운영체제에서 처리하 도록 함

32 마우스 입력 마우스 관련 메시지 lParam : 마우스가 눌린 x, y 좌표
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 등

33 더블 클릭 프로그램에서 더블 클릭을 사용하려면 윈도우 스 타일에 설정해야 함
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
프로그램내에서 실제 출력이 이루어지는 영 역 프로그래밍의 대상 비작업영역 Non Client Area 타이틀 바, 경계선, 메 뉴, 스크롤 바 등의 영 역 비작업영역 Non Client Area 작업영역 Client Area

35 비작업영역 마우스 메시지 비작업영역에서의 마우스 메시지는 일반 마우스 메시 지에 NC 사용 비작업영역 메시지는 운영체제가 사용
WM_NCMOUSEMOVE, WM_NCLBUTTONUP, WM_NCLBUTTONDOWN 등 비작업영역 메시지는 운영체제가 사용 프로그램 내에서 처리하는 경우에도 반드시 DefWindowProc에 전달해야 함

36 타이머 메시지 WM_TIMER 메시지 일정한 시간 간격으로 반복 발생하는 메시지 wParam : 타이머 ID lParam : 타이머에 설정된 TimerProc 주소 VOID CALLBACK TimerProc(HWND hWnd, UINT uMsg, UINT idEvent, DWORD dwTime); WM_TIMER 메시지 발생시 운영체제가 호출

37 콜백 함수 응용 프로그램이 제공하며 운영체제가 호출하는 함수 콜백함수가 호출되는 조건이 이미 정해져 있음
콜백함수의 원형을 반드시 지켜야 함

38 SetTimer & KillTimer UINT SetTimer(HWND hWnd, UINT nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc); hWnd : 타이머 메시지를 받을 윈도우 핸들 nIDEvent : 타이머 번호 uElapse : 타이머의 주기 (ms 단위) lpTimerProc : 타이머 메시지 발생시 호출되는 콜백 함 수 BOOL KillTimer(HWND hWnd, UINT nIDEvent); 타이머 사용 후 운영체제에 반납

39 SendMessage LRESULT SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); 강제로 메시지를 발생시킴 SendMessage 함수는 윈도우 프로시저를 호출하며 윈도 우 프로시저가 메시지 처리가 끝낸 다음에야 리턴됨 PostMessage 함수는 메시지 큐에 메시지를 넣고 바로 리 턴됨

40 윈도우 관리 메시지 WM_CREATE : 윈도우 생성 시 발생 WM_DESTROY : 윈도우 파괴 시 발생
초기화에 적합 (Timer 설정 등) WM_DESTROY : 윈도우 파괴 시 발생 종료 처리에 적합 (Timer 해제 등) WM_SIZE : 윈도우 크기 변경 시 발생 WM_MOVE : 윈도우 좌표 변경 시 발생

41 작업 영역 구하기 BOOL GetClientRect(HWND hWnd, LPRECT lpRect);
작업 영역(Client Area)의 RECT 구조체의 LeftTop은 항 상 (0,0)이고 RightBottom은 (width, height)로 설정

42 리소스 프로그램은 코드와 데이터로 구성됨 리소스 생성과 코딩의 분리 비트맵, 아이콘, 메뉴, 문자열 등도 데이터에 포함
프로그램 코드의 논리와 무관한 데이터를 리소스라고 함 리소스 생성과 코딩의 분리 작업이 편리 별도의 리소스 컴파일  개발 속도 향상 리소스 재사용 리소스의 교체만으로 프로그램 기능 변경

43 리소스의 종류 메뉴 아이콘 커서 비트맵 액셀러레이터 문자열 테이블

44 메뉴 윈도우 클래스에 등록 메뉴 선택시 WM_COMMAND 메시지 전달
WndClass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); 메뉴 선택시 WM_COMMAND 메시지 전달 wParam : LOWORD(wParam)에 메뉴 ID 전달 액셀러레이터 입력시도 WM_COMMAND 메시지 전달

45 커서/아이콘 WndClass.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR1)); WndClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)); MAKEINTRESOURCE 매크로 정수값 리소스 ID를 문자열로 변환 직접 만든 커서/아이콘 사용 가능

46 액셀러레이터 단축키 입력에 사용되는 키 등록 Shortcut과는 다른 의미 Shortcut은 메뉴에서 Alt와 함께 문자 입력 HACCEL LoadAccelerators(HINSTANCE hInstance, LPCTSTR lpTableName); 리소스에서 액셀러레이터를 읽어옴 int TranslateAccelerators(HWND hWnd, HACCEL hAccTable, LPMSG lpMsg); 키보드 메시지를 WM_COMMAND로 변경

47 문자열 테이블 문자열도 리소스의 일종 프로그램에서 자주 사용하는 문자열을 등록 프로그램내의 문자열의 관리가 쉬워짐 int LoadString(HINSTANCE hInstance, UINT uID, LPTSTR lpBuffer, int nBufferMax); uID : 문자열의 리소스 ID lpBuffer : 문자열을 읽을 버퍼 nBufferMax : 버퍼의 최대크기

48 GDI Object 그래픽 출력에 사용되는 도구 Stock Object 펜, 브러쉬, 비트맵, 폰트 등 핸들로 관리
따로 도구를 선택하지 않으면 디폴트 도구가 사용됨 Stock Object 윈도우즈가 기본적으로 제공하는 GDI Object 따로 만들거나 파괴 시킬 필요가 없이 사용

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

50 Stock Object의 사용 HGDIOBJ GetStockObject(int nObject);
HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hObject); DC내의 GDI 도구 선택시 사용 이전에 선택되어 있던 도구의 핸들을 리턴 리턴값을 저장했다가 GDI 도구를 복원하는데 사용

51 GDI Object의 사용 핸들 선언 HPEN pen, OldPen; GDI 도구 생성
pen=CreatePen(PS_SOLID,1,0); GDI 도구 선택 OldPen=(HPEN)SelectObject(hdc,pen); GDI 출력 Rectangle(hdc,100,100,400,300); GDI 도구 복원 SelectObject(hdc, OldPen); GDI 도구 삭제 DeleteObject(pen);

52 COLORREF 윈도우즈내의 색상 표현을 위한 자료형 32 bit 정수형 : 각 8bit로 R,G,B 값 표현 RGB 매크로
GetRValue,GetGValue,GetBValue 매크로 COLORREF값에서 R,G,B값을 각각 분리 Red Green Blue Not Used 31

53 펜 선(외곽선)을 그릴 때 사용되는 GDI object
HPEN CreatePen(int nPenStyle, int nWidth, COLORREF crColor); nPenStyle : 펜의 모양(PS_SOLID, PS_DOT) nWidth : 펜 두께(PS_SOLID인 경우만 변경) crColor : 펜 색

54 GDI Object 삭제 BOOL DeleteObject(HGDIOBJ hObject);
삭제 전에 반드시 DC내의 GDI 도구를 이전 도구로 복원 OldPen에 이전에 사용하던 펜 핸들을 저장 SelectObject 함수의 리턴값 저장 Stock Object는 따로 삭제할 필요 없음

55 브러시 도형의 내부를 칠하는데 사용하는 GDI Object
HBRUSH CreateSolidBrush(COLORREF crColor); 단색 브러시 생성 HBRUSH CreateHatchBrush(int nStyle, COLORREF crColor); 무늬와 색상이 있는 브러시 생성 HS_BDIAGONAL, HS_CROSS, HS_DIACROSS, HS_FDIAGONAL 등

56 그리기 모드 원래 그려져 있던 그림과 새로 그리는 그림의 관계 설 정
COPY, AND, OR, XOR 등 int SetROP2(HDC hdc, int nDrawMode); R2_NOT, R2_COPYPEN(디폴트 모드), R2_NOTCOPYPEN, R2_MERGEPEN, R2_MASKPEN, R2_XORPEN 등

57 윈도우즈의 좌표 체계 논리 좌표 물리 좌표 윈도우즈 내부에서 사용하는 좌표 논리 좌표의 실제 위치는 경우에 따라 다름
DC에 대한 핸들을 사용하는 함수에서 사용 물리 좌표 실제 화면에 출력되는 좌표 픽셀 단위 사용 윈도우 관리 함수/메시지에서 사용

58 논리좌표와 물리좌표 물리좌표 (0,0) 논리좌표 (0,0) = 물리좌표 (200,250)

59 매핑 모드 논리좌표를 물리좌표로 변환하는 방법 int SetMapMode(HDC hdc, int mode);
MM_TEXT : 논리좌표 단위 = 1 픽셀(디폴트) MM_LOMETRIC : 논리좌표 단위 = 0.1mm MM_HIMETRIC : 논리좌표 단위 = 0.01mm MM_LOENGLISH : 논리좌표 단위 = 0.01inch MM_HIENGLISH : 논리좌표 단위 = 0.001inch MM_ISOTROPIC : 가변(x, y 비율 유지) MM_ANISOTROPIC : 가변(x, y 비율 변화 가능)

60 매핑 모드 MM_TEXT 모드 x 증가 y 증가 y 증가 그 이외의 모드 x 증가

61 윈도우와 뷰포트 윈도우 논리 좌표가 사용되는 영역 뷰포트 물리 좌표가 사용되는 영역 사용자의 눈에 보이는 영역 BOOL SetViewportOrgEx(HDC hdc, int x, int y, LPPOINT lpPoint); BOOL SetWindowOrgEx(HDC hdc, int x, int y, LPPOINT lpPoint);

62 뷰포트 원점 이동 SetViewportOrgEx(hdc, 50, 50, NULL);
Rectangle(hdc, 0, 0, 200, 200); Viewport 원점 (50, 50) 논리좌표의 (0,0) 이 여기에 매핑 200 사각형 물리 좌표 (250, 250) 논리좌표의 (200,200) 이 여기에 매핑 200

63 윈도우 원점 이동 SetWindowOrgEx(hdc, 50, 50, NULL);
Rectangle(hdc, 0, 0, 200, 200); 150 Window 원점 (50, 50) 물리좌표의 (0,0) 이 여기에 매핑 사각형 물리 좌표 (150, 150) 논리좌표의 (200,200) 이 여기에 매핑 200

64 가변 비율 매핑 BOOL SetWindowExtEx(HDC hdc, int x, int y, LPSIZE lpSize);
논리 좌표의 범위 지정 논리 좌표는 (x, y) 범위 내의 좌표 가짐 BOOL SetViewportExtEx(HDC hdc, int x, int y, LPSIZE lpSize); 물리 좌표의 범위 지정

65 비트맵 비트맵 리소스 사용 메모리 DC 사용 HDC CreateCompatibleDC(HDC dc);
대신 메모리 DC에 비트맵을 설정하고 메모리 DC를 화 면 DC로 복사함 HDC CreateCompatibleDC(HDC dc); HBITMAP LoadBitmap(HINSTANCE hInstance, LPCTSTR lpBitmapName);

66 DC간의 복사 BOOL BitBlt(HDC hdcDest, int x, int y, int w, int h, HDC hdcSrc, int xsrc, int ysrc, DWORD dwROP); dwROP : 래스터 연산 방법(SRCCOPY, DSTINVERT, MERGECOPY, MERGEPAINT) BOOL StretchBlt(HDC hdcDest, int x, int y, int w, int h, HDC hdcSrc, int xsrc, int ysrc, int wSrc, int hSrc, DWORD dwROP); 확대/축소 복사 가능

67 폰트 HFONT CreateFont(...); LOGFONT 구조체를 이용하여 폰트 생성 가능
인자의 갯수가 많음 lpszFaceName : 글꼴 이름 LOGFONT 구조체를 이용하여 폰트 생성 가능 HFONT CreateFontIndirect(CONST LOGFONT *lplf);

68 LOGFONT 구조체

69 문자열 출력 도구 COLORREF SetTextColor(HDC hdc, COLORREF crColor); COLORREF SetBkColor(HDC hdc, COLORREF crColor); int SetBkMode(HDC hdc, int mode); 불투명(OPAQUE) or 투명(TRANSPARENT) HELLO WORLD 글자색 배경색

70 컨트롤 사용자와의 인터페이스를 위한 도구 운영체제가 사용가능 한 컨트롤 제공 사용자의 정형화된 입력을 받기 위해 사용
차일드 윈도우 : 메시지 처리 가능 운영체제가 사용가능 한 컨트롤 제공 버튼, 에디트, 리스트박스, 콤보박스, 스크롤 등 사용자는 컨트롤 윈도우 클래스를 사용하기만 하면 됨 button, edit, listbox, combobox, scrollbar 등이 클래스 이름 임

71 컨트롤 통지 메시지 WM_LBUTTONDOWN 발생 버튼이 메시지 처리(ex.눌린 효과) 마우스 왼쪽
버튼 클릭 부모 윈도우에 통지 메시지 전송 부모 윈도우에서 통지 메시지 처리

72 WM_COMMAND 차일드 윈도우가 부모 윈도우에 통지 메시지를 전송할 때 사용 부모 윈도우에서의 메시지 처리
차일드 윈도우가 부모 윈도우에 통지 메시지를 전송할 때 사용 HIWORD(wParam) : 통지 코드 LOWORD(wParam) : 컨트롤 ID lParam : 메시지 보낸 차일드 윈도우 핸들 부모 윈도우에서의 메시지 처리 어떤 컨트롤에서 온 어떤 통지 메시지인지를 보고 판단 해서 처리

73 버튼 컨트롤 윈도우 클래스 이름 윈도우 타이틀 윈도우 스타일 CreateWindow( “button” , “Click Me”,
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 20, 20, 100, 25, hWnd, (HMENU) 0, g_hInst, NULL); 윈도우 좌표 윈도우 크기 부모 윈도우 핸들 컨트롤 ID

74 버튼의 종류 푸쉬 버튼 : 버튼 클릭 체크 박스 버튼 : 참/거짓 선택 각각 토글 가능 라디오 버튼 : 여러개 중 하나 선택

75 버튼 스타일 BS_PUSHBUTTON BS_DEFPUSHBUTTON BS_CHECKBOX BS_3STATE
BS_AUTOCHECKBOX BS_AUTO3STATE BS_RADIOBUTTON BS_GROUPBOX

76 부모 윈도우와의 통신 부모 윈도우 버튼 컨트롤 통지 메시지 BN_CLICKED BN_CLICKED BM_GETCHECK,
부모 윈도우에 버튼이 클릭되었음을 알리는 통지 메시지 WM_COMMAND 메시지를 이용해서 보냄 BN_CLICKED 부모 윈도우 버튼 컨트롤 BM_GETCHECK, BM_SETCHECK

77 버튼 메시지 부모 윈도우에서 버튼 컨트롤에 보내는 메시지 체크박스에 처리하고 하는 내용을 메시지로 전송
BM_SETCHECK : 체크박스의 상태 변경 wParam : 변경할 상태(BST_CHECKED, BST_UNCHECKED, BST_INDETERMINATE) BM_GETCHECK : 체크박스의 상태 확인

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

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

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

81 리스트박스 컨트롤 선택 가능한 여러 항목(문자열) 중 하나 이상을 선택하 는 컨트롤 리스트박스 스타일
LBS_MULTIPLESEL : 다중 선택 가능 LBS_NOTIFY : 목록 선택시 부모에게 통지 LBS_SORT : 추가된 항목 자동 정렬 LBS_OWNERDRAW : 비트맵 또는 그림 추가 LBS_STANDARD

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

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

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

85 스크롤바 컨트롤 범위와 현재 위치값을 가진 컨트롤
반드시 범위 지정 후 사용 BOOL SetScrollRange(HWND hwnd, int nBar, int min, int max, BOOL bRedraw); int SetScrollPos(HWND hwnd, int nBar, int nPos, BOOL bRedraw); 부모 윈도우에 통지 메시지 대신 WM_HSCROLL, WM_VSCROLL 전송

86 WM_HSCROLL,WM_VSCROLL
LOWORD(wParam) : 스크롤바 내의 누른 위치 SB_LINEUP, SB_LINEDOWN, SB_PAGEUP, SB_PAGEDOWN, SB_THUMBPOSITION, SB_THUMBTRACK HIWORD(wParam) : 현재 위치 lParam : 스크롤바의 윈도우 핸들

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

88 다이얼로그 프로그램과 사용자 간의 대화수단 다이얼로그의 종류 명령 및 정보 전달을 위한 특별한 윈도우
컨트롤을 이용하여 입력 처리 다이얼로그의 종류 Modal Dialog : dialog 종료 전에 메인 윈도우로 전환 불 가 Modeless Dialog : dialog가 떠 있는 상태에서 메인 윈도 우로 전환 가능

89 모달 다이얼로그 int DialogBox(HINSTANCE hInstance, LPCTSTR lpTemplate, HWND hWndParent, DLGPROC lpDlgFunc); lpTemplate : 다이얼로그 템플릿의 리소스 ID hWndParent : 다이얼로그의 부모 윈도우 lpDlgFunc : 다이얼로그 프로시저(메시지 처리) BOOL EndDialog(HWND hDlg, int res); res : DialogBox의 리턴값으로 전달

90 Dialog Procedure 윈도우 프로시저와 비슷한 역할
다이얼로그에 전달된 메시지 처리 리턴값이 다름 TRUE인 경우 : 메시지 처리 성공 FALSE인 경우 : 메시지 처리 실패. 윈도우즈가 처리함 다이얼로그 만들 때 WM_INITDIALOG 메시지 발생 BOOL CALLBACK DlgProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam);

91 컨트롤과의 통신 HWND GetDlgItem(HWND hDlg, int nID);
int GetDlgCtrlID(HWND hwndCtl); UINT GetDlgItemText(HWND hDlg, int nID, LPTSTR lpStr, int nMaxCnt); BOOL SetDlgItemText(HWND hDlg, int nID, LPCTSTR lpStr); UINT GetDlgItemInt(HWND hDlg, int nID, BOOL *lpTranslated, BOOL bSigned); BOOL SetDlgItemInt(HWND hDlg, int nID, UINT uValue, BOOL bSigned);

92 모델리스 다이얼로그 모달 다이얼로그에 비해 처리가 복잡하고 어려움 직접 다이얼로그를 만들고 파괴해야 함
HWND CreateDialog(HINSTANCE hInstance, LPCTSTR lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc); 만들고 나서 ShowWindow를 호출하여 화면에 보이도 록 설정

93 모델리스 다이얼로그 BOOL IsWindow(HWND hWnd);
다이얼로그를 닫을 때도 EndDialog 대신 DestroyWindow를 이용 메시지 루프 변경 while( GetMessage(&Message,0,0,0) ) { if( !IsWindow(hDlg)||!IsDialogMessage(hDlg,iMessage) ) { TranslateMessage(&Message); DispatchMessage(&Message); }

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


Download ppt "Win32 API Programming 이 계 임."

Similar presentations


Ads by Google