123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498 |
- #ifndef WIN_IMPL_BASE_HPP
- #define WIN_IMPL_BASE_HPP
- #include "stdafx.h"
- //add by Hong;
- #include <typeinfo>
- #include <atlbase.h>
- namespace DuiLib
- {
- //////////////////////////////////////////////////////////////////////////
- LPBYTE WindowImplBase::m_lpResourceZIPBuffer = NULL;
- DUI_BEGIN_MESSAGE_MAP (WindowImplBase, CNotifyPump)
- DUI_ON_MSGTYPE (DUI_MSGTYPE_CLICK, OnClick)
- DUI_END_MESSAGE_MAP ()
- WindowImplBase::WindowImplBase ()
- {
- }
- void WindowImplBase::OnFinalMessage (HWND hWnd)
- {
- m_PaintManager.RemovePreMessageFilter (this);
- m_PaintManager.RemoveNotifier (this);
- m_PaintManager.ReapObjects (m_PaintManager.GetRoot ());
- }
- LPCTSTR WindowImplBase::GetWindowClassName () const
- {
- static wchar_t wszWndClassName[MAX_PATH] = {0};
- _tcscpy (wszWndClassName, _tcsspnp (CA2W (typeid(*this).name ()), L"class "));
- return wszWndClassName;
- }
- UINT WindowImplBase::DoModal (HWND hParent)
- {
- Create(hParent, GetWindowClassName(), WS_POPUP, 0);
- CenterWindow ();
- return ShowModal();
- }
- LRESULT WindowImplBase::ResponseDefaultKeyEvent (WPARAM wParam)
- {
- if(wParam == VK_RETURN)
- {
- return FALSE;
- }
- else if(wParam == VK_ESCAPE)
- {
- //Close ();
- return TRUE;
- }
- return FALSE;
- }
- UINT WindowImplBase::GetClassStyle () const
- {
- return CS_DBLCLKS;
- }
- UILIB_RESOURCETYPE WindowImplBase::GetResourceType () const
- {
- return UILIB_FILE;
- }
- CDuiString WindowImplBase::GetZIPFileName () const
- {
- return _T ("");
- }
- LPCTSTR WindowImplBase::GetResourceID () const
- {
- return _T ("");
- }
- CControlUI* WindowImplBase::CreateControl (LPCTSTR pstrClass)
- {
- return NULL;
- }
- LRESULT WindowImplBase::MessageHandler (UINT uMsg, WPARAM wParam, LPARAM /*lParam*/, bool& /*bHandled*/)
- {
- if(uMsg == WM_KEYDOWN)
- {
- switch(wParam)
- {
- case VK_RETURN:
- case VK_ESCAPE:
- return ResponseDefaultKeyEvent (wParam);
- default:
- break;
- }
- }
- return FALSE;
- }
- LRESULT WindowImplBase::OnClose (UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
- {
- bHandled = FALSE;
- return 0;
- }
- LRESULT WindowImplBase::OnDestroy (UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
- {
- bHandled = FALSE;
- return 0;
- }
- #if defined(WIN32) && !defined(UNDER_CE)
- LRESULT WindowImplBase::OnNcActivate (UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
- {
- if(::IsIconic (*this)) bHandled = FALSE;
- return (wParam == 0) ? TRUE : FALSE;
- }
- LRESULT WindowImplBase::OnNcCalcSize (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- LPRECT pRect = NULL;
- if(wParam == TRUE)
- {
- LPNCCALCSIZE_PARAMS pParam = (LPNCCALCSIZE_PARAMS)lParam;
- pRect = &pParam->rgrc[0];
- }
- else
- {
- pRect = (LPRECT)lParam;
- }
- if(::IsZoomed (m_hWnd))
- { // 最大化时,计算当前显示器最适合宽高度
- MONITORINFO oMonitor = {};
- oMonitor.cbSize = sizeof (oMonitor);
- ::GetMonitorInfo (::MonitorFromWindow (*this, MONITOR_DEFAULTTONEAREST), &oMonitor);
- CDuiRect rcWork = oMonitor.rcWork;
- CDuiRect rcMonitor = oMonitor.rcMonitor;
- rcWork.Offset (-oMonitor.rcMonitor.left, -oMonitor.rcMonitor.top);
- pRect->right = pRect->left + rcWork.GetWidth ();
- pRect->bottom = pRect->top + rcWork.GetHeight ();
- return WVR_REDRAW;
- }
- return 0;
- }
- LRESULT WindowImplBase::OnNcPaint (UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
- {
- return 0;
- }
- LRESULT WindowImplBase::OnNcHitTest (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- POINT pt; pt.x = GET_X_LPARAM (lParam); pt.y = GET_Y_LPARAM (lParam);
- ::ScreenToClient (*this, &pt);
- RECT rcClient;
- ::GetClientRect (*this, &rcClient);
- if(!::IsZoomed (*this))
- {
- RECT rcSizeBox = m_PaintManager.GetSizeBox ();
- if(pt.y < rcClient.top + rcSizeBox.top)
- {
- if(pt.x < rcClient.left + rcSizeBox.left) return HTTOPLEFT;
- if(pt.x > rcClient.right - rcSizeBox.right) return HTTOPRIGHT;
- return HTTOP;
- }
- else if(pt.y > rcClient.bottom - rcSizeBox.bottom)
- {
- if(pt.x < rcClient.left + rcSizeBox.left) return HTBOTTOMLEFT;
- if(pt.x > rcClient.right - rcSizeBox.right) return HTBOTTOMRIGHT;
- return HTBOTTOM;
- }
- if(pt.x < rcClient.left + rcSizeBox.left) return HTLEFT;
- if(pt.x > rcClient.right - rcSizeBox.right) return HTRIGHT;
- }
- RECT rcCaption = m_PaintManager.GetCaptionRect ();
- if(pt.x >= rcClient.left + rcCaption.left && pt.x < rcClient.right - rcCaption.right \
- && pt.y >= rcCaption.top && pt.y < rcCaption.bottom)
- {
- CControlUI* pControl = static_cast<CControlUI*>(m_PaintManager.FindControl (pt));
- if(pControl && _tcsicmp (pControl->GetClass (), _T ("ButtonUI")) != 0 &&
- _tcsicmp (pControl->GetClass (), _T ("OptionUI")) != 0 &&
- _tcsicmp (pControl->GetClass (), _T ("TextUI")) != 0)
- return HTCAPTION;
- }
- return HTCLIENT;
- }
- LRESULT WindowImplBase::OnGetMinMaxInfo (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- LPMINMAXINFO lpMMI = (LPMINMAXINFO)lParam;
- MONITORINFO oMonitor = {};
- oMonitor.cbSize = sizeof (oMonitor);
- ::GetMonitorInfo (::MonitorFromWindow (*this, MONITOR_DEFAULTTONEAREST), &oMonitor);
- CDuiRect rcWork = oMonitor.rcWork;
- CDuiRect rcMonitor = oMonitor.rcMonitor;
- rcWork.Offset (-oMonitor.rcMonitor.left, -oMonitor.rcMonitor.top);
- // 计算最大化时,正确的原点坐标
- lpMMI->ptMaxPosition.x = rcWork.left;
- lpMMI->ptMaxPosition.y = rcWork.top;
- lpMMI->ptMaxTrackSize.x = rcWork.GetWidth ();
- lpMMI->ptMaxTrackSize.y = rcWork.GetHeight ();
- lpMMI->ptMinTrackSize.x = m_PaintManager.GetMinInfo ().cx;
- lpMMI->ptMinTrackSize.y = m_PaintManager.GetMinInfo ().cy;
- bHandled = FALSE;
- return 0;
- }
- LRESULT WindowImplBase::OnMouseWheel (UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
- {
- bHandled = FALSE;
- return 0;
- }
- LRESULT WindowImplBase::OnMouseHover (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- bHandled = FALSE;
- return 0;
- }
- #endif
- LRESULT WindowImplBase::OnSize (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- SIZE szRoundCorner = m_PaintManager.GetRoundCorner ();
- #if defined(WIN32) && !defined(UNDER_CE)
- if(!::IsIconic (*this) && (szRoundCorner.cx != 0 || szRoundCorner.cy != 0))
- {
- CDuiRect rcWnd;
- ::GetWindowRect (*this, &rcWnd);
- rcWnd.Offset (-rcWnd.left, -rcWnd.top);
- rcWnd.right++; rcWnd.bottom++;
- HRGN hRgn = ::CreateRoundRectRgn (rcWnd.left, rcWnd.top, rcWnd.right, rcWnd.bottom, szRoundCorner.cx, szRoundCorner.cy);
- ::SetWindowRgn (*this, hRgn, TRUE);
- ::DeleteObject (hRgn);
- }
- #endif
- bHandled = FALSE;
- return 0;
- }
- LRESULT WindowImplBase::OnChar (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- bHandled = FALSE;
- return 0;
- }
- LRESULT WindowImplBase::OnSysCommand (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- if(wParam == SC_CLOSE)
- {
- bHandled = TRUE;
- PostMessage (WM_CLOSE);
- return 0;
- }
- #if defined(WIN32) && !defined(UNDER_CE)
- BOOL bZoomed = ::IsZoomed (*this);
- LRESULT lRes = CWindowWnd::HandleMessage (uMsg, wParam, lParam);
- if(::IsZoomed (*this) != bZoomed)
- {
- CControlUI* pbtnMax = static_cast<CControlUI*>(m_PaintManager.FindControl (_T ("maxbtn"))); // max button
- CControlUI* pbtnRestore = static_cast<CControlUI*>(m_PaintManager.FindControl (_T ("restorebtn"))); // restore button
- // toggle status of max and restore button
- if(pbtnMax && pbtnRestore)
- {
- pbtnMax->SetVisible (TRUE == bZoomed);
- pbtnRestore->SetVisible (FALSE == bZoomed);
- }
- }
- #else
- LRESULT lRes = CWindowWnd::HandleMessage(uMsg, wParam, lParam);
- #endif
- return lRes;
- }
- LRESULT WindowImplBase::OnCreate (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- LONG styleValue = ::GetWindowLong (*this, GWL_STYLE);
- styleValue &= ~WS_CAPTION;
- ::SetWindowLong (*this, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
- RECT rcClient;
- ::GetClientRect (*this, &rcClient);
- ::SetWindowPos (*this, NULL, rcClient.left, rcClient.top, rcClient.right - rcClient.left, \
- rcClient.bottom - rcClient.top, SWP_FRAMECHANGED);
- m_PaintManager.Init (m_hWnd);
- m_PaintManager.AddPreMessageFilter (this);
- CDialogBuilder builder;
- CDuiString strResourcePath = m_PaintManager.GetResourcePath ();
- if(strResourcePath.IsEmpty ())
- {
- strResourcePath = m_PaintManager.GetInstancePath ();
- strResourcePath += GetSkinFolder ().GetData ();
- }
- m_PaintManager.SetResourcePath (strResourcePath.GetData ());
- auto ty = GetResourceType ();
- switch(GetResourceType ())
- {
- case UILIB_ZIP:
- m_PaintManager.SetResourceZip (GetZIPFileName ().GetData (), true);
- break;
- case UILIB_ZIPRESOURCE:
- {
- HRSRC hResource = ::FindResource (m_PaintManager.GetResourceDll (), GetResourceID (), _T ("ZIPRES"));
- if(hResource == NULL)
- return 0L;
- DWORD dwSize = 0;
- HGLOBAL hGlobal = ::LoadResource (m_PaintManager.GetResourceDll (), hResource);
- if(hGlobal == NULL)
- {
- #if defined(WIN32) && !defined(UNDER_CE)
- ::FreeResource (hResource);
- #endif
- return 0L;
- }
- dwSize = ::SizeofResource (m_PaintManager.GetResourceDll (), hResource);
- if(dwSize == 0)
- return 0L;
- m_lpResourceZIPBuffer = new BYTE[dwSize];
- if(m_lpResourceZIPBuffer != NULL)
- {
- ::CopyMemory (m_lpResourceZIPBuffer, (LPBYTE)::LockResource (hGlobal), dwSize);
- }
- #if defined(WIN32) && !defined(UNDER_CE)
- ::FreeResource (hResource);
- #endif
- m_PaintManager.SetResourceZip (m_lpResourceZIPBuffer, dwSize);
- }
- break;
- }
- CControlUI* pRoot = NULL;
- if(GetResourceType () == UILIB_RESOURCE)
- {
- STRINGorID xml (_ttoi (GetSkinFile ().GetData ()));
- pRoot = builder.Create (xml, _T ("xml"), this, &m_PaintManager);
- }
- else
- {
- auto str = GetSkinFile ().GetData ();
- pRoot = builder.Create (GetSkinFile ().GetData (), (UINT)0, this, &m_PaintManager);
- }
- ASSERT (pRoot);
- if(pRoot == NULL)
- {
- MessageBox (NULL, _T ("加载资源文件失败"), _T ("Duilib"), MB_OK | MB_ICONERROR);
- ExitProcess (1);
- return 0;
- }
- m_PaintManager.AttachDialog (pRoot);
- m_PaintManager.AddNotifier (this);
- InitWindow ();
- return 0;
- }
- LRESULT WindowImplBase::OnKeyDown (UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
- {
- bHandled = FALSE;
- return 0;
- }
- LRESULT WindowImplBase::OnKillFocus (UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
- {
- bHandled = FALSE;
- return 0;
- }
- LRESULT WindowImplBase::OnSetFocus (UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
- {
- bHandled = FALSE;
- return 0;
- }
- LRESULT WindowImplBase::OnLButtonDown (UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
- {
- bHandled = FALSE;
- return 0;
- }
- LRESULT WindowImplBase::OnLButtonUp (UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
- {
- bHandled = FALSE;
- return 0;
- }
- LRESULT WindowImplBase::OnMouseMove (UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
- {
- bHandled = FALSE;
- return 0;
- }
- LRESULT WindowImplBase::HandleMessage (UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- LRESULT lRes = 0;
- BOOL bHandled = TRUE;
- switch(uMsg)
- {
- case WM_CREATE: lRes = OnCreate (uMsg, wParam, lParam, bHandled); break;
- case WM_CLOSE: lRes = OnClose (uMsg, wParam, lParam, bHandled); break;
- case WM_DESTROY: lRes = OnDestroy (uMsg, wParam, lParam, bHandled); break;
- #if defined(WIN32) && !defined(UNDER_CE)
- case WM_NCACTIVATE: lRes = OnNcActivate (uMsg, wParam, lParam, bHandled); break;
- case WM_NCCALCSIZE: lRes = OnNcCalcSize (uMsg, wParam, lParam, bHandled); break;
- case WM_NCPAINT: lRes = OnNcPaint (uMsg, wParam, lParam, bHandled); break;
- case WM_NCHITTEST: lRes = OnNcHitTest (uMsg, wParam, lParam, bHandled); break;
- case WM_GETMINMAXINFO: lRes = OnGetMinMaxInfo (uMsg, wParam, lParam, bHandled); break;
- case WM_MOUSEWHEEL: lRes = OnMouseWheel (uMsg, wParam, lParam, bHandled); break;
- #endif
- case WM_SIZE: lRes = OnSize (uMsg, wParam, lParam, bHandled); break;
- case WM_CHAR: lRes = OnChar (uMsg, wParam, lParam, bHandled); break;
- case WM_SYSCOMMAND: lRes = OnSysCommand (uMsg, wParam, lParam, bHandled); break;
- case WM_KEYDOWN: lRes = OnKeyDown (uMsg, wParam, lParam, bHandled); break;
- case WM_KILLFOCUS: lRes = OnKillFocus (uMsg, wParam, lParam, bHandled); break;
- case WM_SETFOCUS: lRes = OnSetFocus (uMsg, wParam, lParam, bHandled); break;
- case WM_LBUTTONUP: lRes = OnLButtonUp (uMsg, wParam, lParam, bHandled); break;
- case WM_LBUTTONDOWN: lRes = OnLButtonDown (uMsg, wParam, lParam, bHandled); break;
- case WM_MOUSEMOVE: lRes = OnMouseMove (uMsg, wParam, lParam, bHandled); break;
- case WM_MOUSEHOVER: lRes = OnMouseHover (uMsg, wParam, lParam, bHandled); break;
- default: bHandled = FALSE; break;
- }
- if(bHandled) return lRes;
- lRes = HandleCustomMessage (uMsg, wParam, lParam, bHandled);
- if(bHandled) return lRes;
- if(m_PaintManager.MessageHandler (uMsg, wParam, lParam, lRes))
- return lRes;
- return CWindowWnd::HandleMessage (uMsg, wParam, lParam);
- }
- LRESULT WindowImplBase::HandleCustomMessage (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- bHandled = FALSE;
- return 0;
- }
- LONG WindowImplBase::GetStyle ()
- {
- LONG styleValue = ::GetWindowLong (*this, GWL_STYLE);
- styleValue &= ~WS_CAPTION;
- return styleValue;
- }
- void WindowImplBase::OnClick (TNotifyUI& msg)
- {
- CDuiString sCtrlName = msg.pSender->GetName ();
- if(sCtrlName == _T ("closebtn"))
- {
- Close ();
- return;
- }
- else if(sCtrlName == _T ("minbtn"))
- {
- SendMessage (WM_SYSCOMMAND, SC_MINIMIZE, 0);
- return;
- }
- else if(sCtrlName == _T ("maxbtn"))
- {
- SendMessage (WM_SYSCOMMAND, SC_MAXIMIZE, 0);
- return;
- }
- else if(sCtrlName == _T ("restorebtn"))
- {
- SendMessage (WM_SYSCOMMAND, SC_RESTORE, 0);
- return;
- }
- return;
- }
- void WindowImplBase::Notify (TNotifyUI& msg)
- {
- return CNotifyPump::NotifyPump (msg);
- }
- }
|