一応、VisualStudioとBCCの両方で動作する・・・はず。
※イベント処理を追加してちょっとだけバージョンアップ
>
#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));
};
#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);
}
}
}