Visual C++ & OOP ( 2001/12/3 ~ 2001/12/7)

Download Report

Transcript Visual C++ & OOP ( 2001/12/3 ~ 2001/12/7)

이계임
1
 GUI 기반
 Multitasking 환경
 장치 독립성(Device Independent)
 일관된 사용자 인터페이스
 이벤트 처리 방식(메시지 구동 방식)
 리소스 사용
 메뉴, 비트맵, 아이콘
2
 API(Application Programming Interface)
 운영체제가 응용 프로그램을 위해 제공하는 함수의 집
합.  C Library
 응용 프로그램 개발자들이 운영체제가 제공하는 기능들
을 사용할 수 있도록 운영체제가 제공하는 함수의 집합.
 SDK(S/W Development Kit)
 API를 이용하여 프로그램을 개발하는 개발툴 킷
 API와 유사한 의미로 사용됨.
3
User Application
MFC
Windows
Kernel
API
GDI
User
Device Driver
H/W System
4
 SDK
 API를 사용하여 개발
 Class Library
 MFC, OWL 등 클래스 중심의 프로그래밍
 Visual Tools
 VB, Delphi 등
5
 운영체제를 이해하기 위해서 반드시 필요함.
 다른 개발 방법을 사용하더라고 API를 결국 알아야 하
기 때문.
 프로그램 개발 시 프로그래머의 융통성(flexibility)를
극대화 하기 위해 필요함.
 윈도우즈 프로그래밍의 기본
6
 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
포인터형
7
 windows.h에 정의
자료형
BYTE
WORD
의미
unsigned char
unsigned short
DWORD
UINT
LONG
unsigned long
unsigned int
long
LPSTR
LPCSTR
BOOL
char*
const char*
int (TRUE, FALSE)
8
 대상에 붙여진 번호로 32bit 정수값
 윈도우 핸들, DC 핸들, 펜 핸들, 브러쉬 핸들, 메모리 핸
들등
 운영체제가 발급하며 사용자는 이 핸들을 사용하기만
한다.
 같은 종류의 핸들은 중복될 수 없다.
 핸들값 저장에 사용되는 자료형
 HWND, HDC, HPEN, HBRUSH 등
9
 프로그램의 시작점(Entry Point) : 프로그램 초기
화 및 시작.
 메인 윈도우를 화면에 만들고 출력.
 int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance, LPSTR
lpszCmdParam, int nCmdShow);




hInstance : 프로그램의 인스턴스 핸들
hPrevInstance : Win32에서는 항상 NULL
lpszCmdParam : 명령행 인수
nCmdShow : 프로그램 실행 형태(보통, 최소화, 최대화
등)
10
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszCmdParam, int nCmdShow)
{
① 윈도우 클래스 정의
② 윈도우 클래스 등록
③ 윈도우 객체 생성
④ 화면에 윈도우 보이기
⑤ Message Loop
}
11
 만들어질 윈도우의 특성을 정의하는 구조체
 style : 윈도우스타일(CS_HREDRAW|CS_VREDRAW)
 lpfnWndProc : 윈도우의 메시지 처리 함수 이름
 WndProc가 일반적인 이름
 cbClsExtra, cbWndExtra : 예약영역
 hInstance : 프로그램의 인스턴스 핸들
 hIcon, hCursor : 마우스 커서와 아이콘 지정
 LoadCursor(), LoadIcon() 함수로 지정
 hbrBackground : 윈도우의 배경색을 칠한 브러시 지정.
 GetStockObject() 함수로 윈도우 기본 브러시 지정
 lpszMenuName : 프로그램이 사용할 메뉴 지정
 lpszClassName : 윈도우 클래스 이름 (문자열)
12
 운영체제에 윈도우 클래스 등록
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);
13
 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)
 만들어진 윈도우는 메모리 상에만 존재할 뿐 화면 출력되지 않
