Win32 API Programming 이 계 임.

Slides:



Advertisements
Similar presentations
메시지 처리의 기본 개념 메시지 발생된 이벤트의 종류와 정보를 전달하는 일종의 상수 값 윈도우 프로그래밍 가장 중요한 것은 메시지를 처리하는 것 윈도우 시스템 Application 이벤트 발생 메시지 전송 메시지 처리 화면에 출력.
Advertisements

Computer Graphics 윈도우 프로그래밍 김 창 헌김 창 헌. Computer Graphics 2 윈도우 시스템  윈도우  스크린 위에서 독립적으로 움직일 수 있는 사각형 영역  윈도우 시스템  유저와 어플리케이션간의 그래픽 스크린을 통한 인터페이스 를.
Message Process for SDI Chung-Buk HRD Institute of KCCI Dept. of Information & Communication PhD. Kang, Won-Chan.
강의 내용 : DirectX 개요 DirectX 9 을 이용한 시각화. 목 차 DirectX 출현 배경 DirectX 현재 버전 DirectX 장점 DirectX 구성요소 DirectX SDK 다운로드 및 설치 DirectX SDK 폴더 구성 및 역할 샘플 코드 브라우저.
미디어 프로그래밍 II 소개.
컴퓨터 공학 설계 및 실험 I MFC programming
4. 기본적인 그리기.
2장. 윈도우즈 입출력 1/211 1.
윈도우 일반 공주영상대학 게임과 이 은 순.
7장. MDI 프로그래밍 MDI 프로그래밍에 대한 내용을 배우도록 한다. 지금까지 배운 것은 생성된 윈도우에 단일 화면이 존재하는 형태였다. 이것을 SDI라고 부르고 Single Document Interface의 약자이다. 하나의 문서를 하나의 화면에 보여주는 형태의.
Efl을 이용한 타이젠 네이티브 웨어러블 앱 만들기
Vision System Lab, Sang-Hun Han
제 3 장 변수와 자료형.
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
Windows Programming Chapter 1. Introduction to SDK
윈도우 운영체제와 윈도우 응용 프로그램의 특징을 이해한다.
C++ Espresso 제1장 기초 사항.
제1장 윈도우 프로그래밍 1.1 윈도우 프로그래밍의 개념 1.2 윈도우 프로그램의 기본 구조
Visual C++ Programming Document/View Architecture 3
제1장 윈도우 프로그래밍 1.1 윈도우 프로그래밍의 개념 1.2 윈도우 프로그램의 기본 구조
컨트롤의 동작 원리를 이해한다. 표준 컨트롤의 다양한 속성과 통지 메시지를 이해한다.
5장. 단축키와 비트맵 윈도우 프로그램에는 화면에서 사용자들의 입력을 받아 들이고 출력을 위한 코드 외 부분이 존재한다. 이 부분을 주로 리소스라고 부르고 이들은 주로 화면에 나타난다. 메뉴, 툴바, 비트맵, 단축키, 대화상자 등이 여기에 속한다. 이 부분들은 우리의 프로그램의.
윈도우의 화면 출력 원리를 이해한다. CDC 클래스를 이용한 화면 출력 기법을 배운다.
Chapter 09. 소켓 입출력 모델(I).
다이얼로그 박스와 컨트롤 컴퓨터 계측 및 실습.
2014 ITA 8월 강의 C Programming -1주차- C언어 기초 정대진 ( )
4부 클래스 라이브러리 “4부에서는 자바 언어의 API인 클래스 라이브러리에 관해 설명합니다
Lab 3 Guide: 교재 4장 대화상자 예제. - 프로파일 입력 ( 쪽)
제12장 유연한 카메라 클래스 만들기 학기 컴퓨터게임(DirectX).
Windows Programming.
윤 홍 란 MFC 기초 윤 홍 란
Windows Programming 시작하기
강사 : 이준근 Win32 API 강사 : 이준근
Chapter 02 자바 기본구조 자바 프로그래밍의 기초적인 문법을 소개
2강. JAVA 프로그래밍이란?-II & 변수 JAVA 프로그램 환경설정과 실행 방법 변수란?
컴퓨터 계측 및 실습 스테핑 모터 영남대학교 기계공학부.
Department of Digital Contents Sang Il Park
GUI Programming - Part 2 ( GUI for Python - wxPython )
Window socket programming
MFC 프로그래밍에 관한 팁 / Keyboard / Timer
MFC 프로그래밍에 관한 팁 / Keyboard
Visual C++ Programming
제8장 스텐실.
강사 : 이준근 Win32 API 강사 : 이준근
Visual C++ Programming Common Controls
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
Lecture 3 Graphics with GDI
제 2 장 변수와 상수.
Visual Basic 기초 1 목표: 컴퓨터기반제어에 관련된 학습을 하기 전에 Visual Basic의 기초를 살펴본다.
1. 윈도우 프로그래밍의 이해.
Windows Programming 시작하기
날짜: 팀명: TEAM-SIX 발표자: 이기영
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
MFC Internals.
개정판 누구나 즐기는 C언어 콘서트 제6장 반복문 출처: pixabay.
Chapter 09. 소켓 입출력 모델(I).
Windows 환경에서 동작하는 Arm Emulator(Simulator)
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
GUI 소켓 애플리케이션 Chapter 08. * 학습목표 윈도우 GUI 애플리케이션의 구조와 동작 원리를 이해
제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형.
Java의 정석 제 2 장 변수(Variable) Java 정석 남궁성 강의
WSAAsync Select 김대열 Bit - Academy Sunmoon University, Korea.
데이터베이스실험실 석사 2학기 조정희 TCP/IP Socket Programming… 제 19장 윈도우 기반의 쓰레드 동기화 데이터베이스실험실 석사 2학기 조정희
4장 - PHP의 표현식과 흐름 제어-.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
3장. 제어 메시지 처리하기 1/211 1.
Windows 프로그래밍 환경 및 MFC의 구조
게임과 1학년 Flipping - 파일을 읽어서 출력하는 프로그램
이번 시간에는... 지난 시간까지 2회차에 걸쳐 WML의 택스트 포맷, 이미지 처리, 페이지 이동, 태스크 수행과 이벤트 처리 및 WML 사용자 Input 처리 태그 등, WML 개발에 대해서 알아보았습니다. 이번 시간에는 2회차에 걸쳐, WML 스크립트 개발에 대해서.
윈도우 운영체제와 윈도우 응용 프로그램의 특징 SDK 응용 프로그램 MFC 응용 프로그램
Presentation transcript:

