Win32APIのConsoleアプリ用Class Ver1.2

アバター
バグ
記事: 130
登録日時: 14年前
住所: 愛媛県
連絡を取る:

Win32APIのConsoleアプリ用Class Ver1.2

投稿記事 by バグ » 11年前

毎回、探すの面倒なのでここに置かせてもらおう。
一応、VisualStudioとBCCの両方で動作する・・・はず。

※イベント処理を追加してちょっとだけバージョンアップ

>

CODE:

#pragma once
#include 

namespace ConsoleColor
{
	static CONST WORD Black			= 0x0000;		// 黒
	static CONST WORD DarkBlue		= 0x0001;		// 暗い青
	static CONST WORD DarkGreen		= 0x0002;		// 暗い緑
	static CONST WORD DarkCyan		= 0x0003;		// 暗い水
	static CONST WORD DarkRed		= 0x0004;		// 暗い赤
	static CONST WORD DarkMagenta	= 0x0005;		// 暗い紫
	static CONST WORD DarkYellow	= 0x0006;		// 暗い黄
	static CONST WORD Gray			= 0x0007;		// 灰
	static CONST WORD DarkGray		= 0x0008;		// 暗い灰
	static CONST WORD Blue			= 0x0009;		// 青
	static CONST WORD Green			= 0x000A;		// 緑
	static CONST WORD Cyan			= 0x000B;		// 水
	static CONST WORD Red			= 0x000C;		// 赤
	static CONST WORD Magenta		= 0x000D;		// 紫
	static CONST WORD Yellow		= 0x000E;		// 黄
	static CONST WORD White			= 0x000F;		// 白
};

class CConsole
{
private:
	enum { MaxVK = 256 };

private:
	HANDLE m_in;
	HANDLE m_out;
	BOOL m_key[MaxVK];
	COORD m_mouse;

public:
	VOID (*OnKeyDown) (WORD vk);
	VOID (*OnKeyUp) (WORD vk);
	VOID (*OnMouseMove) (SHORT x, SHORT y);
	VOID (*OnMouseLeftClick) (SHORT x, SHORT y);
	VOID (*OnMouseLeftDoubleClick) (SHORT x, SHORT y);
	VOID (*OnMouseRightClick) (SHORT x, SHORT y);
	VOID (*OnMouseRightDoubleClick) (SHORT x, SHORT y);
	VOID (*OnFocusChanged) (BOOL fcs);

public:
	CConsole (VOID);
	~CConsole (VOID);

public:
	BOOL SetWindowSize (SHORT w, SHORT h);
	BOOL SetCursorVisible (BOOL enb);
	BOOL SetCursorSize (DWORD size);
	BOOL SetCursorPostion (COORD pos);
	BOOL SetCursorPostion (SHORT x, SHORT y);
	BOOL SetFgColor (WORD col);
	BOOL SetBgColor (WORD col);
	
	BOOL GetWindowSize (SMALL_RECT& rect);
	BOOL GetWindowSize (SHORT& x, SHORT& y, SHORT& w, SHORT& h);
	BOOL GetCursorVisible (BOOL& enb);
	BOOL GetCursorSize (DWORD& size);
	BOOL GetCursorPostion (COORD& pos);
	BOOL GetCursorPostion (SHORT& x, SHORT& y);
	BOOL GetFgColor (WORD& col);
	BOOL GetBgColor (WORD& col);
	BOOL GetKeyState (WORD vk);

	BOOL ProcessMessage (VOID);

private:
	VOID Init (VOID);
	VOID KeyEvent (KEY_EVENT_RECORD rec);
	VOID MouseEvent (MOUSE_EVENT_RECORD rec);
	VOID FocusEvent (FOCUS_EVENT_RECORD rec);
	VOID MouseClickCheck (MOUSE_EVENT_RECORD rec, DWORD mask, VOID (*func) (SHORT x, SHORT y));
	VOID MouseMoveCheck (MOUSE_EVENT_RECORD rec, VOID (*func) (SHORT x, SHORT y));
};
>

CODE:

#include "console.h"

// コンストラクタ
CConsole::CConsole (VOID)
{
	Init ();
}

// デストラクタ
CConsole::~CConsole (VOID)
{
}