음.
14
 BOOL ShowWindow(hWnd, nCmdShow)
 hWnd : 화면에 출력할 윈도우 핸들
 nCmdShow : 윈도우의 화면 출력 방법
 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);
15
 이벤트 발생을 정보화 한 것  메시지
메시지
Event 발생
마우스 누름
이벤트가 발생한
윈도우 핸들
정보화
이벤트의 종류
이벤트 발생 시각
이벤트 발생 위치
16
WinMain()
{
메시지
루프
}
이벤트 발생
메시지
어플리케이션 큐
시스템
큐
WndProc()
{
윈도우
프로시저
}
운영체제
SendMessage
디폴트 윈도
우 프로시저
PostMessage
17
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);
 메시지를 운영체제로 전달하여 운영체제가 윈도우 프로시저를
호출하도록 함
18
 메시지 전달 시 사용
 hWnd : 메시지 받을 윈도우 핸들
 message : 메시지의 종류
 windows.h에 매크로로 정의되어 있음
 wParam : 메시지에 대한 부가 정보
 lParam : 메시지에 대한 부가 정보
 time : 메시지 발생 시간
 pt : 메시지 발생시 마우스 위치
 메시지의 종류에 따라 wParam, lParam의 의미가 달라
짐
19
 사용자/시스템이 전달하는 메시지 처리.
 프로그램의 실질직이고 고유한 처리.
 운영체제에 의해 호출  콜백함수
 LRESULT CALLBACK WndProc(HWND hWnd,
UINT iMessage, WPARAM wParam, LPARAM
lParam);
 hWnd : 메시지가 전달될 윈도우 핸들
 iMessage : 메시지의 종류
 wParam : 메시지의 부가 정보
 lParam : 메지시의 부가 정보
20
 메시지의 종류에 따른 처리방법을 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));
}
21
 출력에 필요한 정보를 담고 있는 구조체
 폰트, 선의 색상과 굵기, 채움 무늬와 색상, 출력 방법 등
 모든 GDI 출력 함수는 DC에 대한 핸들을 이용하여 그리
기를 수행
 출력을 위해서는 우선 DC를 얻어야 함
 DC 생성 방법
 GetDC(), ReleaseDC() 함수 이용
 BeginPaint(), EndPaint() 함수 이용 : WM_PAINT 메시
지 처리 루틴에서만 사용
22
 화면에 무효화 영역(Invalid Region)이 있을 때 발생
 윈도우의 작업 영역이 지워졌음을 운영체제가 프로그
램에 알려줌
 화면을 보관/복구하는 메커니즘 필요
 모든 그래픽 출력은 WM_PAINT 메시지 시 처리
 모든 프로그램은 화면 복원을 위해 출력 내용을 보관하
거나 복구할 준비를 해야 함
23
 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);
24
 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);
25
 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 전달
26
종료 버튼 클릭
또는 Alt+F4
WM_CLOSE
메시지 발생
PostQuitMessage
호출
WM_QUIT
메시지 발생
디폴트 윈도우
프로시저 전달
윈도우 프로시저
전달
WinMain의
메시지 루프 탈출
DestroyWindow
호출
WM_DESTROY
메시지 발생
프로그램 종료
27
 WM_KEYDOWN 메시지




키보드 입력은 활성 윈도우에만 전달
키보드 입력 시 발생
wParam : 가상키코드
lParam : 입력된 문자의 반복카운트, 스캔 코드 등의 추
가 정보
 WM_CHAR 메시지
 문자 입력 시 발생
 wParam : 입력된 문자의 ASCII 코드
 lParam : 입력된 문자의 반복카운트, 스캔 코드 등의 추
가 정보
28
 윈도우를 다시 그릴 필요가 있는 경우 WM_PAINT 메
