// 模擬OS by ミングスレの名無し
#include <string>
#include <vector>
#include <queue>
// -------------------------------------------------------------------
// 定義系 ------------------------------------------------------------
// とりあえずメッセージ
enum WM_MSG { WM_UNDEFINED, WM_CREATE, WM_PAINT, WM_FOO, WM_DESTOROY };
// ハンドル系
typedef unsigned int HANDLE;
typedef HANDLE HWND;
// ウィンドプロシジャ
typedef bool (*WndProc)(HWND, WM_MSG, int);
// なんかウィンドウ
typedef struct { std::string name; WndProc proc; } Window;
// メッセージ構造体
typedef struct _tMsg {
HWND hWnd;
WM_MSG msg;
int param;
_tMsg(): msg(WM_UNDEFINED), param(0) {}
_tMsg(HWND h, WM_MSG m, int i): hWnd(h), msg(m), param(i) {}
} MSG;
// メッセージのキュー
typedef std::queue<MSG> MsgQue;
// ウィンドウとメッセージキューのセット
typedef std::pair<Window, MsgQue> WinSet;
// ウィンドウの列挙
typedef std::vector<WinSet> EnumWin;
// -------------------------------------------------------------------
// OSの中 ------------------------------------------------------------
EnumWin ew;
HANDLE RegisterWindow(const char *name, WndProc proc)
{
Window wm = {std::string(name), proc};
ew.push_back(WinSet(wm, MsgQue()));
return (HANDLE)ew.size()-1;
}
bool GetMessage(HANDLE hWnd, MSG &msg)
{
if( ew[hWnd].second.size()<1 ) return false;
MSG m = ew[hWnd].second.front();
msg.hWnd = hWnd;
msg.msg = m.msg;
msg.param = m.param;
ew[hWnd].second.pop();
return true;
}
bool DispatchMessage(MSG &msg)
{
return ew[msg.hWnd].first.proc(msg.hWnd, msg.msg, msg.param);
}
void os_no_sigoto(HWND hWnd)
{
// 本当はここはリアルタイム
ew[hWnd].second.push(MSG(hWnd, WM_CREATE, 1));
ew[hWnd].second.push(MSG(hWnd, WM_FOO, 1));
ew[hWnd].second.push(MSG(hWnd, WM_PAINT, 1));
ew[hWnd].second.push(MSG(hWnd, WM_DESTOROY, 1));
}
// -------------------------------------------------------------------
// -------------------------------------------------------------------
// -------------------------------------------------------------------
// このOSで動かす何らかのアプリケーションコード ----------------------
// -------------------------------------------------------------------
// ウィンドプロシジャ
bool proc(HWND hWnd, WM_MSG msg, int param)
{
switch(msg)
{
case WM_CREATE:
printf("生成!\n");
break;
case WM_FOO:
printf("なんだよこれ!\n");
break;
case WM_PAINT:
printf("描画!\n");
break;
case WM_DESTOROY:
printf("終了!\n");
break;
default:
// noop
break;
}
return true;
}
// WinMainな奴
int main()
{
HWND hWnd = RegisterWindow("名前", proc); // ウィンドウを登録して
MSG msg;
os_no_sigoto(hWnd); // ここは無視
while(GetMessage(hWnd, msg)) // ウィンドウにメッセージがあるか尋ねて
{
if(!DispatchMessage(msg)) break; // あればディスパッチ
}
return 0;
}