📄 message.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 + -