[ create a new paste ] login | about

Link: http://codepad.org/zTETBtmr    [ raw code | output | fork ]

C++, pasted on Jan 17:
// 模擬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;
}


Output:
1
2
3
4
生成!
なんだよこれ!
描画!
終了!


Create a new paste based on this one


Comments: