windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기...
TRANSCRIPT
Game Programming I
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
Windows 프로그래밍 (1)
March 27, 2006
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
목표
윈도우프로그래밍에서이용되는이벤트구동프로그래밍모델의이해
Direct3D를이용하는윈도우어플리케이션의작성을위한최소한의코드이해
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
윈도우 (Win32) 어플리케이션
Direct3D API (어플리케이션프로그래밍인터페이스)를이용하기위해필요
Win32 API를이용해작성C 프로그래밍언어로공개된저수준함수와구조체의집합
우리가작성한어플리케이션과운영체제(OS)가서로통신하도록도와줌
핵심테마 –창을제어하는것메뉴, 도구모음, 스크롤바, 버튼, 대화상자컨트롤
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
둘러보기
자원 (Resources)CPU 사이클, 메모리, 모니터화면등
다수의어플리케이션은자원을공유
이벤트 (Events), 메시지큐, 메시지, 메시지루프이벤트구동프로그래밍모델 (“event-driven programming model”)
이벤트발생 메시지전달 메시지큐에추가메시지루프가메시지확인 해당하는창의윈도우프로시저로메시지전달
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
이벤트 구동 프로그래밍 모델
이벤트이벤트
어플리어플리케이션케이션 AA메시지메시지루프루프
어플리어플리케이션케이션 BB메시지메시지루프루프
어플리어플리케이션케이션 CC메시지메시지루프루프
윈도우윈도우
프로시저프로시저A1A1
윈도우윈도우
프로시저프로시저B1B1
윈도우윈도우프로시저프로시저
C1C1
윈도우윈도우프로시저프로시저
C2C2
메시지큐
어플리케이션A
메시지큐
어플리케이션B
메시지큐
어플리케이션C
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
GUI (Graphical User Interface)
그래픽사용자인터페이스
윈도우의 캡션 바 메뉴 바
툴 바
크기 조절 바상태 바 윈도우 클라이언트 영역
대화 상자
버튼 컨트롤
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
MS Visual C++ 6.0
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
File New
1
2
3
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
New Win32 Application
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
New Win32 Application
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
ClassView
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
FileView
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
File New
1
2
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
New C++ File
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
Hello
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
“main.cpp”
#include <windows.h>
HWND MyMWindowHandle = 0;
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR, intnShowCmd )
{// Create the main window
// Main message loop
}
LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
}
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
WNDCLASS와 등록
// Registers the window class
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;wc.lpfnWndProc = (WNDPROC)WndProc;wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hInstance = hInstance;wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION );wc.hCursor = LoadCursor( 0, IDC_ARROW );wc.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );wc.lpszMenuName = 0;wc.lpszClassName = szClassName;
RegisterClass(&wc);
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
MSDN Library (1)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
MSDN Library (2)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
MSDN Library (3)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
윈도우 만들기와 보여주기
// Create the main window
MyMWindowHandle = CreateWindow( szClassName,
"Hello",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
0,
0,
hInstance,
0 );
if( !MyMWindowHandle )
return false;
ShowWindow( MyMWindowHandle, nShowCmd );
UpdateWindow( MyMWindowHandle );
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
메시지 루프
// Main message loop
MSG msg;
while( GetMessage( &msg, 0, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage (&msg );
}
UnregisterClass( szClassName, wc.hInstance );
return msg.wParam;
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
윈도우 프로시저
LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{switch( msg ) {case WM_LBUTTONDOWN:
MessageBox( 0, "Hello, World!!!", "Hello", MB_OK );break;
case WM_KEYDOWN:if( wParam == VK_ESCAPE ) {
DestroyWindow( MyMWindowHandle );}break;
case WM_DESTROY:PostQuitMessage( 0 );break;
default:return DefWindowProc( hWnd, msg, wParam, lParam );
}return 0;
}
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
MessageBox 함수
API 함수
hWnd –소유주윈도우의핸들 (null 가능)
lpText –메시지상자에넣을텍스트
lpCaption –메시지상자의제목에넣을텍스트
uType –메시지상자의스타일 (MB_OK, MB_OKCANCLE, MB_YESNO, MB_ICONINFORMATION, MB_ICONQUESTION, …)
리턴값 – IDOK, IDCANCLE, IDYES, IDNO, …
int MessageBox (HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType
);
int MessageBox (HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType
);
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
향상된 메시지 루프
int Run( ){
MSG msg;while( true ){
if( ::PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ){
if( msg.message == WM_QUIT )break;
::TranslateMessage( &msg );::DispatchMessage (&msg );
}else
// 게임 코드를 실행한다.}return msg.wParam;
}
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
연습과제 (1)
윈도우어플리케이션에서다음을변경시키시오.윈도우배경색상
아이콘
커서
윈도우의크기
메시지상자의내용
새로운메시지상자를생성하시오.마우스우측버튼을클릭했을때, 메시지상자생성
키보드의 Enter키를눌렀을때, 메시지상자생성
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
선 그리기
선 (Line)두점사이의이동경로
마우스로드래그하는경로를따라생성
알고리즘마우스왼쪽버튼이눌렸을때의위치 (x, y) 를저장
(x1, y1)
마우스가드래그된위치 (x, y)와 (x1, y1) 사이의경로를직선으로그림
(x, y)를 (x1, y1)에저장
마우스왼쪽버튼이올라갈때까지계속반복
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
Creating Variables
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
Window Procedure (1)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
Window Procedure (2)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
Result (1)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
사각형 그리기
펜(pen)과브러쉬(brush)의색상변경create select delete
HPEN CreatePen ( int fnPenStyle, int nWidth, COLOREF crColor );HPEN HPEN CreatePenCreatePen ( ( intint fnPenStylefnPenStyle, , intint nWidthnWidth, COLOREF , COLOREF crColorcrColor ););
PS_SOLID
PS_DASH
PS_DOT
PS_DASHDOT
PS_DASHDOTDOT
HBRUSH CreateSolidBrush ( COLOREF crColor );HBRUSH HBRUSH CreateSolidBrushCreateSolidBrush ( COLOREF ( COLOREF crColorcrColor ););
HBRUSH CreateHatchBrush ( int fnStyle, COLORREF crColor );
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
MSDN – CreatePen
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
MSDN – CreateHatchBrush
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
Creating a Function
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
Window Procedure
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
DrawRect( )
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
Result (2)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
사각형 움직이기
타이머 (Timer)정해진간격으로시간을측정해주는내부함수 (단위: milliseconds)
함수 – SetTimer ( ), KillTimer ( )
이벤트– WM_TIMER
알고리즘WM_TIMER 통지를받을때마다사각형의위치를변경시킴
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
MSDN – Timers
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
New Definition
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
Creating a Timer
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
Window Procedure
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
Killing a Timer
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
DrawRect( )
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
InvalidateRect( )
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
Result (3)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
Erasing the Background
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
Result (4)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1
연습과제 (2)
사각형을세로나대각선으로움직이도록만드시오.
사각형이윈도우의끝에부딪히면반대방향으로바꿔움직이도록만드시오.
RECT rect;GetClientRect( MyMWindowHandle, &rect );
rect.left, rect.top, rect.right, rect.bottom
RECT RECT rectrect;;GetClientRectGetClientRect( ( MyMWindowHandleMyMWindowHandle, &, &rectrect ););
rect.leftrect.left, , rect.toprect.top, , rect.rightrect.right, , rect.bottomrect.bottom