ウィンドウを作成するクラスを作りたいのですが、少し困っている部分があります。
ウィンドウハンドルを取得するメソッドを作っているのですが、ウィンドウハンドルは色んな所で使うときがあります。
その為に、今まではグローバル領域にインスタンスを定義していました。
しかし、シングルトンというデザインパターンがあるのを知り、こちらのほうがいいなと思ったのですが、
ウィンドウは一つのプログラムで複数作る可能性があります。
ではシングルトンはダメ。となったのですが、なんだかグローバルに作るのも・・・と思い始めています。
やはりグローバルに置くしかないのか、それとも他に方法があるのか・・・ご教授願います。
一応、現在のクラスを貼っておきます。シングルトンは使っていません。
[CreateWindow.h]
#pragma once
#include <d3dx9.h>
class CCreateWindow
{
private:
WNDCLASSEX wc;
HWND hWnd;
MSG msg;
LPSTR wndName;
int screenWidth;
int screenHeight;
private:
static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
void SetWindowClass(HINSTANCE *hInstance, LPSTR className);
public:
CCreateWindow(int screenWidth, int screenHeight);
virtual ~CCreateWindow(void);
void Init(HINSTANCE *hInstance, LPSTR wndName, LPSTR className, int nCmdShow);
void SetShowWindow(HWND hWnd, int nCmdShow);
BOOL DispatchedMessage(void);
int GetMessageWParam(){return (int)msg.wParam;}
HWND GetHWnd(){return hWnd;}
};
#include "CreateWindow.h"
CCreateWindow::CCreateWindow(int screenWidth, int screenHeight)
{
this->screenWidth = screenWidth;
this->screenHeight = screenHeight;
}
CCreateWindow::~CCreateWindow(void)
{
}
// 初期化
void CCreateWindow::Init(HINSTANCE *hInstance, LPSTR wndName, LPSTR className, int nCmdShow)
{
this->SetWindowClass(hInstance, className);
if(!(RegisterClassEx(&wc)))
{ // 設計書をWindowsに提出
MessageBox(NULL, "ウィンドウ初期化エラー", "", MB_OK);
exit(1);
}
hWnd = CreateWindow(wc.lpszClassName,
wndName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
screenWidth,
screenHeight,
NULL,
NULL,
*hInstance,
NULL
);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
}
// ウィンドウクラスの作成
void CCreateWindow::SetWindowClass(HINSTANCE *hInstance, LPSTR className)
{
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.hInstance = *hInstance;
wc.lpszClassName = className;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName = NULL;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
}
// ウィンドウの表示設定
void CCreateWindow::SetShowWindow(HWND hWnd, int nCmdShow)
{
ShowWindow(hWnd, nCmdShow);
}
// メッセージの送出
BOOL CCreateWindow::DispatchedMessage(void)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if(GetMessage(&msg, NULL, 0, 0) == 0)
{
return false;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return true;
}
// ウィンドウプロシージャ
LRESULT CALLBACK CCreateWindow::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch( message ){
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}