Re: MessageMap - Funktionszeiger - VS2008
Giovanni Dicanio ha scritto:
Another approach to implement a custom message map could be to use a map
container (like STL std::map), and associate event IDs to member
functions of C++ classes.
You may want to download a sample MFC project here:
http://www.geocities.com/giovanni.dicanio/vc/TestCustomMessageMap.zip
Moreover, of course it is possible also to put all the event handlers as
member functions implemented in the same message map class (instead of
defining a single class for each event handler).
It all depends on your particular needs and design choices.
Here is the updated sample:
http://www.geocities.com/giovanni.dicanio/vc/TestCustomMessageMap2.zip
and here is the modifications to CMessageMapTest class:
<code>
//-----------------------------------------------------------------------
// Testing custom message map
//-----------------------------------------------------------------------
class CMessageMapTest
{
public:
// Build the message map, filling the std::map data member
CMessageMapTest()
{
// Add event handlers to the map
m_events[Event_Click] = CreateHandler(this,
&CMessageMapTest::HandleClick);
m_events[Event_DoubleClick] = CreateHandler(this,
&CMessageMapTest::HandleDoubleClick);
m_events[Event_Resize] = CreateHandler(this,
&CMessageMapTest::HandleResize);
}
// Cleanup the message map
virtual ~CMessageMapTest()
{
// Delete pointers stored in map
EventHandlers::iterator it;
for (it = m_events.begin(); it != m_events.end(); ++it)
{
delete it->second;
it->second = NULL;
}
// Clear the map
m_events.clear();
}
// Handle a particular event
void HandleEvent(Event event, DWORD customData)
{
// Call event handler using map
(*m_events[event])(customData);
}
private:
// Event handlers is a map that associates an event ID to an event
handler object
typedef std::map< Event, IEventHandlerBase * > EventHandlers;
// Event handlers stored as data members here
EventHandlers m_events;
//
// Some Sample Event Handlers
//
void HandleClick(DWORD customData)
{
CString msg;
msg.Format(_T("Handle Click Event (data = %08X)"), customData);
AfxMessageBox(msg, MB_OK);
}
void HandleDoubleClick(DWORD customData)
{
CString msg;
msg.Format(_T("Handle Double-Click Event (data = %08X)"),
customData);
AfxMessageBox(msg, MB_OK);
}
void HandleResize(DWORD customData)
{
CString msg;
msg.Format(_T("Handle Resize Event (data = %08X)"), customData);
AfxMessageBox(msg, MB_OK);
}
};
</code>
Giovanni