Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #if !defined( _GUI_MOVER_H_INCLUDED_ )
- #define _GUI_MOVER_H_INCLUDED_
- #if ! defined( _WIN32 )
- typedef unsigned int UINT;
- typedef void* WPARAM;
- typedef void* LPARAM;
- #endif
- #if defined( _WIN32 )
- #include <windows.h>
- #endif
- #include <map>
- /** \brief Используется для "перекладывания" сообщений в GUI-поток
- Использование:
- \code
- class GuiClass {
- enum MessageIds {
- Message1,
- Message2
- };
- struct StructForMessage2
- {
- std::string ip;
- int port;
- void * data;
- int count;
- };
- void onMessage( MessageIds id, WPARAM wParam, LPARAM lParam ) {
- switch ( id ) {
- case Message1: {
- int some1 = (int)wParam;
- int some2 = (char *)lParam;
- // do some deal with some1 and some2
- }
- break;
- case Message2: {
- StructForMessage2 * some = (StructForMessage2*)wParam;
- // do some deal with some->ip, some->port etc.
- }
- break;
- }
- }
- GuiMover< GuiClass, MessageIds > m_guiMover;
- GuiClass() : m_guiMover( & GuiClass::onMessage, this ) {}
- // ----------------------------------------
- void onWorkingThreadMessage1( int some1, char * some2 ) {
- m_guiMover.move( Message1, some1, some2 );
- }
- void onWorkingThreadMessage2( const char * ip, int port, void * data, int count ) {
- StructForMessage2 some( ip, port, data, count ); // да. нет у StructForMessage2 такого ctor-а. И ЧО ?
- m_guiMover.move( Message2, &some );
- }
- };
- \endcode
- Внимание! В функцию GuiMover::move 2-м и 3-м параметром можно передавать только простые типы или указатели.
- Другими словами только то, что приводится к void*
- Внимание 2! В функции GuiMover::move делается SendMessage, поэтому,
- -# этот класс нельзя использовать в приложении, в котором не запущен поток обработки сообщений (например, в консольном)
- -# в функции-обработчике (которая передаётся в конструкторе) желательно проводить как можно меньше времени
- */
- template< class Master, class MsgId >
- class GuiMover
- {
- typedef void (Master::*wait_func)( MsgId id, WPARAM wParam, LPARAM lParam );
- public:
- GuiMover( wait_func waitFunc, Master * master );
- void move( MsgId message, WPARAM wParam = 0, LPARAM lParam = 0 );
- ~GuiMover();
- #if defined( _WIN32 )
- private:
- static LRESULT CALLBACK s_netWndProc( HWND hWnd, UINT wm_message, WPARAM wParam, LPARAM lParam )
- {
- GuiMover< Master, MsgId > * self = ( GuiMover< Master, MsgId > * )GetWindowLongPtr( hWnd, GWL_USERDATA );
- if ( self && self->m_master && self->m_waitFunc )
- {
- typename Msg2IdsMap::const_iterator found = self->m_msg2ids.find( wm_message );
- if ( found != self->m_msg2ids.end() )
- {
- MsgId id = (*found).second;
- (self->m_master->*self->m_waitFunc)( id, wParam, lParam );
- }
- }
- return 0;
- }
- HWND m_wnd;
- UINT m_maxWmMessage;
- typedef std::map< MsgId, UINT > Ids2MsgMap;
- typedef std::map< UINT, MsgId > Msg2IdsMap;
- Ids2MsgMap m_ids2msg;
- Msg2IdsMap m_msg2ids;
- #endif
- wait_func m_waitFunc;
- Master * m_master;
- };
- #if defined( _WIN32 )
- template < class Master, class MsgId >
- GuiMover< Master, MsgId >::GuiMover( wait_func waitFunc, Master * master )
- : m_maxWmMessage( 1 )
- , m_waitFunc( waitFunc )
- , m_master( master )
- {
- m_wnd = CreateWindowA( "STATIC", "", 0, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, HWND_MESSAGE, NULL, NULL, NULL);
- SetWindowLongPtr( m_wnd, GWL_USERDATA, (LONG_PTR)this );
- SetWindowLongPtr( m_wnd, GWL_WNDPROC, (LONG_PTR)s_netWndProc );
- }
- template < class Master, class MsgId >
- void GuiMover< Master, MsgId >::move( MsgId id, WPARAM wParam, LPARAM lParam )
- {
- UINT wm_message;
- typename Ids2MsgMap::const_iterator found = m_ids2msg.find( id );
- if ( found == m_ids2msg.end() )
- {
- wm_message = WM_USER + m_maxWmMessage;
- m_maxWmMessage++;
- m_ids2msg[ id ] = wm_message;
- m_msg2ids[ wm_message ] = id;
- }
- else
- {
- wm_message = (*found).second;
- }
- ::SendMessage( m_wnd, wm_message, wParam, lParam );
- }
- template < class Master, class MsgId >
- GuiMover< Master, MsgId >::~GuiMover()
- {
- DestroyWindow( m_wnd );
- }
- #else // #if defined( _WIN32 )
- template < class Master, class MsgId >
- GuiMover< Master, MsgId >::GuiMover( wait_func waitFunc, Master * master )
- : m_waitFunc( waitFunc )
- , m_master( master )
- {
- }
- template < class Master, class MsgId >
- void GuiMover< Master, MsgId >::move( MsgId id, WPARAM wParam, LPARAM lParam )
- {
- (m_master->*m_waitFunc)( id, wParam, lParam );
- }
- template < class Master, class MsgId >
- GuiMover< Master, MsgId >::~GuiMover()
- {
- }
- #endif // #if defined( _WIN32 )
- #endif //!defined( _GUI_MOVER_H_INCLUDED_ )
Advertisement
Add Comment
Please, Sign In to add comment