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