시지 발생
 무효화 영역(Invalid Region)이 있음
 WM_PAINT 메시지 처리하면 유효화됨
 BOOL InvalidateRect(HWND hWnd, CONST RECT*
lpRect, BOOL bErase);
 hWnd의 lpRect 영역을 무효화 영역으로 설정  lpRect
를 최소화하여 프로그램 효율을 향상
 bErase : TRUE면 배경을 지우고 다시 그림
29
 메시지 루프의 TranslateMessage 함수는
GetMessage로 꺼낸 메시지가 WM_KEYDOWN 메
시지인 경우에 문자키인지를 검사해서
 문자키인 경우 WM_CHAR 메시지 추가
 문자키가 아닌 경우 아무 일도 하지 않음
while( GetMessage(&Message,0,0,0) ){
TranslateMessage(&Message);
DispatchMessage(&Message);
}
30
 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
 프로그램에서 더블 클릭을 사용하려면 윈도우 스
타일에 설정해야 함
WndClass.lpfnWndProc = (WNDPROC)WndProc;
WndClass.lpszClassName = lpszClassName;
WndClass.lpszMenuName = NULL;
WndClass.style = CS_HREDRAW | CS_VREDRAW |
CS_DBLCLKS;
RegisterClass(&WndClass);
33
 작업영역
 Client Area
 프로그램내에서 실제
출력이 이루어지는 영
역
 프로그래밍의 대상
 비작업영역
 Non Client Area
 타이틀 바, 경계선, 메
뉴, 스크롤 바 등의 영
역
비작업영역
Non Client Area
작업영역
Client Area
34
 비작업영역에서의 마우스 메시지는 일반 마우스 메시
지에 NC 사용
 WM_NCMOUSEMOVE, WM_NCLBUTTONUP,
WM_NCLBUTTONDOWN 등
 비작업영역 메시지는 운영체제가 사용
 프로그램 내에서 처리하는 경우에도 반드시
DefWindowProc에 전달해야 함
35
 WM_TIMER 메시지
 일정한 시간 간격으로 반복 발생하는 메시지
 wParam : 타이머 ID
 lParam : 타이머에 설정된 TimerProc 주소
 VOID CALLBACK TimerProc(HWND hWnd, UINT
uMsg, UINT idEvent, DWORD dwTime);
 WM_TIMER 메시지 발생시 운영체제가 호출
36
 응용 프로그램이 제공하며 운영체제가 호출하는 함수
 콜백함수가 호출되는 조건이 이미 정해져 있음
 콜백함수의 원형을 반드시 지켜야 함
37
 UINT SetTimer(HWND hWnd, UINT nIDEvent,
UINT uElapse, TIMERPROC lpTimerFunc);




hWnd : 타이머 메시지를 받을 윈도우 핸들
nIDEvent : 타이머 번호
uElapse : 타이머의 주기 (ms 단위)
lpTimerProc : 타이머 메시지 발생시 호출되는 콜백 함
수
 BOOL KillTimer(HWND hWnd, UINT nIDEvent);
 타이머 사용 후 운영체제에 반납
38
 LRESULT SendMessage(HWND hWnd, UINT Msg,
WPARAM wParam, LPARAM lParam);
 강제로 메시지를 발생시킴
 SendMessage 함수는 윈도우 프로시저를 호출하며 윈도
우 프로시저가 메시지 처리가 끝낸 다음에야 리턴됨
 PostMessage 함수는 메시지 큐에 메시지를 넣고 바로 리
턴됨
39
 WM_CREATE : 윈도우 생성 시 발생
 초기화에 적합 (Timer 설정 등)
 WM_DESTROY : 윈도우 파괴 시 발생
 종료 처리에 적합 (Timer 해제 등)
 WM_SIZE : 윈도우 크기 변경 시 발생
 WM_MOVE : 윈도우 좌표 변경 시 발생
