#pragma once

#include "共通\refCTimer.h"

namespace FDK
{
	public ref class CInputEvent
	{
	public:

		property bool b押された
		{
			bool get()
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CInputEvent" );
				return this->_b押された;
			}
			void set( bool value ) 
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CInputEvent" );
				this->_b押された = value;
			}
		}
		property bool b離された
		{
			bool get() { return !(this->_b押された); }
			void set( bool value ) { this->_b押された = !value; }
		}

		// デバイスのGUID。
		// Joystickの場合のみ使用。
		property Guid^ guid;

		/// デバイス番号。
		/// MIDIの場合：MIDIデバイス番号(0〜)
		/// Keyboardの場合：常に 0
		/// Joystickの場合：常に 0
		property int ID;

		// Keyboard の場合は FDK.DirectInput.Key を int にキャストしたもの。
		// Midiの場合、255はフットペダルを表す。
		property int nKey;

		// タイムスタンプ。
		property Int64 nTimeStamp;

		// 押されたイベントの音量。MIDIデバイスでのみ可変(小:0〜127:大)。
		// その他のデバイスは常に定数（CInput管理.n通常音量）となる。
		// 放されたイベントの場合は常に 0 。
		property int nVelocity;

		CInputEvent()
		{
			this->Disposed = gcnew CDisposed();
			this->_b押された = false;
			this->guid = nullptr;
			this->ID = 0;
			this->nKey = 0;
			this->nTimeStamp =  CTimer::n未使用;
			this->nVelocity = 0;
		}
		~CInputEvent()
		{
			if( this->Disposed->bDispose済みまたは処理中である )
				return;		// 例外は発出しない

			if( !this->Disposed->t開始を宣言する() )
				return;		// 例外は発出しない

			SAFE_REF_DELETE( this->guid );
			
			//GC::SuppressFinalize( this );   --> コンパイラが勝手にやる
		}

	private:
		CDisposed^ Disposed;
		bool _b押された;
	};
}
