DirectX12事始め ウィンドウの生成

初投稿です。
今からDirectXを初めてやってみる人向けの記事です。
今回はウィンドウの作成をやっていこうと思います。
まだ、自分もわからないことだらけなので難しいことはできませんが一緒に理解していけたらと思います。

早速、ウィンドウを作って行きたいと思います。

```c++:Window.h
#include <Windows.h>
class Window
{
public:
   // コンストラクタ
   Window();
   // デストラクタ
   ~Window();

   // ウィンドウハンドルの取得
   HWND Get(void) const {
      return handle;
   }
private:
   //ウィンドウプロシージャ
   static LRESULT WindowProcedure(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
   // この関数内でウィンドウを作っていく
   void CreateWnd(void);

   // ウィンドウの情報を格納する構造体
   WNDCLASSEX window;
   // ウィンドウのサイズを格納する構造体
   RECT rect;
   // ウィンドウのハンドル
   HWND handle;
};
```

これらがWindowクラスで定義する変数と関数になります。
次に中身を書いて行きます。

```c++:Window.cpp
#include "Window.h"
#include <tchar.h>

// コンストラクタ
Window::Window()
{
   CreateWnd();
}

// デストラクタ
Window::~Window()
{
   //ウィンドウの解放
   UnregisterClass(window.lpszClassName, window.hInstance);
}

//ウィンドウプロシージャ
LRESULT Window::WindowProcedure(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
   //ウィンドウが破棄されたとき
   if (msg == WM_DESTROY)
   {
      //OSに対してアプリケーション終了を伝える
      PostQuitMessage(0);
      return 0;
   }
   //規定の処理を行う
   return DefWindowProc(hwnd, msg, wparam, lparam);
}

// ウィンドウ情報のセット•ウィンドウの生成
void Window::CreateWnd(void)
{
   //これは0指定でいいみたいです。
   window.cbClsExtra    = 0;
   //WNDCLASSEXのサイズを指定
   window.cbSize.       = sizeof(WNDCLASSEX);
   //これは0指定でいいみたいです。
   window.cbWndExtra.   = 0;
   //ウィンドウの背景色を指定
   window.hbrBackground = CreateSolidBrush(0x000000);
   //マウスカーソルの指定。今回は標準のものを指定してます
   window.hCursor       = LoadCursor(NULL, IDC_ARROW);
   //使用するアイコンの指定。今回は標準のものを指定してます。
   window.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
   //使用するアイコンの指定。今回は標準のものを指定してます。
   window.hIconSm.      = LoadIcon(NULL, IDI_APPLICATION);
   //インスタンスハンドルの指定
   window.hInstance     = GetModuleHandle(0);
   //ウィンドウプロシージャの指定
   window.lpfnWndProc.  = (WNDPROC)WindowProcedure;
   //ウィンドウの名前を指定
   window.lpszClassName = _T("DirectX12");
   //ウィンドウメニューの名前を指定
   window.lpszMenuName  = _T("DirectX12");
   //ウィンドウの書き直しを指定できます。今回は水平か垂直に変更があったら全体を書き直します。
   window.style.        = CS_HREDRAW | CS_VREDRAW;

   //ウィンドウの登録
   RegisterClassEx(&window);

   //ウィンドウサイズの設定
   //縦幅が480
   rect.bottom = 480;
   rect.left   = 0;
   //横幅が640
   rect.right  = 640;
   rect.top    = 0;

   //サイズの補正
   AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, false);

   //ウィンドウ生成
   windowHandle = CreateWindow(
   window.lpszClassName,
   _T("DirectX12"),
   WS_OVERLAPPEDWINDOW,
   CW_USEDEFAULT,
   CW_USEDEFAULT,
   (rect.right - rect.left),
   (rect.bottom - rect.top),
   nullptr,
   nullptr,
   window.hInstance,
   nullptr);
  }
```

以上でウィンドウの設定が終了しました。
ウィンドウだけでも設定が多いですね。
最後に表示していきます。

```c++:Main.cpp
#include “Window.h”

int main()
{
   Window* win = new Window();

   //表示
   ShowWindow(win->Get(), SW_SHOW);

   //メッセージ格納用構造体
   MSG msg;

   while (msg.message != WM_QUIT)
   {
      //呼び出し側スレッドが所有しているウィンドウに送信されたメッセージの保留されている物を取得
      if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
      {
         //仮想キーメッセージを文字メッセージに変換
         TranslateMessage(&msg);
         //1つのウィドウプロシージャにメッセージを送出する
         DispatchMessage(&msg);
      }
   }

   //ウィンドウクラスの解放
   delete win;

   return 0;
}
```

これでウィンドウ表示完了です。
初めて書いて見たので見にくい点や分かりづらい点があると思いますがご了承ください。
次は、デバイスとコマンド周りを書いていこうと思います。