40
 BOOL GetClientRect(HWND hWnd, 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
WndClass.hCursor = LoadCursor(hInstance,
MAKEINTRESOURCE(IDC_CURSOR1));
WndClass.hIcon = LoadIcon(hInstance,
MAKEINTRESOURCE(IDI_ICON1));
 MAKEINTRESOURCE 매크로
 정수값 리소스 ID를 문자열로 변환
 직접 만든 커서/아이콘 사용 가능
45
 단축키 입력에 사용되는 키 등록
 Shortcut과는 다른 의미
 Shortcut은 메뉴에서 Alt와 함께 문자 입력
 HACCEL LoadAccelerators(HINSTANCE hInstance,
LPCTSTR lpTableName);
 리소스에서 액셀러레이터를 읽어옴
 int TranslateAccelerators(HWND hWnd, HACCEL
hAccTable, LPMSG lpMsg);
 키보드 메시지를 WM_COMMAND로 변경
46
 문자열도 리소스의 일종
 프로그램에서 자주 사용하는 문자열을 등록
 프로그램내의 문자열의 관리가 쉬워짐
 int LoadString(HINSTANCE hInstance, UINT uID,
LPTSTR lpBuffer, int nBufferMax);
 uID : 문자열의 리소스 ID
 lpBuffer : 문자열을 읽을 버퍼
 nBufferMax : 버퍼의 최대크기
47
 그래픽 출력에 사용되는 도구
 펜, 브러쉬, 비트맵, 폰트 등
 핸들로 관리
 따로 도구를 선택하지 않으면 디폴트 도구가 사용됨
 Stock Object
 윈도우즈가 기본적으로 제공하는 GDI Object
 따로 만들거나 파괴 시킬 필요가 없이 사용
48
 HPEN : 선을 그릴 때 사용
 HBRUSH : 면을 채울 때 사용
 HFONT : 문자열 출력에 사용
 HBITMAP : 비트맵 이미지
 HPALETTE : 팔레트
 HRGN : 영역
49
 HGDIOBJ GetStockObject(int nObject);
 윈도우즈에 등록된 Stock object에 대한 핸들을 얻는 함
수
 HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hObject);
 DC내의 GDI 도구 선택시 사용
 이전에 선택되어 있던 도구의 핸들을 리턴
 리턴값을 저장했다가 GDI 도구를 복원하는데 사용
50
핸들 선언
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);
51
 윈도우즈내의 색상 표현을 위한 자료형
 32 bit 정수형 : 각 8bit로 R,G,B 값 표현
 각 RGB값은 0~255 사이의 값
Not Used
31
 RGB 매크로
Blue
Green
Red
0
 RGB(255, 0, 0)의 형태로 사용
 GetRValue,GetGValue,GetBValue 매크로
 COLORREF값에서 R,G,B값을 각각 분리
52
 선(외곽선)을 그릴 때 사용되는 GDI object
 HPEN CreatePen(int nPenStyle, int nWidth,
COLORREF crColor);
 nPenStyle : 펜의 모양(PS_SOLID, PS_DOT)
 nWidth : 펜 두께(PS_SOLID인 경우만 변경)
 crColor : 펜 색
53
 BOOL DeleteObject(HGDIOBJ hObject);
 GDI Object는 사용 후 반드시 삭제
 선택되어 있는 GDI Object는 삭제 불가능
 삭제 전에 반드시 DC내의 GDI 도구를 이전 도구로 복원
 OldPen에 이전에 사용하던 펜 핸들을 저장
 SelectObject 함수의 리턴값 저장
 Stock Object는 따로 삭제할 필요 없음
54
 도형의 내부를 칠하는데 사용하는 GDI Object
 HBRUSH CreateSolidBrush(COLORREF crColor);
 단색 브러시 생성
 HBRUSH CreateHatchBrush(int nStyle, COLORREF
crColor);
 무늬와 색상이 있는 브러시 생성
 HS_BDIAGONAL, HS_CROSS, HS_DIACROSS,
HS_FDIAGONAL 등
55
 원래 그려져 있던 그림과 새로 그리는 그림의 관계 설
