DuiLib通用窗口类WindowImplBase封装

这里需要提及到的概念是:区分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
2 {
3 public:
4     WindowImplBase();
5     virtual ~WindowImplBase();
6
7     virtual void OnFinalMessage(HWND hWnd);
8
9     virtual void Init();
10
11     virtual CControlUI* CreateControl(LPCTSTR pstrClass);
12
13     virtual LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled);
14
15     virtual LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
16
17     virtual LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
18
19     virtual LRESULT OnNcActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
20
21     virtual LRESULT OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
22
23     virtual LRESULT OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
24
25     virtual LRESULT OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
26
27     virtual LRESULT OnGetMinMaxInfo(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
28
29     virtual LRESULT OnMouseWheel(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
30
31     virtual LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);   
32
33     virtual LRESULT OnMoving(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 
34
35     virtual LRESULT OnSysCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
36
37     virtual LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
38
39     virtual LRESULT OnKeyDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
40
41     virtual LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
42
43     virtual LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
44
45     virtual LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
46
47     virtual LRESULT OnNCLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
48
49     virtual LRESULT OnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
50
51     virtual LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
52
53     virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
54
55     virtual LRESULT HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
56
57 protected:
58     virtual tString GetSkinFolder();
59     virtual tString GetSkinFile() = 0;
60
61     virtual LRESULT ResponseDefaultKeyEvent(WPARAM wParam, bool& bHandled);
62
63 protected:
64     CPaintManagerUI     paint_manager_;
65
66 };

.CPP头文件

1 WindowImplBase::WindowImplBase()
2 {}
3  
4 WindowImplBase::~WindowImplBase()
5 {}
6  
7 CControlUI* WindowImplBase::CreateControl(LPCTSTR pstrClass)
8 {
9     return NULL;
10 }
11  
12 void WindowImplBase::OnFinalMessage(HWND /*hWnd*/)
13 {
14     paint_manager_.RemovePreMessageFilter(this);
15     paint_manager_.RemoveNotifier(this);
16     paint_manager_.ReapObjects(paint_manager_.GetRoot());
17 }
18  
19 void WindowImplBase::Init()
20 {}
21  
22 LRESULT WindowImplBase::OnClose(UINT /*uMsg*/WPARAM /*wParam*/LPARAM /*lParam*/BOOL& bHandled)
23 {
24     bHandled = FALSE;
25     return 0;
26 }
27  
28 LRESULT WindowImplBase::OnDestroy(UINT /*uMsg*/WPARAM /*wParam*/LPARAM /*lParam*/BOOL& bHandled)
29 {
30     bHandled = FALSE;
31     return 0;
32 }
33  
34 #if defined(WIN32) && !defined(UNDER_CE)
35 LRESULT WindowImplBase::OnNcActivate(UINT /*uMsg*/WPARAM wParam, LPARAM /*lParam*/BOOL& bHandled)
36 {
37     if( ::IsIconic(*this) ) bHandled = FALSE;
38     return (wParam == 0) ? TRUE : FALSE;
39 }
40  
41 LRESULT WindowImplBase::OnNcCalcSize(UINT /*uMsg*/WPARAM /*wParam*/LPARAM /*lParam*/BOOL/*bHandled*/)
42 {
43     return 0;
44 }
45  
46 LRESULT WindowImplBase::OnNcPaint(UINT /*uMsg*/WPARAM /*wParam*/LPARAM /*lParam*/BOOL/*bHandled*/)
47 {
48     return 0;
49 }
50  
51 LRESULT WindowImplBase::OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
52 {
53     POINT pt; pt.x = GET_X_LPARAM(lParam); pt.y = GET_Y_LPARAM(lParam);
54     ::ScreenToClient(*this, &pt);
55  
56     RECT rcClient;
57     ::GetClientRect(*this, &rcClient);
58  
59     //if( !::IsZoomed(*this) ) {
60     //  RECT rcSizeBox = paint_manager_.GetSizeBox();
61     //  if( pt.y < rcClient.top + rcSizeBox.top ) {
62     //      if( pt.x < rcClient.left + rcSizeBox.left ) return HTTOPLEFT;
63     //      if( pt.x > rcClient.right - rcSizeBox.right ) return HTTOPRIGHT;
64     //      return HTTOP;
65     //  }
66     //  else if( pt.y > rcClient.bottom - rcSizeBox.bottom ) {
67     //      if( pt.x < rcClient.left + rcSizeBox.left ) return HTBOTTOMLEFT;
68     //      if( pt.x > rcClient.right - rcSizeBox.right ) return HTBOTTOMRIGHT;
69     //      return HTBOTTOM;
70     //  }
71     //  if( pt.x < rcClient.left + rcSizeBox.left ) return HTLEFT;
72     //  if( pt.x > rcClient.right - rcSizeBox.right ) return HTRIGHT;
73     //}
74  
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 )
81                 return HTCAPTION;
82     }
83  
84     return HTCLIENT;
85 }
86  
87 LRESULT WindowImplBase::OnGetMinMaxInfo(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
88 {
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);
94  
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;
100  
101     bHandled = FALSE;
102     return 0;
103 }
104  
105 LRESULT WindowImplBase::OnMouseWheel(UINT /*uMsg*/WPARAM /*wParam*/LPARAM /*lParam*/BOOL& bHandled)
106 {
107     bHandled = FALSE;
108     return 0;
109 }
110 #endif
111  
112 LRESULT WindowImplBase::OnSetFocus(UINT /*uMsg*/WPARAM /*wParam*/LPARAM /*lParam*/BOOL& bHandled)
113 {
114     bHandled = FALSE;
115     return 0;
116 }
117  
118 LRESULT WindowImplBase::OnLButtonDown(UINT /*uMsg*/WPARAM /*wParam*/LPARAM /*lParam*/BOOL& bHandled)
119 {
120     bHandled = FALSE;
121     return 0;
122 }
123  
124 LRESULT WindowImplBase::OnNCLButtonDown(UINT /*uMsg*/WPARAM /*wParam*/LPARAM/*lParam*/BOOL& bHandled)
125 {
126     bHandled = FALSE;
127     return 0;
128 }
129  
130 LRESULT WindowImplBase::OnMouseMove(UINT /*uMsg*/WPARAM /*wParam*/LPARAM /*lParam*/BOOL& bHandled)
131 {
132     bHandled = FALSE;
133     return 0;
134 }
135  
136 LRESULT WindowImplBase::OnLButtonUp(UINT /*uMsg*/WPARAM /*wParam*/LPARAM /*lParam*/BOOL& bHandled)
137 {
138     bHandled = FALSE;
139     return 0;
140 }
141  
142 LRESULT WindowImplBase::OnKeyDown(UINT /*uMsg*/WPARAM /*wParam*/LPARAM /*lParam*/BOOL& bHandled)
143 {
144     bHandled = FALSE;
145     return 0;
146 }
147  
148 LRESULT WindowImplBase::OnKillFocus(UINT /*uMsg*/WPARAM /*wParam*/LPARAM /*lParam*/BOOL& bHandled)
149 {
150     bHandled = FALSE;
151     return 0;
152 }
153  
154 LRESULT WindowImplBase::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
155 {
156     SIZE szRoundCorner = paint_manager_.GetRoundCorner();
157 #if defined(WIN32) && !defined(UNDER_CE)
158     if( !::IsIconic(*this) && (szRoundCorner.cx != 0 || szRoundCorner.cy != 0) ) {
159         CRect rcWnd;
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);
166     }
167 #endif
168     bHandled = FALSE;
169     return 0;
170 }
171  
172 LRESULT WindowImplBase::OnMoving(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
173 {
174     bHandled = FALSE;
175     return 0;
176 }
177  
178 LRESULT WindowImplBase::OnSysCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
179 {
180     if (wParam == SC_CLOSE){
181         bHandled = TRUE;
182         return 0;
183     }
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 ){
188     }
189 #else
190     LRESULT lRes = CWindowWnd::HandleMessage(uMsg, wParam, lParam);
191 #endif
192     return lRes;
193 }
194  
195 tString WindowImplBase::GetSkinFolder()
196 {
197     return tString(CPaintManagerUI::GetInstancePath()) + _T("Skins\\");
198 }
199  
200 LRESULT WindowImplBase::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
201 {
202     LONG styleValue = ::GetWindowLong(*this, GWL_STYLE);
203     styleValue &= ~WS_CAPTION;
204     ::SetWindowLong(*this, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
205     RECT rcClient;
206     ::GetClientRect(*this, &rcClient);
207     ::SetWindowPos(*this, NULL, rcClient.left, rcClient.top, rcClient.right - rcClient.left, \
208         rcClient.bottom - rcClient.top, SWP_FRAMECHANGED);
209  
210     paint_manager_.Init(m_hWnd);
211     paint_manager_.AddPreMessageFilter(this);
212  
213     CDialogBuilder builder;
214  
215     paint_manager_.SetResourcePath(GetSkinFolder().c_str());
216  
217 #if USE(ZIP_SKIN)
218  
219 #if defined(WIN32) && !defined(UNDER_CE)
220     static bool resource_unzipped = false;
221     if (!resource_unzipped)
222     {
223         resource_unzipped = true;
224         paint_manager_.SetResourceZip(GlobalVariable::kResourceSkinZipFileName);
225         paint_manager_.UnzipResource();
226         paint_manager_.SetResourceZip(GlobalVariable::kNullString);
227     }
228     tString tstrSkin = paint_manager_.GetResourcePath();
229     tstrSkin += GetSkinFile();
230 #else
231     paint_manager_.SetResourceZip(GlobalVariable::kResourceSkinZipFileName);
232     tString tstrSkin = GetSkinFile();
233 #endif
234  
235 #else
236     tString tstrSkin = paint_manager_.GetResourcePath();
237     tstrSkin += GetSkinFile();
238 #endif
239     CControlUI* pRoot = builder.Create(tstrSkin.c_str(), (UINT)0, this, &paint_manager_);
240     paint_manager_.AttachDialog(pRoot);
241     paint_manager_.AddNotifier(this);
242 #endif
243  
244     Init();
245     return 0;
246 }
247  
248 LRESULT WindowImplBase::HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
249 {
250     bHandled = FALSE;
251     return 0;
252 }
253  
254 LRESULT WindowImplBase::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
255 {
256     LRESULT lRes = 0;
257     BOOL bHandled = TRUE;
258     switch (uMsg)
259     {
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;
270 #endif
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;
282     }
283     if (bHandled) return lRes;
284  
285     lRes = HandleCustomMessage(uMsg, wParam, lParam, bHandled);
286     if (bHandled) return lRes;
287  
288     if (paint_manager_.MessageHandler(uMsg, wParam, lParam, lRes)) return lRes;
289     return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
290 }
291  
292 LRESULT WindowImplBase::MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled)
293 {
294     if (uMsg == WM_KEYDOWN)
295     {
296         switch (wParam)
297         {
298         case VK_RETURN:
299         case VK_ESCAPE:
300             return ResponseDefaultKeyEvent(wParam, bHandled);
301         default:
302             break;
303         }
304     }
305     return FALSE;
306 }
307  
308 LRESULT WindowImplBase::ResponseDefaultKeyEvent(WPARAM wParam, bool& bHandled)
309 {
310     if (wParam == VK_RETURN)
311     {
312         return FALSE;
313     }
314     else if (wParam == VK_ESCAPE)
315     {
316         Close();
317         return TRUE;
318     }
319  
320     return FALSE;
321 }

原文转载自::http://www.360doc.com/userhome/7023119

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值