Duilib消息处理
Duilib
Duilib的绘图是基于xml + UI渲染绘图引擎 + Win32实现的。
Duilib消息处理与MFC消息处理比较
Duilib的窗口都是基于CWindowWnd类建立的,调用CWindowWnd::Create()函数创建窗口,此函数会调用CWindowWnd::RegisterWindowClass()注册窗口类。
CWindowWnd::RegisterWindowClass()函数注册的窗口类的窗口回调函数默认为CWindowWnd::__WndProc()函数。( CWindowWnd::__WndProc()函数相当于MFC中公共消息处理函数 AfxWndProc()。)
CWindowWnd::__WndProc()函数会通过WM_NCREATE消息的lparam参数获得对应的产生消息的窗口类的CWindowWnd基类的指针,此指针是在CWindowWnd::Create中调用CreateEx函数传递的CWindowWnd的this指针。(在MFC中通过CWnd->FromHandlePermanent函数获得的对应窗口的CWnd基类指针)
接着CWindowWnd::__WndProc()函数会将不处理的函数交给CWindowWnd::HandleMessage处理,而此函数是虚函数,一般由我们的子类覆盖进行消息的集中处理。(此HandleMessage()函数相当于MFC中的CWnd::OnWndMsg函数)
CWindowWnd子类覆盖了HandleMessage函数后一般会先自己将一部分消息处理,然后控件的消息都交给渲染类的消息处理过程处理(CPaintCPaintManagerUI::ManageHandle函数),然后都不处理的交给CWindowWnd::HandleMessage处理,此函数会调用::DefWindowProc函数进行默认处理。
对于哪些控件的消息就统一交给渲染类的UI消息处理过程统一处理,可以调用CPaintManagerUI::AddNotifier函数增加通知例程,重写虚函数Notify在函数中进行消息处理。实际是渲染类CPaintManagerUI的消息处理过程会调用SendNotify函数向所有有通知例程的函数发送需要处理的消息。(MFC中是通过在CWnd::OnWndMsg中利用消息映射进行消息的传递)