• DuiLib通用窗口类WindowImplBase封装


    .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:
        CPaintManagerUI        paint_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;
    }
    #endif
    
    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::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);
        }
    #endif
        bHandled = 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 ){
        }
    #else
        LRESULT lRes = CWindowWnd::HandleMessage(uMsg, wParam, lParam);
    #endif
        return 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();
    #else
        paint_manager_.SetResourceZip(GlobalVariable::kResourceSkinZipFileName);
        tString tstrSkin = GetSkinFile();
    #endif
    
    #else
        tString tstrSkin = paint_manager_.GetResourcePath();
        tstrSkin += GetSkinFile();
    #endif
        CControlUI* pRoot = builder.Create(tstrSkin.c_str(), (UINT)0, this, &paint_manager_);
        paint_manager_.AttachDialog(pRoot);
        paint_manager_.AddNotifier(this);
    #endif
    
        Init();
        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;
    #endif
        case 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;
    }
  • 相关阅读:
    RabbitMQ和Kafka的区别
    如何在 Vim 中复制,剪切,粘贴
    python中的堆支持自定义的比较函数
    LLDP协议(笔记草稿)
    You may have an infinite update loop in a component render function,vue模板报错
    修改element ui样式,el-dialog__header样式,并且不影响全局
    js,小数字符串去除右边零显示
    egg-sequelize创建表
    Cyclic dependency found. Users is dependent of itself,mysql表循环依赖问题
    eggjs sequelize操作多个数据,表名不加s,不默认加创建和修改时间字段
  • 原文地址:https://www.cnblogs.com/MrYuan/p/4972041.html
Copyright © 2020-2023  润新知