먼저 DirectX9 환경에서 작업을 하려면 SDK를 설치해야한다.

https://www.microsoft.com/en-us/download/details.aspx?id=6812

 

DirectX SDK - (June 2010)

Download the complete DirectX SDK, which contains the DirectX Runtime and all DirectX software required to create DirectX compliant applications.

www.microsoft.com

 

위에 사이트에서 파일을 다운 받으면 다음과 같이 파일이 생긴다.

파일을 클릭 후에 설치를 진행하다보면

이러한 창이 생기는데 문제가 발생하면 해당 회사에 정보를 보낼 것인지에 대한 것이니

Yes 또는 No 둘 중 아무거나 선택해도 상관없다.

 

다음을 누르게 되면 위와 같은 화면이 나오게되는데 X표시 되어있는 것은

설치를 안해도 되지만 혹시모르니 X 옆의 화살표를 누른 뒤 첫번째 칸에 있는 것을 눌러서

추가를 하자

 

그런데 간혹가다 설치를 하고나서 다음과 같은 오류가 발생하는 경우가 있을 수가 있다.

이유는 SDK를 설치하는 도중에 이미 다운 받아져 있는 파일과 서로 충돌이 일어나서 그런 것이다.

해당 문제를 해결하려면 시작 / 명령 프롬프트를 실행하고 콘솔 창에 다음과 같이 입력한다.

 

MsiExec.exe /passive /X{F0C3E5D1-1ADE-321E-8167-68EF0DE699A5}

MsiExec.exe /passive /X{1D8E6291-B0D5-35EC-8441-6616F567A0F7}

 

위에 문구를 입력하게되면 

 

현재 설치되어 있는 아래 두 가지의 패키지가 삭제가 된다.

 

Microsoft Visual C ++ 2010 x86 재배포 가능 패키지

Microsoft Visual C ++ 2010 x64 재배포 가능 패키지

 

삭제 후에 다시 설치를 진행하면 정상적으로 설치가 완료된다.

 

설치가 완료된 후에는 해당 프로젝트에 들어가서 프로젝트 속성을 클릭한 다음에 VC++ 디렉터리로 이동한 후에

포함 디렉터리에는 설치 폴더에 있는 Include 폴더를

라이브러리 디렉터리에는 Lib 폴더를 포함 시켜준다.

그 다음에 stdafx.h 또는 framework.h에 가서 다음과 같이 헤더를 추가해준다.

(기본적으로 추가되어 있는 헤더보다 아래에 추가해야한다!!)

헤더파일까지 추가를 완료했으면 정상적으로 작동할 것이다.

API 헤더 파일

-> 윈도우즈에서는 하나의 헤더 파일에 모든 API 함수들의 원형과 사용하는 상수들이 죄다 정의되어 있기 때문에 windows.h만 포함하면 된다.

-> windows.h를 포함하고 난 후에 함수 원형과 전역변수를 선언한다.

 

시작점

-> 윈도우즈는 여러 개의 프로그램이 동시에 실행되는 멀티 테스킹 시스템일 뿐만 아니라

하나의 프로그램이 여러 번 실행될 수도 있다.

-> 이때 실행되고 있는 각각의 프로그램을 프로그램 인스턴스라고 하며 간단히 줄여서 인스턴스라고 한다.

 

hInstance

->프로그램 자체를 일컫는 정수값이며 프로그램 내부에서 자기 자신을 가리키는 1인칭 대명사이다.

 

메시지 처리 함수(WndProc)

-> WndProc은 사용자와 시스템이 보내오는 메시지를 처리하는 함수이다.

-> 소스를 분석할 때 주의깊게 봐야 할 부분은 WinMain이 아니라 WndProc이다.

 

윈도우 클래스

-> 윈도우 클래스는 windows.h에 다음과 같이 정의되어 있는 구조체이다.

 

typedef struct tagWNDCLASS
{
  UINT style;
  WNDPROC lpfnWndProc;
  int cbClsExtra;
  int cbWndExtra;
  HINSTANCE hInstance;
  HICON hicon;
  HCURSOR hCursor;
  HBRUSH hbrBackground;
  LPCSTR lpszMenuName;
  LPCSTR lpszClassName;  
} WNDCLASS;

WNDCLASS 구조체의 각 멤버 의미는 다음과 같다.

 

style

-> 윈도우가 어떤 형태를 가질 것인가를 지정하는 멤버

-> CS_HREDRAW와 CS_VREDRAW 값을 OR 연산자( | )로 연결하여 사용한다.

