On Thursday, March 24, 2011 8:42 AM, Igor R wrote:
Using your approach, I need to use a case statement inside a message loop.
As you can see, struct Handler in my example doesn't have any case statements as well. Again: the basic, lowlevel message processing is hidden - in my example in the "button" class, in smart win++ somewhere in WidgetWindow or its base classes. The *users* of the framework do not need to deal with messages as the framework exposes higher-level facilities.
Perhaps you can replace the switch statement with a map or similar (warning: untested): typedef std::map <UINT, boost::signals2::signal <LRESULT (HWND, UINT, WPARAM, LPARAM)> MessageMap; MessageMap message_map; LRESULT CALLBACK WindowProc( __in HWND hwnd, __in UINT uMsg, __in WPARAM wParam, __in LPARAM lParam ) { MessageMap::const_iterator handler = message_map.find (uMsg); if (handler != message_map.end()) { return handler->second (hwnd, uMsg, wParam, lParam); } else { return DefWindowProc (hwnd, uMsg, wParam, lParam); } } You could then insert any handler for any message into message_map. I'm not sure what combiner would be most appropriate here. There is also the question of where message_map should really go. A global variable (as my example implies) probably isn't the best place.