Win32 API Programming 이 계 임

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

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

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

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

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

변수 명명 규칙 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 포인터형

윈도우즈 자료형 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)

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

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

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

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

윈도우 클래스 등록 운영체제에 윈도우 클래스 등록 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);

윈도우 객체 생성 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) 만들어진 윈도우는 메모리 상에만 존재할 뿐 화면 출력되지 않 음.

윈도우 보이기 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);

이벤트 처리 방식 이벤트 발생을 정보화 한 것  메시지 메시지 Event 발생 마우스 누름 정보화 이벤트가 발생한 윈도우 핸들 이벤트의 종류 이벤트 발생 시각 이벤트 발생 위치 Event 발생 마우스 누름 정보화

메시지 전달 순서 WinMain() 이벤트 발생 { 메시지 } 운영체제 루프 메시지 어플리케이션 큐 WndProc() { 윈도우 프로시저 시스템 큐 SendMessage 디폴트 윈도 우 프로시저 PostMessage

메시지 루프 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); 메시지를 운영체제로 전달하여 운영체제가 윈도우 프로시저를 호출하도록 함

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

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

윈도우 프로시저 (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));

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

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

문자열 출력 함수 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);

그래픽 출력 함수 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);

메시지 박스 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 전달

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

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

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

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

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

마우스 입력 마우스 관련 메시지 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 등

더블 클릭 프로그램에서 더블 클릭을 사용하려면 윈도우 스 타일에 설정해야 함 WndClass.lpfnWndProc = (WNDPROC)WndProc; WndClass.lpszClassName = lpszClassName; WndClass.lpszMenuName = NULL; WndClass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; RegisterClass(&WndClass);

작업영역과 비작업영역 작업영역 비작업영역 비작업영역 Client Area Non Client Area 프로그램내에서 실제 출력이 이루어지는 영 역 프로그래밍의 대상 비작업영역 Non Client Area 타이틀 바, 경계선, 메 뉴, 스크롤 바 등의 영 역 비작업영역 Non Client Area 작업영역 Client Area

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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);

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

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

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

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

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

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

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

매핑 모드 논리좌표를 물리좌표로 변환하는 방법 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 비율 변화 가능)

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

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

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

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

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

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

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); 확대/축소 복사 가능

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

LOGFONT 구조체

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

스크롤바 컨트롤 범위와 현재 위치값을 가진 컨트롤 반드시 범위 지정 후 사용 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 전송

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

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

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

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

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

컨트롤과의 통신 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);

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

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

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