这里需要提及到的概念是:区分HandleMessage和MessageHandler(由源文件可以提现出来.) 一个窗口被创建,它会有一个消息循环处理模块,比如: while( GetMessage(&Msg, NULL, 0, 0)) { TranslateMessage( &Msg) ; DispatchMessage( &Msg) ; } 其中 GetMessage 是从消息队列中获取消息,它会进入 PreTranslateMessage 给我们提供过滤消息队列的机会, 如果返回TRUE,就交由 TranslateMessage 和 DispatchMessage 处理。其中通过 SendMessage 发送的消息是不插入消息队列,而直接传递到 TranslateMessage 处理,PostMessage 是会经过消息队列的。 现在对应于DUILIB 如下: DUILIB中 的窗口过程函数 是 HandleMessage, 消息过滤函数是 MessageHandler 即: while( GetMessage(&Msg, NULL, 0, 0))// 这里进入MessageHandler { TranslateMessage( &Msg) ; //这里进入 HandleMessage DispatchMessage( &Msg) ; } .h头文件
1 | class WindowImplBase : public CWindowWnd, public INotifyUI, public IMessageFilterUI, public IDialogBuilderCallback, public SkinChangedReceiver |
5 | virtual ~WindowImplBase(); |
7 | virtual void OnFinalMessage( HWND hWnd); |
11 | virtual CControlUI* CreateControl( LPCTSTR pstrClass); |
13 | virtual LRESULT MessageHandler( UINT uMsg, WPARAM wParam, LPARAM lParam, bool & bHandled); |
15 | virtual LRESULT OnClose( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); |
17 | virtual LRESULT OnDestroy( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); |
19 | virtual LRESULT OnNcActivate( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); |
21 | virtual LRESULT OnNcCalcSize( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); |
23 | virtual LRESULT OnNcPaint( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); |
25 | virtual LRESULT OnNcHitTest( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); |
27 | virtual LRESULT OnGetMinMaxInfo( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); |
29 | virtual LRESULT OnMouseWheel( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); |
31 | virtual LRESULT OnSize( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); |
33 | virtual LRESULT OnMoving( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); |
35 | virtual LRESULT OnSysCommand( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); |
37 | virtual LRESULT OnCreate( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); |
39 | virtual LRESULT OnKeyDown( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); |
41 | virtual LRESULT OnKillFocus( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); |
43 | virtual LRESULT OnSetFocus( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); |
45 | virtual LRESULT OnLButtonDown( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); |
47 | virtual LRESULT OnNCLButtonDown( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); |
49 | virtual LRESULT OnLButtonUp( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); |
51 | virtual LRESULT OnMouseMove( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); |
53 | virtual LRESULT HandleMessage( UINT uMsg, WPARAM wParam, LPARAM lParam); |
55 | virtual LRESULT HandleCustomMessage( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); |
58 | virtual tString GetSkinFolder(); |
59 | virtual tString GetSkinFile() = 0; |
61 | virtual LRESULT ResponseDefaultKeyEvent( WPARAM wParam, bool & bHandled); |
64 | CPaintManagerUI paint_manager_; |
.CPP头文件
1 | WindowImplBase::WindowImplBase() |
4 | WindowImplBase::~WindowImplBase() |
7 | CControlUI* WindowImplBase::CreateControl( LPCTSTR pstrClass) |
12 | void WindowImplBase::OnFinalMessage( HWND ) |
14 | paint_manager_.RemovePreMessageFilter( this ); |
15 | paint_manager_.RemoveNotifier( this ); |
16 | paint_manager_.ReapObjects(paint_manager_.GetRoot()); |
19 | void WindowImplBase::Init() |
22 | LRESULT WindowImplBase::OnClose( UINT , WPARAM , LPARAM , BOOL & bHandled) |
28 | LRESULT WindowImplBase::OnDestroy( UINT , WPARAM , LPARAM , BOOL & bHandled) |
34 | #if defined(WIN32) && !defined(UNDER_CE) |
35 | LRESULT WindowImplBase::OnNcActivate( UINT , WPARAM wParam, LPARAM , BOOL & bHandled) |
37 | if ( ::IsIconic(* this ) ) bHandled = FALSE; |
38 | return (wParam == 0) ? TRUE : FALSE; |
41 | LRESULT WindowImplBase::OnNcCalcSize( UINT , WPARAM , LPARAM , BOOL & ) |
46 | LRESULT WindowImplBase::OnNcPaint( UINT , WPARAM , LPARAM , BOOL & ) |
51 | LRESULT WindowImplBase::OnNcHitTest( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled) |
53 | POINT pt; pt.x = GET_X_LPARAM(lParam); pt.y = GET_Y_LPARAM(lParam); |
54 | ::ScreenToClient(* this , &pt); |
57 | ::GetClientRect(* this , &rcClient); |
75 | RECT rcCaption = paint_manager_.GetCaptionRect(); |
76 | if ( pt.x >= rcClient.left + rcCaption.left && pt.x < rcClient.right - rcCaption.right \ |
77 | && pt.y >= rcCaption.top && pt.y < rcCaption.bottom ) { |
78 | CControlUI* pControl = static_cast <CControlUI*>(paint_manager_.FindControl(pt)); |
79 | if ( pControl && _tcsicmp(pControl->GetClass(), _T( "ButtonUI" )) != 0 && |
80 | _tcsicmp(pControl->GetClass(), _T( "OptionUI" )) != 0 ) |
87 | LRESULT WindowImplBase::OnGetMinMaxInfo( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled) |
89 | MONITORINFO oMonitor = {}; |
90 | oMonitor.cbSize = sizeof (oMonitor); |
91 | ::GetMonitorInfo(::MonitorFromWindow(* this , MONITOR_DEFAULTTOPRIMARY), &oMonitor); |
92 | CRect rcWork = oMonitor.rcWork; |
93 | rcWork.Offset(-rcWork.left, -rcWork.top); |
95 | LPMINMAXINFO lpMMI = (LPMINMAXINFO) lParam; |
96 | lpMMI->ptMaxPosition.x = rcWork.left; |
97 | lpMMI->ptMaxPosition.y = rcWork.top; |
98 | lpMMI->ptMaxSize.x = rcWork.right; |
99 | lpMMI->ptMaxSize.y = rcWork.bottom; |
105 | LRESULT WindowImplBase::OnMouseWheel( UINT , WPARAM , LPARAM , BOOL & bHandled) |
112 | LRESULT WindowImplBase::OnSetFocus( UINT , WPARAM , LPARAM , BOOL & bHandled) |
118 | LRESULT WindowImplBase::OnLButtonDown( UINT , WPARAM , LPARAM , BOOL & bHandled) |
124 | LRESULT WindowImplBase::OnNCLButtonDown( UINT , WPARAM , LPARAM , BOOL & bHandled) |
130 | LRESULT WindowImplBase::OnMouseMove( UINT , WPARAM , LPARAM , BOOL & bHandled) |
136 | LRESULT WindowImplBase::OnLButtonUp( UINT , WPARAM , LPARAM , BOOL & bHandled) |
142 | LRESULT WindowImplBase::OnKeyDown( UINT , WPARAM , LPARAM , BOOL & bHandled) |
148 | LRESULT WindowImplBase::OnKillFocus( UINT , WPARAM , LPARAM , BOOL & bHandled) |
154 | LRESULT WindowImplBase::OnSize( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled) |
156 | SIZE szRoundCorner = paint_manager_.GetRoundCorner(); |
157 | #if defined(WIN32) && !defined(UNDER_CE) |
158 | if ( !::IsIconic(* this ) && (szRoundCorner.cx != 0 || szRoundCorner.cy != 0) ) { |
160 | ::GetWindowRect(* this , &rcWnd); |
161 | rcWnd.Offset(-rcWnd.left, -rcWnd.top); |
162 | rcWnd.right++; rcWnd.bottom++; |
163 | HRGN hRgn = ::CreateRoundRectRgn(rcWnd.left, rcWnd.top, rcWnd.right, rcWnd.bottom, szRoundCorner.cx, szRoundCorner.cy); |
164 | ::SetWindowRgn(* this , hRgn, TRUE); |
165 | ::DeleteObject(hRgn); |
172 | LRESULT WindowImplBase::OnMoving( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled) |
178 | LRESULT WindowImplBase::OnSysCommand( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled) |
180 | if (wParam == SC_CLOSE){ |
184 | #if defined(WIN32) && !defined(UNDER_CE) |
185 | BOOL bZoomed = ::IsZoomed(* this ); |
186 | LRESULT lRes = CWindowWnd::HandleMessage(uMsg, wParam, lParam); |
187 | if ( ::IsZoomed(* this ) != bZoomed ){ |
190 | LRESULT lRes = CWindowWnd::HandleMessage(uMsg, wParam, lParam); |
195 | tString WindowImplBase::GetSkinFolder() |
197 | return tString(CPaintManagerUI::GetInstancePath()) + _T( "Skins\\" ); |
200 | LRESULT WindowImplBase::OnCreate( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled) |
202 | LONG styleValue = ::GetWindowLong(* this , GWL_STYLE); |
203 | styleValue &= ~WS_CAPTION; |
204 | ::SetWindowLong(* this , GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN); |
206 | ::GetClientRect(* this , &rcClient); |
207 | ::SetWindowPos(* this , NULL, rcClient.left, rcClient.top, rcClient.right - rcClient.left, \ |
208 | rcClient.bottom - rcClient.top, SWP_FRAMECHANGED); |
210 | paint_manager_.Init(m_hWnd); |
211 | paint_manager_.AddPreMessageFilter( this ); |
213 | CDialogBuilder builder; |
215 | paint_manager_.SetResourcePath(GetSkinFolder().c_str()); |
219 | #if defined(WIN32) && !defined(UNDER_CE) |
220 | static bool resource_unzipped = false ; |
221 | if (!resource_unzipped) |
223 | resource_unzipped = true ; |
224 | paint_manager_.SetResourceZip(GlobalVariable::kResourceSkinZipFileName); |
225 | paint_manager_.UnzipResource(); |
226 | paint_manager_.SetResourceZip(GlobalVariable::kNullString); |
228 | tString tstrSkin = paint_manager_.GetResourcePath(); |
229 | tstrSkin += GetSkinFile(); |
231 | paint_manager_.SetResourceZip(GlobalVariable::kResourceSkinZipFileName); |
232 | tString tstrSkin = GetSkinFile(); |
236 | tString tstrSkin = paint_manager_.GetResourcePath(); |
237 | tstrSkin += GetSkinFile(); |
239 | CControlUI* pRoot = builder.Create(tstrSkin.c_str(), ( UINT )0, this , &paint_manager_); |
240 | paint_manager_.AttachDialog(pRoot); |
241 | paint_manager_.AddNotifier( this ); |
248 | LRESULT WindowImplBase::HandleCustomMessage( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled) |
254 | LRESULT WindowImplBase::HandleMessage( UINT uMsg, WPARAM wParam, LPARAM lParam) |
257 | BOOL bHandled = TRUE; |
260 | case WM_CREATE: lRes = OnCreate(uMsg, wParam, lParam, bHandled); break ; |
261 | case WM_CLOSE: lRes = OnClose(uMsg, wParam, lParam, bHandled); break ; |
262 | case WM_DESTROY: lRes = OnDestroy(uMsg, wParam, lParam, bHandled); break ; |
263 | #if defined(WIN32) && !defined(UNDER_CE) |
264 | case WM_NCACTIVATE: lRes = OnNcActivate(uMsg, wParam, lParam, bHandled); break ; |
265 | case WM_NCCALCSIZE: lRes = OnNcCalcSize(uMsg, wParam, lParam, bHandled); break ; |
266 | case WM_NCPAINT: lRes = OnNcPaint(uMsg, wParam, lParam, bHandled); break ; |
267 | case WM_NCHITTEST: lRes = OnNcHitTest(uMsg, wParam, lParam, bHandled); break ; |
268 | case WM_GETMINMAXINFO: lRes = OnGetMinMaxInfo(uMsg, wParam, lParam, bHandled); break ; |
269 | case WM_MOUSEWHEEL: lRes = OnMouseWheel(uMsg, wParam, lParam, bHandled); break ; |
271 | case WM_SIZE: lRes = OnSize(uMsg, wParam, lParam, bHandled); break ; |
272 | case WM_MOVING: lRes = OnMoving(uMsg, wParam, lParam, bHandled); break ; |
273 | case WM_SYSCOMMAND: lRes = OnSysCommand(uMsg, wParam, lParam, bHandled); break ; |
274 | case WM_KEYDOWN: lRes = OnKeyDown(uMsg, wParam, lParam, bHandled); break ; |
275 | case WM_KILLFOCUS: lRes = OnKillFocus(uMsg, wParam, lParam, bHandled); break ; |
276 | case WM_SETFOCUS: lRes = OnSetFocus(uMsg, wParam, lParam, bHandled); break ; |
277 | case WM_LBUTTONUP: lRes = OnLButtonUp(uMsg, wParam, lParam, bHandled); break ; |
278 | case WM_LBUTTONDOWN: lRes = OnLButtonDown(uMsg, wParam, lParam, bHandled); break ; |
279 | case WM_MOUSEMOVE: lRes = OnMouseMove(uMsg, wParam, lParam, bHandled); break ; |
280 | case WM_NCLBUTTONDOWN: lRes = OnNCLButtonDown(uMsg, wParam, lParam, bHandled); break ; |
281 | default : bHandled = FALSE; break ; |
283 | if (bHandled) return lRes; |
285 | lRes = HandleCustomMessage(uMsg, wParam, lParam, bHandled); |
286 | if (bHandled) return lRes; |
288 | if (paint_manager_.MessageHandler(uMsg, wParam, lParam, lRes)) return lRes; |
289 | return CWindowWnd::HandleMessage(uMsg, wParam, lParam); |
292 | LRESULT WindowImplBase::MessageHandler( UINT uMsg, WPARAM wParam, LPARAM lParam, bool & bHandled) |
294 | if (uMsg == WM_KEYDOWN) |
300 | return ResponseDefaultKeyEvent(wParam, bHandled); |
308 | LRESULT WindowImplBase::ResponseDefaultKeyEvent( WPARAM wParam, bool & bHandled) |
310 | if (wParam == VK_RETURN) |
314 | else if (wParam == VK_ESCAPE) |
原文转载自::http://www.360doc.com/userhome/7023119
|