// メンバ変数の初期化
VOID CConsole::Init (VOID)
{
	// 色々と初期化しておく
	m_in  = GetStdHandle (STD_INPUT_HANDLE);
	m_out = GetStdHandle (STD_OUTPUT_HANDLE);

	for (INT i = 0; i > 4;
		return TRUE;
	}
	else
	{
		col = 0x0000;
		return FALSE;
	}
}

// キー押下状態の取得
BOOL CConsole::GetKeyState (WORD vk)
{
	return m_key[vk];
}

// イベント処理
BOOL CConsole::ProcessMessage (VOID)
{
	// イベントレコード数を取得する
	DWORD cnt = 0;
	if (!GetNumberOfConsoleInputEvents(m_in, &cnt))
	{
		return FALSE;
	}

	// イベント処理
	for (DWORD i = 0; i < cnt; ++i)
	{
		// イベントレコードの取得
		INPUT_RECORD rec;
		if (!ReadConsoleInput(m_in, &rec, 1, &cnt))
		{
			return FALSE;
		}

		// イベントの処理
		switch (rec.EventType)
		{
		case KEY_EVENT:
			KeyEvent (rec.Event.KeyEvent);
			break;
		case MOUSE_EVENT:
			MouseEvent (rec.Event.MouseEvent);
			break;
		case FOCUS_EVENT:
			FocusEvent (rec.Event.FocusEvent);
			break;
		default:
			break;
		}
	}
	return TRUE;
}

// キー関連イベントの処理
VOID CConsole::KeyEvent (KEY_EVENT_RECORD rec)
{
	if (m_key[rec.wVirtualKeyCode] != rec.bKeyDown)
	{
		m_key[rec.wVirtualKeyCode] = rec.bKeyDown;
		if (OnKeyDown != NULL)
		{
			if (m_key[rec.wVirtualKeyCode])
			{
				OnKeyDown (rec.wVirtualKeyCode);
			}
			else
			{
				OnKeyUp (rec.wVirtualKeyCode);
			}
		}
	}
}

// マウス関連イベントの処理
VOID CConsole::MouseEvent (MOUSE_EVENT_RECORD rec)
{
	switch (rec.dwEventFlags)
	{
	// クリック
	case 0:
		MouseClickCheck (rec, FROM_LEFT_1ST_BUTTON_PRESSED, OnMouseLeftClick);
		MouseClickCheck (rec, RIGHTMOST_BUTTON_PRESSED, OnMouseRightClick);
		break;
	// 移動
	case MOUSE_MOVED:
		MouseMoveCheck (rec, OnMouseMove);
		break;
	// ダブルクリック
	case DOUBLE_CLICK:
		MouseClickCheck (rec, FROM_LEFT_1ST_BUTTON_PRESSED, OnMouseLeftDoubleClick);
		MouseClickCheck (rec, RIGHTMOST_BUTTON_PRESSED, OnMouseRightDoubleClick);
		break;
	}
}

// フォーカス関連イベントの処理
VOID CConsole::FocusEvent (FOCUS_EVENT_RECORD rec)
{
	if (OnFocusChanged != NULL)
	{
		OnFocusChanged (rec.bSetFocus);
	}
}

// マウスクリック状態のチェック
VOID CConsole::MouseClickCheck (MOUSE_EVENT_RECORD rec, DWORD mask, VOID (*func) (SHORT x, SHORT y))
{
	if ((rec.dwButtonState & mask) != 0)
	{
		if (func != NULL)
		{
			func (rec.dwMousePosition.X, rec.dwMousePosition.Y);
		}
	}
}

// マウス移動のチェック
VOID CConsole::MouseMoveCheck (MOUSE_EVENT_RECORD rec, VOID (*func) (SHORT x, SHORT y))
{
	if (m_mouse.X != rec.dwMousePosition.X ||
		m_mouse.Y != rec.dwMousePosition.Y)
	{
		if (func != NULL)
		{
			m_mouse = rec.dwMousePosition;
			func (m_mouse.X, m_mouse.Y);
		}
	}
}
最後に編集したユーザー バグ on 2013年10月18日(金) 15:49 [ 編集 1 回目 ]

コメントはまだありません。