⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 message.cpp

📁 一个自己写的游戏引擎,用DirectX 写成
💻 CPP
字号:
//--------------------------------------------------
//  Desc: 消息系统
//  Author: artsylee/2006.10.30
//--------------------------------------------------
#include "../stdafx.h"
#include "Message.h"

#pragma comment (lib, "winmm.lib")

CMessage::CMessage()
{
	m_dwType = m_dwSource = m_dwDestination = 0;
	m_dwGenerate = m_dwDelay = ::timeGetTime();
	m_dwAvail = m_dwDelay + MESSAGE_DELAY;
}

CMessage::CMessage(DWORD type, DWORD source /* = 0 */, DWORD dest /* = 0 */)
{
	m_dwType = type;
	m_dwSource = source;
	m_dwDestination = dest;
	m_dwGenerate = m_dwDelay = ::timeGetTime();
	m_dwAvail = m_dwDelay + MESSAGE_DELAY;
}

CMessage::~CMessage()
{
}

void CMessage::SetDelay(DWORD delay)
{
	m_dwDelay = m_dwGenerate + delay;
	m_dwAvail = m_dwDelay + MESSAGE_DELAY;
}

void CMessage::SetAvail(DWORD avail)
{
	m_dwAvail = m_dwDelay + avail;
}

void CMessage::SetParameter(DWORD param1 /* = 0 */, DWORD param2 /* = 0 */, void* param3 /* = NULL */)
{
	m_dwParam1 = param1;
	m_dwParam2 = param2;
	m_pParam3 = param3;
}
//---------------------------------------------------
// Message Manager
//---------------------------------------------------

CMessageManager *g_pMessageManager = NULL;

void __stdcall PostMessage(CMessage msg)
{
	if(g_pMessageManager)
	{
		g_pMessageManager->PostMessage(msg);
	}
}

bool __stdcall PeekMessage(int &index, CMessage &msg, bool bRemove)
{
	if(g_pMessageManager)
	{
		return g_pMessageManager->PeekMessage(index, msg, bRemove);
	}
	return false;
}

void __stdcall RemoveAllMessage()
{
	if(g_pMessageManager)
	{
		g_pMessageManager->RemoveAll();
	}
}

CMessageManager::CMessageManager()
{
}

CMessageManager::~CMessageManager()
{
	RemoveAll();
}

void CMessageManager::PostMessage(CMessage msg)
{
	m_msgVector.push_back(msg);
}

void CMessageManager::Begin()
{
	m_msgItor = m_msgVector.begin();
}

bool CMessageManager::PeekMessage(CMessage &msg, bool bRemove /* = true */)
{
	DWORD tm = ::timeGetTime();
	if(m_msgItor == m_msgVector.end())
	{
		return false;
	}
	else
	{
		while(tm<(*m_msgItor).m_dwDelay || tm>(*m_msgItor).m_dwAvail)
		{
			// 自动清除无效消息
			if(tm>(*m_msgItor).m_dwAvail)
			{
				m_msgItor = m_msgVector.erase(m_msgItor);
			}
			else
			{
				m_msgItor++;
			}
			if(m_msgItor == m_msgVector.end())
			{
				return false;
			}
			// 无法Peek到还没法使用的延时消息
		}
		msg = (*m_msgItor);
		if(bRemove)
		{
			m_msgVector.erase(m_msgItor);
		}
		return true;
	}
}

//
bool CMessageManager::PeekMessage(int &index, CMessage &msg, bool bRemove /* = true */)
{
	if(index >= (int)m_msgVector.size() || index<0)
		return false;

	std::vector<CMessage>::iterator itor = m_msgVector.begin()+index;
	DWORD tm = ::timeGetTime();
	while(tm<(*itor).m_dwDelay || tm>(*itor).m_dwAvail)
	{
		// 自动清除无效消息
		if(tm>(*itor).m_dwAvail)
		{
			itor = m_msgVector.erase(itor);
		}
		else
		{
			itor++;
			index++;
		}
		if(itor == m_msgVector.end())
		{
			return false;
		}
		// 无法Peek到还没法使用的延时消息
	}
	msg = (*itor);
	if(bRemove)
	{
		m_msgVector.erase(itor);
	}
	else
	{
		index++;
	}
	return true;
}

void CMessageManager::RemoveAll()
{
	m_msgVector.clear();
}

void CMessageManager::DeleteMessage(DWORD type)
{
	std::vector<CMessage>::iterator itor = m_msgVector.begin();
	while(itor!=m_msgVector.end())
	{
		if((*itor).m_dwType==type)
		{
			itor = m_msgVector.erase(itor);
		}
		else
		{
			itor++;
		}
	}
}

// END 2006.10.30

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -