您当前的位置: 首页 >  ui

插件开发

暂无认证

  • 2浏览

    0关注

    492博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

第一章 第五小节Duilib的CPaintManagerUI类(一)

插件开发 发布时间:2022-03-23 12:39:34 ,浏览量:2

文章目录
    • 1.CPaintManagerUI类
    • 2.作者答疑

1.CPaintManagerUI类

  如果读者从网上复制过代码,然后生成过项目,就是一定首当其冲的面对过这个类,这个类是WindowImplBase基类的一个成员变量,如下所示:

        CPaintManagerUI m_pm;

  所以每一个继承至WindowImplBase基类的窗口对象,都有一个单独的CPaintManagerUI成员,从字面意思就很清楚,这是一个与绘制息息相关的类。接着查看下它的源代码。它的源代码比较多,先将其中一部分列出,如下所示:

class UILIB_API CPaintManagerUI : public CIDropTarget
    {
    public:
        CPaintManagerUI();
        ~CPaintManagerUI();
    public:
        void Init(HWND hWnd, LPCTSTR pstrName = NULL);
......
        void Invalidate();
        void Invalidate(RECT& rcItem);
......
    private:
        CDuiString m_sName;
        HWND m_hWndPaint;    //所附加的窗体的句柄
        HDC m_hDcPaint;
        HDC m_hDcOffscreen;
        HDC m_hDcBackground;
        HBITMAP m_hbmpOffscreen;
        BYTE* m_pOffscreenBits;
        HBITMAP m_hbmpBackground;
        COLORREF* m_pBackgroundBits;
......
        //
        CControlUI* m_pRoot;
        CControlUI* m_pFocus;
        CControlUI* m_pEventHover;
        CControlUI* m_pEventClick;
        CControlUI* m_pEventKey;
        CControlUI* m_pLastToolTip;
......
        bool m_bMouseTracking;
        bool m_bMouseCapture;
        bool m_bIsPainting;
        bool m_bUsedVirtualWnd;
        bool m_bAsyncNotifyPosted;
        //
        CStdPtrArray m_aNotifiers;
        CStdPtrArray m_aTimers;
        CStdPtrArray m_aTranslateAccelerator;
        CStdPtrArray m_aPreMessageFilters;
        CStdPtrArray m_aMessageFilters;
        CStdPtrArray m_aPostPaintControls;
        CStdPtrArray m_aNativeWindow;
        CStdPtrArray m_aNativeWindowControl;
        CStdPtrArray m_aDelayedCleanup;
        CStdPtrArray m_aAsyncNotify;
        CStdPtrArray m_aFoundControls;
        CStdPtrArray m_aFonts;
        CStdPtrArray m_aNeedMouseLeaveNeeded;
        CStdStringPtrMap m_mNameHash;
        CStdStringPtrMap m_mWindowCustomAttrHash;
        CStdStringPtrMap m_mOptionGroup;
......
        // 拖拽
        bool m_bDragMode;
        HBITMAP m_hDragBitmap;
        //
        static HINSTANCE m_hInstance;
        static HINSTANCE m_hResourceInstance;
        static CDuiString m_pStrResourcePath;
        static CDuiString m_pStrResourceZip;
        static CDuiString m_pStrResourceZipPwd;
        static HANDLE m_hResourceZip;
        static bool m_bCachedResourceZip;
        static int m_nResType;
        static TResInfo m_SharedResInfo;
        static bool m_bUseHSL;
        static short m_H;
        static short m_S;
        static short m_L;
        static CStdPtrArray m_aPreMessages;
        static CStdPtrArray m_aPlugins;
    };

  从以上代码中,可以得知它继承至CIDropTarget。一个拖拽对象,它支持拖拽的基本功能,比如文件拖拽至窗口。窗口在这个过程中的接口处理。采用RegisterDragDrop函数就可以将窗口注册为drop目标。   这部分最大的功能还是处理窗口的绘制。首先是所有绘制的共享信息,即类的静态成员变量,m_hInstance:模块的实例句柄,m_pStrResourcePath:资源的路径,ZIP压缩资源,m_nResType:资源类型。回到WindowImplBase基类里,查看消息处理函数,如下所示:

    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;
		//进入CPaintManagerUI的消息处理
        if (m_pm.MessageHandler(uMsg, wParam, lParam, lRes))
            return lRes;
        return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
    }

  在窗口基类里,调用了成员m_pm的消息处理。

2.作者答疑

  如有疑问,请留言。

关注
打赏
1665481431
查看更多评论
立即登录/注册

微信扫码登录

0.0405s