정
 COPY, AND, OR, XOR 등
 int SetROP2(HDC hdc, int nDrawMode);
 R2_NOT, R2_COPYPEN(디폴트 모드),
R2_NOTCOPYPEN, R2_MERGEPEN, R2_MASKPEN,
R2_XORPEN 등
56
 논리 좌표
 윈도우즈 내부에서 사용하는 좌표
 논리 좌표의 실제 위치는 경우에 따라 다름
 DC에 대한 핸들을 사용하는 함수에서 사용
 물리 좌표
 실제 화면에 출력되는 좌표
 픽셀 단위 사용
 윈도우 관리 함수/메시지에서 사용
57
물리좌표
(0,0)
논리좌표 = 물리좌표
(0,0)
(200,250)
58
 논리좌표를 물리좌표로 변환하는 방법
 int SetMapMode(HDC hdc, int mode);
 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 비율 변화 가능)
59
MM_TEXT 모드
x 증가
y 증가
y 증가
그 이외의 모드
x 증가
60
 윈도우
 논리 좌표가 사용되는 영역
 뷰포트
 물리 좌표가 사용되는 영역
 사용자의 눈에 보이는 영역
 BOOL SetViewportOrgEx(HDC hdc, int x, int y,
LPPOINT lpPoint);
 BOOL SetWindowOrgEx(HDC hdc, int x, int y,
LPPOINT lpPoint);
61
SetViewportOrgEx(hdc, 50, 50, NULL);
Rectangle(hdc, 0, 0, 200, 200);
Viewport 원점
(50, 50)
논리좌표의 (0,0)
이 여기에 매핑
200
200
사각형 물리 좌표
(250, 250)
논리좌표의 (200,200)
이 여기에 매핑
62
SetWindowOrgEx(hdc, 50, 50, NULL);
Rectangle(hdc, 0, 0, 200, 200);
150
Window 원점
200
(50, 50)
물리좌표의 (0,0)
이 여기에 매핑
사각형 물리 좌표
(150, 150)
논리좌표의 (200,200)
이 여기에 매핑
63
 BOOL SetWindowExtEx(HDC hdc, int x, int y, LPSIZE
lpSize);
 논리 좌표의 범위 지정
 논리 좌표는 (x, y) 범위 내의 좌표 가짐
 BOOL SetViewportExtEx(HDC hdc, int x, int y,
LPSIZE lpSize);
 물리 좌표의 범위 지정
64
 비트맵 리소스 사용
 메모리 DC 사용
 윈도우즈는 비트맵을 직접 화면 DC로 출력하는 함수를
제공하지 않음
 대신 메모리 DC에 비트맵을 설정하고 메모리 DC를 화
면 DC로 복사함
 HDC CreateCompatibleDC(HDC dc);
 HBITMAP LoadBitmap(HINSTANCE hInstance,
LPCTSTR lpBitmapName);
65
 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);
 확대/축소 복사 가능
66
 HFONT CreateFont(...);
 인자의 갯수가 많음
 lpszFaceName : 글꼴 이름
 LOGFONT 구조체를 이용하여 폰트 생성 가능
 HFONT CreateFontIndirect(CONST 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)
HELLO WORLD
글자색
배경색
69
 사용자와의 인터페이스를 위한 도구
 사용자의 정형화된 입력을 받기 위해 사용
 차일드 윈도우 : 메시지 처리 가능
 운영체제가 사용가능 한 컨트롤 제공
 버튼, 에디트, 리스트박스, 콤보박스, 스크롤 등
 사용자는 컨트롤 윈도우 클래스를 사용하기만 하면 됨
 button, edit, listbox, combobox, scrollbar 등이 클래스 이름
