DuiLib通用窗口类WindowImplBase封装

来源:互联网 发布:如何让增加淘宝流量 编辑:程序博客网 时间:2024/04/28 20:55

.h头文件

class WindowImplBase : public CWindowWnd, public INotifyUI, public IMessageFilterUI, public IDialogBuilderCallback, public SkinChangedReceiver{public:WindowImplBase();virtual ~WindowImplBase();virtual void OnFinalMessage(HWND hWnd);virtual void Init();virtual CControlUI* CreateControl(LPCTSTR pstrClass);virtual LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled);virtual LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);virtual LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);virtual LRESULT OnNcActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);virtual LRESULT OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);virtual LRESULT OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);virtual LRESULT OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);virtual LRESULT OnGetMinMaxInfo(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);virtual LRESULT OnMouseWheel(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);virtual LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);virtual LRESULT OnMoving(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);virtual LRESULT OnSysCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);virtual LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);virtual LRESULT OnKeyDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);virtual LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);virtual LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);virtual LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);virtual LRESULT OnNCLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);virtual LRESULT OnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);virtual LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);virtual LRESULT HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);protected:virtual tString GetSkinFolder();virtual tString GetSkinFile() = 0;virtual LRESULT ResponseDefaultKeyEvent(WPARAM wParam, bool& bHandled);protected:CPaintManagerUIpaint_manager_;};


.CPP头文件


WindowImplBase::WindowImplBase(){}WindowImplBase::~WindowImplBase(){}CControlUI* WindowImplBase::CreateControl(LPCTSTR pstrClass){return NULL;}void WindowImplBase::OnFinalMessage(HWND /*hWnd*/){paint_manager_.RemovePreMessageFilter(this);paint_manager_.RemoveNotifier(this);paint_manager_.ReapObjects(paint_manager_.GetRoot());}void WindowImplBase::Init(){}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*/){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 = paint_manager_.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 = paint_manager_.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*>(paint_manager_.FindControl(pt));if( pControl && _tcsicmp(pControl->GetClass(), _T("ButtonUI")) != 0 && _tcsicmp(pControl->GetClass(), _T("OptionUI")) != 0 )return HTCAPTION;}return HTCLIENT;}LRESULT WindowImplBase::OnGetMinMaxInfo(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled){MONITORINFO oMonitor = {};oMonitor.cbSize = sizeof(oMonitor);::GetMonitorInfo(::MonitorFromWindow(*this, MONITOR_DEFAULTTOPRIMARY), &oMonitor);CRect rcWork = oMonitor.rcWork;rcWork.Offset(-rcWork.left, -rcWork.top);LPMINMAXINFO lpMMI = (LPMINMAXINFO) lParam;lpMMI->ptMaxPosition.x= rcWork.left;lpMMI->ptMaxPosition.y= rcWork.top;lpMMI->ptMaxSize.x= rcWork.right;lpMMI->ptMaxSize.y= rcWork.bottom;bHandled = FALSE;return 0;}LRESULT WindowImplBase::OnMouseWheel(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled){bHandled = FALSE;return 0;}#endifLRESULT 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::OnNCLButtonDown(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::OnLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled){bHandled = FALSE;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::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled){SIZE szRoundCorner = paint_manager_.GetRoundCorner();#if defined(WIN32) && !defined(UNDER_CE)if( !::IsIconic(*this) && (szRoundCorner.cx != 0 || szRoundCorner.cy != 0) ) {CRect 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);}#endifbHandled = FALSE;return 0;}LRESULT WindowImplBase::OnMoving(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;return 0;}#if defined(WIN32) && !defined(UNDER_CE)BOOL bZoomed = ::IsZoomed(*this);LRESULT lRes = CWindowWnd::HandleMessage(uMsg, wParam, lParam);if( ::IsZoomed(*this) != bZoomed ){}#elseLRESULT lRes = CWindowWnd::HandleMessage(uMsg, wParam, lParam);#endifreturn lRes;}tString WindowImplBase::GetSkinFolder(){return tString(CPaintManagerUI::GetInstancePath()) + _T("Skins\\");}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);paint_manager_.Init(m_hWnd);paint_manager_.AddPreMessageFilter(this);CDialogBuilder builder;paint_manager_.SetResourcePath(GetSkinFolder().c_str());#if USE(ZIP_SKIN)#if defined(WIN32) && !defined(UNDER_CE)static bool resource_unzipped = false;if (!resource_unzipped){resource_unzipped = true;paint_manager_.SetResourceZip(GlobalVariable::kResourceSkinZipFileName);paint_manager_.UnzipResource();paint_manager_.SetResourceZip(GlobalVariable::kNullString);}tString tstrSkin = paint_manager_.GetResourcePath();tstrSkin += GetSkinFile();#elsepaint_manager_.SetResourceZip(GlobalVariable::kResourceSkinZipFileName);tString tstrSkin = GetSkinFile();#endif#elsetString tstrSkin = paint_manager_.GetResourcePath();tstrSkin += GetSkinFile();#endifCControlUI* pRoot = builder.Create(tstrSkin.c_str(), (UINT)0, this, &paint_manager_);paint_manager_.AttachDialog(pRoot);paint_manager_.AddNotifier(this);#endifInit();return 0;}LRESULT WindowImplBase::HandleCustomMessage(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;#endifcase WM_SIZE:lRes = OnSize(uMsg, wParam, lParam, bHandled); break;case WM_MOVING:lRes = OnMoving(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_NCLBUTTONDOWN:lRes = OnNCLButtonDown(uMsg, wParam, lParam, bHandled); break;default:bHandled = FALSE; break;}if (bHandled) return lRes;lRes = HandleCustomMessage(uMsg, wParam, lParam, bHandled);if (bHandled) return lRes;if (paint_manager_.MessageHandler(uMsg, wParam, lParam, lRes)) return lRes;return CWindowWnd::HandleMessage(uMsg, wParam, lParam);}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, bHandled);default:break;}}return FALSE;}LRESULT WindowImplBase::ResponseDefaultKeyEvent(WPARAM wParam, bool& bHandled){if (wParam == VK_RETURN){return FALSE;}else if (wParam == VK_ESCAPE){Close();return TRUE;}return FALSE;}



0 0