-> 이 스타일은 윈도우의 수직(또는 수평) 크기가 변할 경우 윈도우를 다시 그린다는 뜻이다.

 

lpfnWndProc

-> 윈도우의 메시지 처리 함수를 지정한다.

-> 메시지 처리 함수의 이름은 보통 WndProc로 정해져 있는 편이다.

 

hInstance

-> 윈도우 클래스를 등록하는 프로그램의 번호

 

hIcon, hCursor

-> 윈도우가 사용할 마우스 커서와 아이콘

 

hbrBackground

-> 윈도우의 배경 색상을 지정

 

lpszMenuName

-> 이 프로그램이 사용할 메뉴를 지정

 

lpszClassName

-> 윈도우 클래스의 이름을 문자열로 정의

-> 변수명이나 함수명을 만들듯이 마음대로 작성할 수 있다.

 

이 중에 제일 중요한 멤버는 윈도우 클래스의 이름을 정의하는 lpszClassName과

메시지 처리 함수를 지정하는 lpfnWndProc이다.

 

나머지는 대부분 디폴트나 0, NULL 같은 값들을 주면 무난하다.

 

유니코드는 16비트의 단일한 값으로 모든 문자를 표현할 수 있는 문자 코드 체계이다.

 

유니코드를 지원하려면 문자형이나 문자열에 대해 C언어의 타입을 바로 쓰지 말고.

유니코드 설정에 따라 변경되는 중간 타입을 사용해야 한다.

 

C언어에 익숙한 사람들은 앞으로 문자나 문자열을 표현할 때 다음 타입들을 사용하도록 해야한다.

C 타입 유니코드 타입
char TCHAR
char* LPSTR
const char* LPCTSTR

char를 바로 쓴 소스는 유니코드로 바꿀 때 일일이 소스를 뜯어 고친 후 다시 컴파일해야 하지만

TCHAR라는 중간 타입을 사용한 소스는 프로젝트 설정에 따라 소스도 같이 바뀌는 효과가 있으므로

소스는 그대로 두고 컴파일만 다시 하면 된다. 문자열이 필요할 때도 char*를 쓰지 말고

가급적이면 LPSTR 또는 TCHAR*를 쓰는 것이 좋다.

 

문자열을 다루는 함수들도 C의 표준 함수를 쓰지 말고 가급적이면 다음과 같이 유니코드를 인식하는 함수를 사용한다.

C 표준 함수 유니코드 지원 함수
strlen lstrlen
strcpy lstrcpy
strcat lstrcat
strcmp lstrcmp
sprintf wsprintf

strlen은 char 타입의 문자열 길이만 조사하지만

lstrlen은 TCHAR 타입의 문자열에 대해서도 동작하므로 이식에 훨씬 더 유리하다.

문자열 상수도 타입이 있으므로 겹 따옴표안에 바로 문자열 상수를 쓰지 말고 TEXT 매크로를 둘러싸는 것이 좋다.

TCHAR* str = "szbuff";       // 일반 형식
TCHAR* str = TEXT("szbuff"); // TEXT 매크로

TEXT 매크로는 유니코드 설정에 따라 문자열 상수의 타입을 변경한다.

유니코드로 컴파일할 때는 각 문자가 16비트의 유니코드 문자가 되며,

그렇지 않을 때는 8비트의 안시(ANSI) 문자가 된다.

 

원칙적으로으로 문자열 상수에 이 매크로를 쓰는 것이 좋다.

#1. 핸들(handle)이란 구체적인 어떤 대상에 붙여진 번호이다.

 

#2. 핸들은 정수값이며 대부분의 경우 32비트값이다.

 

#3. 운영체제가 발급하며 사용자는 쓰기만 한다.

 

#4. 같은 종류의 핸들끼리는 절대로 중복된 값을 가지지 않는다.

 

#5. 핸들은 정수형이므로 값을 가지겠지만 그 실제값이 무엇인지는 몰라도 상관없다.

-> 크고 작은 성질을 가지는 숫자가아니라 단순한 표식이다.

-> 핸들형 변수를 만들고 핸들을 대입받아 쓰고 난 후에는 그냥 버리면 된다.

-> 동적할당한 포인터의 실제 위치가 어디인가 신경쓸 필요없이 사용하다가 헤제하면 그만이다.

 

윈도우즈에서 핸들은 예외없이 접두어 H로 시작되며 핸들값을 저장하기 위해 별도의 데이터형까지 정의해 두고 있다.

HWND, HPEN, HBRUSH, HDC 등이 핸들을 담기 위한 데이터형들이며 모두 부호없는 정수형이다.

+ Recent posts