임
70
WM_LBUTTONDOWN 발생
버튼이 메시지 처리(ex.눌린 효과)
부모 윈도우에 통지 메시지 전송
마우스 왼쪽
버튼 클릭
부모 윈도우에서 통지 메시지 처리
71
 차일드 윈도우가 부모 윈도우에 통지 메시지를 전송할
때 사용
 HIWORD(wParam) : 통지 코드
 LOWORD(wParam) : 컨트롤 ID
 lParam : 메시지 보낸 차일드 윈도우 핸들
 부모 윈도우에서의 메시지 처리
 어떤 컨트롤에서 온 어떤 통지 메시지인지를 보고 판단
해서 처리
72
윈도우 클래스
이름
윈도우 타이틀
윈도우 스타일
CreateWindow( “button” , “Click Me”,
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
20, 20, 100, 25, hWnd, (HMENU) 0,
g_hInst, NULL);
윈도우
좌표
윈도우
크기
부모 윈도우 컨트롤 ID
핸들
73
 푸쉬 버튼 : 버튼 클릭
 체크 박스 버튼 : 참/거짓 선택
 각각 토글 가능
 라디오 버튼 : 여러개 중 하나 선택
74
 BS_PUSHBUTTON
 BS_DEFPUSHBUTTON
 BS_CHECKBOX
 BS_3STATE
 BS_AUTOCHECKBOX
 BS_AUTO3STATE
 BS_RADIOBUTTON
 BS_GROUPBOX
75
 통지 메시지
 BN_CLICKED
 부모 윈도우에 버튼이 클릭되었음을 알리는 통지 메시지
 WM_COMMAND 메시지를 이용해서 보냄
BN_CLICKED
부모
윈도우
BM_GETCHECK,
BM_SETCHECK
버튼
컨트롤
76
 부모 윈도우에서 버튼 컨트롤에 보내는 메시지
 체크박스에 처리하고 하는 내용을 메시지로 전송
 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, int min,
int max, BOOL bRedraw);
 int SetScrollPos(HWND hwnd, int nBar, int 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, LPCTSTR
lpTemplate, HWND hWndParent, DLGPROC
lpDlgFunc);
 lpTemplate : 다이얼로그 템플릿의 리소스 ID
 hWndParent : 다이얼로그의 부모 윈도우
 lpDlgFunc : 다이얼로그 프로시저(메시지 처리)
 BOOL EndDialog(HWND hDlg, int res);
 res : DialogBox의 리턴값으로 전달
89
 윈도우 프로시저와 비슷한 역할
 다이얼로그에 전달된 메시지 처리
 리턴값이 다름
 TRUE인 경우 : 메시지 처리 성공
 FALSE인 경우 : 메시지 처리 실패. 윈도우즈가 처리함
 다이얼로그 만들 때 WM_INITDIALOG 메시지 발생
 BOOL CALLBACK DlgProc(HWND hWnd, UINT
iMsg, WPARAM wParam, LPARAM lParam);
90
 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);
91
 모달 다이얼로그에 비해 처리가 복잡하고 어려움
 직접 다이얼로그를 만들고 파괴해야 함
 HWND CreateDialog(HINSTANCE hInstance,
LPCTSTR lpTemplate, HWND hWndParent,
DLGPROC lpDialogFunc);
 만들고 나서 ShowWindow를 호출하여 화면에 보이도
록 설정
92
 BOOL IsWindow(HWND hWnd);
 hWnd가 유효한 핸들인지 검사
 다이얼로그를 닫을 때도 EndDialog 대신
DestroyWindow를 이용
 메시지 루프 변경
while( GetMessage(&Message,0,0,0) ) {
if( !IsWindow(hDlg)||!IsDialogMessage(hDlg,iMessage) )
{ TranslateMessage(&Message);
DispatchMessage(&Message);
}
}
93
 WM_USER이후의 메시지 ID 사용
 다른 프로그램 끼리도 통신 가능
 HWND FindWindow(LPCTSTR lpClassName,
LPCTSTR lpWndName);
94