DirectUI消息循环的简单封装
2013-11-09 13:56
323 查看
一.真窗体和假窗体
首先在DirectWindow内部创建一个真窗体(基于WTL),可以接收消息
class CMessageWindow : public CWindowImpl< CMessageWindow > { public: CMessageWindow(); ~CMessageWindow(); BEGIN_MSG_MAP( CMessageWindow ) MESSAGE_RANGE_HANDLER( 0, 0xFFFF, HandleMessage ) END_MSG_MAP() }
然后在在HandleMessage 处理消息
二.通过MessageDispatcher转发消息
三.组装给上层比较容易理解的数据结构
这样上层就捕捉不到WM_LBUTTONUP消息,而变成自己封装的DirectUI_LButtonUp消息了
全部伪代码
class EventArg { public: int nId; }; class MouseEventArg:public EventArg { public: int nX; int nY; int uKeyFlags; }; class MessageDispatcher { MessageDispatcher(DirectWindow *pWindow) { m_pWindow=pWindow; } void DispatcherLButtonUp(POINT pt,UINT uKeyFlags,BOOL *pbHandled) { MouseEventArg arg; arg.nId=DirectUI_LButtonUp; arg.nX=pt.x; arg.nY=pt.y; m_pWindow->OnMessage(&arg); } private: DirectWindow *m_pWindow; }; class CMessageWindow : public CWindowImpl< CMessageWindow > { public: CMessageWindow(); ~CMessageWindow(); BEGIN_MSG_MAP( CMessageWindow ) MESSAGE_RANGE_HANDLER( 0, 0xFFFF, HandleMessage ) END_MSG_MAP() virtual LRESULT HandleMessage( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ); private: MessageDispatcher *m_pMessageDispatcher; } void CMessageWindow::OnLButtonUp( HWND hWnd, int nX, int nY, UINT uKeyFlags, BOOL& bHandled ) { POINT pt = {nX, nY}; ::ClientToScreen(hWnd, &pt); m_pMessageDispatcher->DispatcherLButtonUp(pt, uKeyFlags, &bHandled) } class IElement; class DirectWindow { HRESULT OnMessage( IElement *pElement, EventArg *pArg, BOOL* pbHandled); private: CMessageWindow *m_pMessageWindow; };
相关文章推荐
- 一个简单的带消息循环的控制面板选项例程
- 一个简单的带消息循环的控制面板选项例程
- SDLframework实现之消息循环的封装
- MFC源码分析实战(五)——层层封装下的消息循环
- 5 DirectUI消息循环机制
- 【cocos2d-x 3.x】02-简单看一下cocos的消息循环的步骤
- 一个简单的Windows程序及消息循环机制
- 揭秘.NET对Windows消息循环的封装
- 使用java实现阿里云消息队列简单封装
- .NET Framework如何封装消息循环
- DirectUI中模态对话框和菜单的原理(自己控制整个Windows消息循环。或者,用菜单模拟窗体打开时用SetCapture取得控制权,一旦窗体收到WM_CAPTURECHANGED消息就把窗体退出)
- 消息队列接口的简单封装
- 做swing程序中遇到使用消息提示框的,JOptionPane类其中封装了很多的方法。 很方便的,于是就简单的整理了一下。 1.1 showMessageDialog 显示一个带有OK 按钮的模态
- 将QT开发的界面程序封装成DLL,在VC中成功调用(必须有消息循环,所以使用了QTWinmigrate,附CSDN可下载的Demo)
- 定长消息报文的组包与解包简单封装(Java实现)
- Windows编程 从消息窗口到基本窗口 游戏循环窗口框架的简单实现
- .NET对Windows消息循环的封装
- 浅谈使用java实现阿里云消息队列简单封装
- 深入探讨MFC消息循环和消息泵 .
- OpenCL相关函数简单封装