DirectX11

DirectX11 - Tutorial 2 (Hello World)

재밌는게임~ 2024. 8. 3. 17:31

WinMain() 함수는 Win32 콘솔의 main() 함수와 동일하다. 여기서 애플리케이션이 시작되고 기본적인 초기화를 수행할 수 있습니다. 저는 보통 창을 만드는 코드, 기본 루프, 그리고 보통 타이머를 위한 코드를 넣는다. WinMain() 함수의 프로토타입은 다음과 같습니다.

 

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow);

 

이 것들을 하나씩 알아보자!

 

WINAPI 

매개변수에 대해 알아보기 전에, 매개변수 바로 앞에 있는 것을 살펴보겠습니다. int와 WinMain 사이에 WINAPI라는 단어가 있다.  WINAPI는 매개변수 전달 방법이다. WINAPI에서는 왼쪽에서 오른쪽으로 전달됩니다. (C++20 부터도 명시적으로 왼쪽에서 오른쪽으로 순서가 동작한다라고 나와 있다.)

 

HINSTANCE

이 첫 번째 매개변수는 "인스턴스에 대한 핸들"의 약어입니다. 핸들은 객체와 같은 것을 식별하는 32비트 정수입니다. 인스턴스는 애플리케이션의 복사본이며. 멀티태스킹과 프로그램의 여러 복사본을 실행할 수 있는 기능으로 인해 Windows는 어떤 프로그램이 무엇인지 추적할 방법이 필요하다. 이를 위해 모든 애플리케이션의 각 인스턴스에 "인스턴스에 대한 핸들" 또는 각 애플리케이션을 다른 애플리케이션과 식별하는 정수를 제공합니다.

"프로그램이 시작되면 Windows는 숫자를 선택하여 이 매개변수에 넣습니다."

 

 

HINSTANCE hPrevInstance,

여기서 옛날에 쓰이던 인스턴스이다. 이 두 번째 매개변수는 이전 인스턴스의 핸들을 나타낸다.. 즉, 애플리케이션의 사본이 여러 개 열려 있는 경우 hPrevInstance는 생성될 마지막 인스턴스의 핸들을 포함합니다. 이론적으로는 그렇습니다.

 

32비트 프로세서가 등장하기 훨씬 전, Windows 95 이전에는 "동일한 애플리케이션의 여러 사본이 동일한 메모리 공간을 공유해야 했다." 이는 상황을 크게 복잡하게 만들었고, 많은 프로그래머는 애플리케이션이 여러 사본을 실행하지 않도록 하는 데 관심을 가졌다. 이를 피하기 위해 hPrevInstance는 이전 인스턴스(있는 경우)에 대한 핸들을 제공하고 이것이 유일한 경우 NULL을 반환하여 프로그래머가 실행 중인 사본을 감지할 수 있도록 해야한다.

 

하지만 이제 32비트 애플리케이션이 있으므로 Windows는 각 애플리케이션에 자체 메모리 공간을 제공하고 hPrevInstance는 더 이상 사용되지 않습니다. 이전 버전과의 호환성을 위해서만 존재하며 다른 복사본이 존재함에도 불구하고 모든 애플리케이션에서 NULL과 같습니다.

 

LPSTR lpCmdLine,

이 매개변수는 응용 프로그램에 대한 존재를 호출하는 명령줄을 포함하는 문자열에 대한 포인터이다. 예: "MyApp.exe"라는 응용 프로그램이 있고 시작 메뉴의 실행 명령 프롬프트에서 실행한 경우 "MyApp.exe" 또는 "MyApp.exe RunA" 또는 "MyApp.exe RunB"와 같이 실행할 수 있습니다. 어느 경우든 lpCmdLine은 입력된 모든 내용을 저장하여 프로그램이 특수 매개변수를 확인할 수 있도록 한다.

이 기능은 게임 프로그래밍에서 안전 모드, 창 모드, 소프트웨어 렌더링 모드, 치트 코드 모드 등 특수 모드를 실행하는 데 유용합니다.

 

int nCmdShow

이 매개변수는 생성 시 창이 어떻게 나타날지 나타낸다. 예를 들어, 창을 최소화, 최대화 또는 일반으로 표시하거나, 심지어 백그라운드에서 실행 중인 창을 열 수도 있다. 반드시 사용할 필요는 없지만 원하는 경우 사용할 수 있습니다. 일반적으로 게임 프로그래밍에서는 사용하지 않지만 가끔 유용할 수 있습니다.

여기서도 다양한 매개변수가 있기 때문에 다른방향으로 창을 띄우고 싶다면 구글링을 해보자!

 

#include <windows.h> // 기본 windows 헤더 파일 포함

// 모든 Windows 프로그램의 진입점
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nShowCmd)
{
    // MessageBox()를 사용하여 "Hello World" 메시지 상자 생성
    MessageBox(NULL,
               L"Hello World!",
               L"Just another Hello World program!",
               MB_ICONEXCLAMATION | MB_OK);

    // Windows에 0 반환
    return 0;
}

 

이 코드를 넣어보면 

이러한 창이 나왔을 것이다.

 

#include <windows.h>

windows.h 헤더 파일은 기본적으로 Windows 프로그래밍에 유용한 많은 다른 헤더 파일을 포함하는 컨테이너일 뿐이므로, 사용자가 직접 많은 헤더 파일을 추가할 필요가 없다.

 

MessageBox ()

이것은 데모에서 본 메시지 상자를 만드는 함수이고, 프로토타입은 다음과 같다.

 

int MessageBox(HWND hWnd,
               LPCTSTR lptext,
               LPCTSTR lpcaption,
               UINT utype);

 

HWND hWnd,

HWND는 창에 대한 핸들이다. 이전에 살펴봤듯이 핸들은 객체를 식별하는 정수이며 이 경우 창을 식별한다. 지금은 만든 창이 없으므로 NULL을 입력하고 Windows는 이 메시지가 어떤 창에서도 오지 않고 데스크톱에서 온다.

 

LPCTSTR 텍스트,

이것은 메시지 상자의 텍스트를 포함하는 16비트 문자열에 대한 포인터이다.

 

LPCTSTR lpcaption,

이것은 메시지 상자의 타이틀 바 또는 캡션 텍스트를 포함하는 16비트 문자열에 대한 포인터이다.

 

UINT utype

이 매개변수는 메시지 상자의 스타일을 결정한다. 다음은 이 매개변수에 넣을 수 있는 일반적으로 사용되는 값의 목록입니다(여러 값에 대한 논리적 OR 연산자와 결합).

메시지 상자에 표시되는 버튼을 나타내려면 다음 값 중 하나를 지정

 

MB_CANCELTRYCONTINUE The message box contains three push buttons: Cancel, Try Again, Continue.
MB_OK The message box contains one push button: OK. This is the default.
MB_OKCANCEL The message box contains two push buttons: OK and Cancel.
MB_RETRYCANCEL The message box contains two push buttons: Retry and Cancel.
MB_YESNO The message box contains two push buttons: Yes and No.
MB_YESNOCANCEL The message box contains three push buttons: Yes, No, and Cancel.

To display an icon in the essage box, specify one of the following values:

MB_ICONINFORMATION An icon consisting of a lowercase letter i in a circle appears in the message box.
MB_ICONEXCLAMATION An exclamation-point icon appears in the message box.
MB_ICONERROR A stop-sign icon appears in the message box.

 

여기 있는 연산자를 통해서 버튼을 다양하게 만들 수 있다.

 

 

728x90