C++環境において複数のWindowを表示するために、行ったことをまとめた記事になります。
開発環境
- OS:Windows 10 / 11
- IDE:Visual Studio 2022
- 言語:C++
- 追加ライブラリ:DxLib
概要
私は主にC++にDxLibを使用してゲーム開発を行っているのですが、DxLibをそのままに制作するアプリケーションは基本的に 1つのウィンドウのみ を前提とした構成になっており、複数ウィンドウを同時に表示することができません。
そこで何とかしようと、Win32 APIというものを使い複数ウィンドウを実装することができたので、その方法を書いていこうと思います。
実装方法
今回はDxlib以外のウィンドウを表示させるまでの手順を書いていきます。
手順1
まずはウィドウを作るためのウィンドウクラスの登録を作っていきます。ウィンドウクラスの登録にはクラス名、ウィンドウプロシージャが必要です。
#include <string>
#include <Windows.h>
// ウィンドウプロシージャ
static LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
// ウィンドウが破棄されたときの処理
case WM_DESTROY:
PostQuitMessage(0);// メッセージループの終了
break;
//それ以外の処理
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}
void Application::CreateWindowClass(void)
{
// ウィンドウクラスの登録
HINSTANCE hInstance = GetModuleHandle(NULL);
WNDCLASS myWindow{};
myWindow.style = CS_HREDRAW | CS_VREDRAW; // ウィンドウスタイル
myWindow.lpfnWndProc = WndProc; // ウィンドウプロシージャのポインタ
myWindow.cbClsExtra = 0; // クラスエクストラメモリ
myWindow.cbWndExtra = 0; // ウィンドウエクストラメモリ
myWindow.hInstance = hInstance; // インスタンスハンドル
myWindow.hIcon = NULL; // アイコンハンドル
myWindow.hCursor = LoadCursor(NULL, IDC_ARROW); // カーソルハンドル
myWindow.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); // 背景ブラシハンドル
myWindow.lpszMenuName = NULL; // メニューネーム
myWindow.lpszClassName = L"window1"; // クラスネーム
RegisterClass(&myWindow);
}
これによりクラススネームL"window1"に上記の情報が登録されます。
手順2
登録したウィンドウクラスを使ってウィンドウを作成、表示させていきます
#include <string>
#include <Windows.h>
HWND Application::CreateSubWindow(void)
{
HWND retWindow;
//ウィンドウネーム
std::wstring windowName = L"subWindow";
RECT windowRect = { 0, 0, SCREEN_SIZE_X, SCREEN_SIZE_Y }; // ウィンドウサイズ
AdjustWindowRect(&windowRect, WS_OVERLAPPEDWINDOW, FALSE); // ウィンドウサイズ調整
// ウィンドウ生成
retWindow = CreateWindow(
L"window1",
windowName.c_str(),
WS_OVERLAPPEDWINDOW,
0, 0, windowRect.right - windowRect.left,
windowRect.bottom - windowRect.top,
NULL, NULL, hInstance, NULL
);
//表示状態を設定する
ShowWindow(retWindow, SW_SHOW);
UpdateWindow(retWindow);
return retWindow;
}
これだけでウィンドウを増やすことができます。
また、登録したウィンドウクラスは使い回しできるので、手順2を行うだけでいくらでもウィンドウを増やすことができます。
今回紹介した方法で作ったウィンドウにはDxlibのサポートが受けられないので注意
まとめ
今回書いてあるのはDxLib以外でのウィンドウ作成なのですが、まだ作成したウィンドウでの描画やウィンドウクラスについてなどまとまっていない部分も多く、今後も記事の続編を書こうと思っております。
次回は、増やしたウィンドウ別の描画について書こうと思います。